安卓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);
                    }
                }
            }

 总结:通过上面这四步就可以修复拍照因为权限问题导致各种不行的问题。安卓现在的权限限制越来越严格了,所以我们写代码的时候也要尽可能更规范一点。希望能帮助到大家。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐