android:图片:用matisse作为图片选择器:使支持拍照

一,配置

在AndroidManifest.xml中添加FileProvider,如下:

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.okdemo1.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public"></meta-data>
        </provider>

如图:

java

package com.example.okdemo1.activity;

import android.Manifest;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.okdemo1.MainActivity;
import com.example.okdemo1.R;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.engine.impl.GlideEngine;
import com.zhihu.matisse.internal.entity.CaptureStrategy;

import java.io.File;
import java.util.List;

public class ImagePickActivity extends AppCompatActivity {
    private static final int CAMERA_PERMISSION_REQUEST_CODE = 101;
    private static final int STORAGE_PERMISSION_CODE = 102;
    private static final int REQUEST_CODE_CHOOSE = 23;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_image_pick);

        //返回结果的view
        textView = findViewById(R.id.resultText);

        //给按钮增加点击事件
        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //请求权限
                askCameraPermission();
            }
        });
    }


    //请求相机权限,如果已有权限则打开相机
    private void askCameraPermission(){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 如果没有获得相机权限,就请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
        } else {
            // 已经获得相机权限,检查存储权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
            } else {
                // 已经获得相机和存储权限,选择文件
                //选择文件
                Matisse.from(ImagePickActivity.this)
                        .choose(MimeType.of(MimeType.JPEG, MimeType.WEBP, MimeType.PNG, MimeType.GIF))//图片类型
                        .countable(true)//true:选中后显示数字;false:选中后显示对号
                        .maxSelectable(5)//可选的最大数
                        .capture(true)//选择照片时,是否显示拍照
                        .captureStrategy(new CaptureStrategy(true, "com.example.okdemo1.fileprovider"))//参数1 true表示拍照存储在共有目录,false表示存储在私有目录;参数2与 AndroidManifest中authorities值相同,用于适配7.0系统 必须设置
                        .imageEngine(new GlideEngine())//图片加载引擎
                        .forResult(REQUEST_CODE_CHOOSE);//
            }
        }
    }

    //选择图片或拍照完成的回调
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("执行到了onActivityResult:");
        if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {

            List<String> paths = Matisse.obtainPathResult(data);
            for (int i = 0; i < paths.size(); i++) {
                String onePath = paths.get(i);
                System.out.println("path = " + onePath);
            }

        }
    }

}

说明:   如果有拍照的结果,请使用: List<String> paths = Matisse.obtainPathResult(data)获取图片路径

            List<String> paths = Matisse.obtainPathResult(data);
         不要使用List<Uri> result = Matisse.obtainResult(data);
         获取文件路径时会报错:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=23, result=-1, data=Intent 
{ (has extras) }} to activity {com.example.okdemo1/com.example.okdemo1.activity.ImagePickActivity}: 
java.lang.IllegalArgumentException: column '_data' does not exist. Available columns: []

二,测试效果

posted @ 2025-06-07 10:50  刘宏缔的架构森林  阅读(46)  评论(0)    收藏  举报