记上架GooglePlay提升targetSdkVersion导致的适配问题

升了targetSdkVersion,出现了一些适配的问题,还有权限的问题,实在是不想升,但是没办法Google爸爸要求必须要升,硬着头皮上了。

我主要是面临两个方面的问题:
(1)权限的动态申请
(2)应用升级、拍照获取图片异常(这两个是同一个问题)

对于权限问题,相对来说还是比较简单的,我是采用了RxPermissions来做的。对于运行时权限有兴趣的可以去了解一下。主要是说第二个问题。

原来的话是定义一个文件地址,然后通过Uri.fromFile(cameraFile)就可以获取到相应的Uri,但是7.0往上,发现崩了。。。查了一下资料,原来是为了安全起见,面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。公开的话会抛出 FileUriExposedException 异常。要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。具体步骤如下:
(1)配置AndroidManifest

  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="你的应用包名.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        provider>

(2)在meta-data中我们注意到一个@xml/filepaths文件,需要我们自己创建,内容如下:


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

在paths内部有几个标签可选,分别如下:

<files-path name="name" path="path" /> --> Context.getFilesDir()
<cache-path name="name" path="path" /> --> getCacheDir()
<external-path name="name" path="path" /> --> Environment.getExternalStorageDirectory()
<external-files-path name="name" path="path" /> --> Context#getExternalFilesDir(String);Context.getExternalFilesDir(null)
<external-cache-path name="name" path="path" /> --> Context.getExternalCacheDir()
<external-media-path name="name" path="path" /> --> Context.getExternalMediaDirs()

因为我使用的是getExternalCacheDir() + "/tmp";,所以在filepaths中使用的是external-cache-path标签,path为tmp/
(3)在需要使用到Uri的地方:

//cameraFile为自己的缓存路径文件对象
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    //7.0以上系统采用新API拍照
    //这里的BuildConfig,需要是程序包下BuildConfig。
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
                             FileProvider.getUriForFile(activity.getApplicationContext(), BuildConfig.APPLICATION_ID + ".fileprovider", cameraFile));
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
    //7.0以下,直接调用相机即可
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
}
 activity.startActivityForResult(intent, requestCode);

到这里应用升级及拍照获取图片异常在7.0以上的适配就做好了

你可能感兴趣的:(日常开发笔记)