美文网首页
Android 调用本地相机相册,获取图片路径

Android 调用本地相机相册,获取图片路径

作者: 念雅_a9ef | 来源:发表于2020-03-23 16:22 被阅读0次

自己用过很多次,却没有写过,至今仍有一个10.0ImageVew图片没展示出来,但是在7.0的模拟机上是可以拿到的,如果不纠结显示,路径是都拿到了的。

build.grale中引入库

implementation 'com.github.bumptech.glide:glide:4.8.0'   //glide 图片加载
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
implementation 'pub.devrel:easypermissions:1.3.0'    //动态权限申请库

在AndroidManifest中添加权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CAMERA" />

在AndroidManifest中 ,7.0后FileProvider的使用 (authorities 传包名)

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

在res文件夹下建一个provider_paths.xml文件

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>

在MainActivity中

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ImageView ivTest;
private Button btnOpenAlbum;
private Button btnOpenCamera;
private String photoPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnOpenCamera = findViewById(R.id.btn_open_camera);
    btnOpenAlbum = findViewById(R.id.btn_open_album);
    ivTest = findViewById(R.id.iv_show);
    btnOpenCamera.setOnClickListener(this);
    btnOpenAlbum.setOnClickListener(this);
    getPermission();
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_open_camera:
            goCamera();
            break;
        case R.id.btn_open_album:
            goPhotoAlbum();
            break;
    }
}

private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};

//获取权限
private void getPermission() {
    if (EasyPermissions.hasPermissions(this, permissions)) {
        //已经打开权限
        Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show();
    } else {
        //没有打开相关权限、申请权限
        EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions);
    }
}

//激活相册操作
private void goPhotoAlbum() {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 2);
}

private File cameraSavePath;//拍照照片路径
private Uri uri;//照片uri
//激活相机操作
private void goCamera() {
    cameraSavePath = new File(Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg");
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        //第二个参数为 包名.fileprovider
        uri = FileProvider.getUriForFile(MainActivity.this,
                "com.example.myapplication.fileprovider", cameraSavePath);//这里传你应用的包名
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    } else {
        uri = Uri.fromFile(cameraSavePath);
    }
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    MainActivity.this.startActivityForResult(intent, 1);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    //框架要求必须这么写
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Toast.makeText(this, "请求成功", Toast.LENGTH_LONG);
        switch (requestCode) {
            case 1:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    photoPath = String.valueOf(cameraSavePath);
                } else {
                    photoPath = uri.getEncodedPath();
                }
                Log.d("====", "拍照返回图片路径:" + photoPath);
                Glide.with(MainActivity.this).load(photoPath).into(ivTest);
                break;
            case 2:
                photoPath = getPhotoFromPhotoAlbum.getRealPathFromUri(this, data.getData());
                Log.d("====", "相册返回图片路径photoPath:" + photoPath);

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;
                Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
                ivTest.setImageBitmap(bitmap);
                Glide.with(this).load(photoPath).into(ivTest);
                break;
        }
    }
}}

相关文章

网友评论

      本文标题:Android 调用本地相机相册,获取图片路径

      本文链接:https://www.haomeiwen.com/subject/fyvwyhtx.html