**
android12适配 调用系统相机遇到的坑
最近开发一个应用,打开相机拍照是其中一个小小点的功能。按照之前的路子上了代码,发送Intent调起系统相机就完了。可是偏偏就扯拐了,Android12总是不行,告诉我应该停留下来学习学习 了。学了老是忘记,在这里留点啥吧,你接着看。。。
一,在AndroidManifest.xml中增加provider节点:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.choosecrop.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
解释一下:
android:authorities 表示授权列表,填写你的应用包名,当有多个授权时,用分号隔开。
android:exported 表示该内容提供器(FileProvider)是否能被第三方程序组件使用,必须为false,否则会报异常: java.lang.SecurityException: Provider must not be exported。
android:grantUriPermissions=“true” 表示授予 URI 临时访问权限。
第二:在res目录下建立一个xml目录,并创建file_paths.xml文件,内容如下
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="DCIM" path="." />
</paths>
第三:就开始你的主要代码实现功能啦
tempFile = new File(this.getExternalFilesDir(DIRECTORY_DCIM), System.currentTimeMillis() + ".png");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //如果在Android7.0以上,使用FileProvider获取Uri
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(MainActivity.this, "com.choosecrop.fileprovider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
} else { //否则使用Uri.fromFile(file)方法获取Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
}
startActivityForResult(intent, CAMERA_REQUEST_CODE);
最后在回调方法 onActivityResult()方法中实现相片的提取就可以啦,大工告成,记录解决问题这一刻。