Android7.0 使用系统相册打开指定图片

Android N 后的Uri 权限变化 官网介绍

7.0后使用Uri 三步走:

在AndroidManifest.xml中加上

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.mydomain.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_provider_paths" />
provider>
Generatin

在res/xml 文件中创建file_provider_paths.xml 文件

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
paths>

name为标识,file-path 表示前缀路径,path接着file-path 的路径

内部的element可以是files-path,cache-path,external-path,external-files-path,external-cache-path
分别对应Context.getFilesDir(),Context.getCacheDir(),Environment.getExternalStorageDirectory(),Context.getExternalFilesDir(),Context.getExternalCacheDir()等几个方法

使用Uri

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

以上是百度查的资料

使用中遇到的问题又查了官网:

  • 加上provider 时不能build;需要在provider的meta-data中加上tools:replace="android:resource",顶部加上xmlns:tools="http://schemas.android.com/tools"
<provider
       android:name="android.support.v4.content.FileProvider"
       android:authorities="com.shen.snote.fileprovider"
       android:exported="false"
       android:grantUriPermissions="true">
       <meta-data
           tools:replace="android:resource"
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_provider_paths" />
provider>
  • 使用Uri时 日志显示权限拒绝,需要在使用时添加代码intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//打开指定的一张照片
 Intent intent = new Intent();
 intent.setAction(android.content.Intent.ACTION_VIEW);
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.setDataAndType(uriForFile, "image/*");
 startActivity(intent);

你可能感兴趣的:(android)