安卓11 拍照无法上传 无法存储 无法读写的问题 选择相机拍摄 无图片返回问题的解决方案
安卓11 拍照无法上传 无法存储 无法读写的问题 选择相机拍摄 无图片返回问题的解决方案 最近公司开发的APP突然遇到了个问题,用户在使用APP里调用手机拍照功能上传照片的时候,无法上传图片。这个问题出现的时候就让我非常疑惑了,因为距离上一次更新APP已经过了好几个月了,突然某个功能出问题是很奇怪的,但是没办法还是要解决。结果无论怎样都无法复现问题。。。最后才发现公司的测试手机是安卓10的,是没问
安卓11 拍照无法上传 无法存储 无法读写的问题 选择相机拍摄 无图片返回问题的解决方案
最近公司开发的APP突然遇到了个问题,用户在使用APP里调用手机拍照功能上传照片的时候,无法上传图片。这个问题出现的时候就让我非常疑惑了,因为距离上一次更新APP已经过了好几个月了,突然某个功能出问题是很奇怪的,但是没办法还是要解决。结果无论怎样都无法复现问题。。。最后才发现公司的测试手机是安卓10的,是没问题的,要到安卓11的手机上才能复现问题。。。非常无语。
吐槽归吐槽,问题还是要解决的,我知道安卓11上对于分区存储有了更进一步的约束,但我一开始没有往这方面想,在经过几个痛苦的日夜后,最后定位出是安卓11的分区存储,让原本代码中拍完照后请求手机存储图片的这段代码出了问题。因为以前代码比较老,所以对权限的请求不是很规范,在安卓11前还比较宽容,没有给报错,但是更新完后就不行了,接下来我就把正确的代码写出来。
1. 首先加读写权限
在AndroidManifest.xml中加入下面两段
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 在res/xml文件夹中增加文件
需要弄一个Provider来申请外部存储的权限,代码如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_download" path="Download"/>
</paths>
3. 在AndroidManifest.xml中的application标签里增加provider
在第2步增加完Provider文件后,在这一步里去调用加入
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="(这里写自己项目的包名).provider"
tools:replace="android:authorities"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
4. (关键步骤)申请调用手机相机拍照
如果安卓11有拍照不行的问题,基本都是这段代码有问题,正确代码应该如下:
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= 24) {//大于7.0使用此方法
if(captureIntent.resolveActivity(getPackageManager())!=null){
//toFile 是图片保存在手机中的路径,这段代码我就不贴了,因为网上都有,而且都是没问题的
if(toFile!=null){
//这里的provider要和第三步的一样
Uri photoURI= FileProvider.getUriForFile(getApplicationContext(),"(自己项目的包名).provider",toFile);
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
startActivityForResult(captureIntent,GalleryFinal.TAKE_REQUEST_CODE);
}
}
}
总结:通过上面这四步就可以修复拍照因为权限问题导致各种不行的问题。安卓现在的权限限制越来越严格了,所以我们写代码的时候也要尽可能更规范一点。希望能帮助到大家。
更多推荐
所有评论(0)