记上架googleplay提升targetsdkversion导致的适配问题_cp_mark的博客-爱代码爱编程
升了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文件,需要我们自己创建,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<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以上的适配就做好了