这个原因很简单,妈的,网上没有用太多相关的文章,自己mark一下,这个错误是检查AndroidManifest.xml,里面的

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="包名.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true"
   >
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

尤其注意android:authorities="包名.fileprovider",注意大小写,

把带包名的数据  android:authorities="${applicationId}.fileprovider 

现在10.0读取不到内存卡,需要额外再增加一行代码,别问为什么,只需要ctrl+c和ctrl+v

android:requestLegacyExternalStorage="true"

补充说明一下,

针对Android11,google官方的意思是:app卸载后,app相关的一切下载文件都要删除,这时还有两种解决方案,

第一:像

Environment.getDataDirectory()或者
Environment...相关的暂时不要用,要用getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).
getAbsolutePath(),尽量用getFilesDir()之类的api

第二,就是降低targetSdkVersion低于30就行

 再次附上files_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <files-path
            name="files"
            path="." />
        <cache-path
            name="cache"
            path="." />
        <external-path
            name="camera_photos"
            path="." />
        <external-files-path
            name="external_file_path"
            path="." />
        <!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录-->
        <external-cache-path
            name="external_cache_path"
            path="." />
        <external-path
            name="beta_external_path"
            path="." />
        <external-path
            name="beta_external_files_path"
            path="." />
        <!--配置root-path。这样子可以读取到sd卡和一些应用分身的目录,否则微信分身保存的图片,就会导致 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/tencent/MicroMsg/WeiXin/export1544062754693.jpg,在小米6的手机上微信分身有这个crash,华为没有
-->
        <root-path
            name="root_path"
            path="." />
    </paths>
</resources><!--<root-path/> :代表设备的根目录new File("/")-->
    <!--<files-path/> : 代表context.getFilesDir()-->
    <!--<cache-path/> : 代表context.getCacheDir()-->
    <!--<external-path/> : 代表Environment.getExternalStorageDirectory()-->
    <!--<external-files-path/> : 代表context.getExternalFilesDirs()-->
    <!--<external-cache-path/> : 代表getExternalCacheDirs()-->
    <!--path节点支持name和path两个属性,配置了path属性就相当于在相应路径下子目录,-->
    <!--https://www.jianshu.com/p/6463cfea9d7f-->
 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐