Android FileProvider配置报错android.content.pm.ProviderInfo.loadXmlMetaData问题

Android FileProvider配置报错android.content.pm.ProviderInfo.loadXmlMetaData问题

项目中配置FileProvider,运行报错android.content.res.XmlResourceParser错误。强制更新,下载了最新的包之后打开报错:

java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference

根据日志定位到错误是:

Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID+".provider", apkFile);

FileProvider.getUriForFile();方法中fileprovider对象为空,因此推断出AndroidManifest.xml中provider节点下面的authority属性有问题,没有找到。既然authority不存在,肯定是配置有问题。

        <!--android:authorities="com.xxxx.xxxx.fileProvider"-->
        <!--还是建议用下面的方法,上面这种存在弊端-->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

还有就是在工具类哪里打开下载文件的方法,也统一用自己项目包下的BuildConfig.APPLICATION_ID  代替。

FileProvider.getUriForFile(context.getApplicationContext(), BuildConfig.APPLICATION_ID+”.provider”,new File(picturePath))

public synchronized static void openFile(Context context, String fileFullName) {
        File apkFile = new File(fileFullName);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//            Uri contentUri = FileProvider.getUriForFile(context, "com.xxxx.xxxx.fileprovider", apkFile);
            Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        if (context.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }

 

书到用时方恨少,纸上得来终觉浅。共勉!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114975.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月1日 下午11:00
下一篇 2021年10月2日 上午6:00


相关推荐

  • 从Java培训班出来后是怎么找到工作的?

    从Java培训班出来后是怎么找到工作的?经常听到有人抱怨,我参加过IT培训,公司一看我的简历就直接pass我了,把培训经历去掉后,面试通知是多了,但是往往面试完,就不了了之了,难道我参加过培训,公司就不会选择我了吗?一些企业有点排斥培训班出来的,他们排斥的原因相信大家都知道,主要是简历过度包装,面试都会一上手就废而且现在相当多的公司,会选择在培训机构培训过的程序员,很多公司会去到相关培训机构做双选会,直接挑选适合本公司职位的学员,即能快速了解此人的技术水平,还能很直观的了解到他的学习水平。没有一个企业喜欢学习能力差的人,你可以在进公司的时

    2022年7月7日
    25
  • iOS 7 UI 过渡指南 – 開始之前(iOS 7 UI Transition Guide – Before You Start)[通俗易懂]

    iOS 7 UI 过渡指南 – 開始之前(iOS 7 UI Transition Guide – Before You Start)

    2022年2月7日
    46
  • SparkSQL简介

    SparkSQL简介注 该系列文章以及使用到安装包 测试数据可以在 倾情大奉送 Spark 入门实战系列 获取 1 SparkSQL 的发展历程 1 1 nbsp HiveandShark 的前身是 Shark 给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具 Hive 应运而生 它是当时唯一运行在 Hadoop 上的 SQL on Hadoop 工具 但是 MapReduce 计算过程

    2026年3月18日
    2
  • 公网IP和内网IP区别

    公网IP和内网IP区别什么是内网IP:一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IPSharing),使用整个公司或学校的机器都能够访问互联网。而这些企业或学校的机器使用的IP地址就是内网IP,内网IP是在规划IPv4协议时,考虑到IP地址资源可能不足,就专门为内部网设计私有IP地址(或称之为保留地址),一般常用内网IP地址都是这种形式的:10.X.X.X、172.16.X.X-1…

    2022年4月30日
    54
  • Windows修改Rabbitmq端口号

    Windows修改Rabbitmq端口号1 rabbitmq config 默认是没有生成的 只有一个 rabbitmq config example 需要自己建一个 要么就 copy 一个改下名字 要么就是把 example 去掉 2 rabbitmq config 目录并非安装目录下面的 etc 默认是在 C Users USERNAME AppDataRoami 下 这一点在安装目录下面的 etc 目录下的 readme txt 中有说明 说明如下 Inthisdirect

    2026年3月17日
    2
  • 将截断字符串或二进制数据是什么意思_截取字符串中的一部分

    将截断字符串或二进制数据是什么意思_截取字符串中的一部分今天做数据库练习的时候,往一个student表中在新建查询中用T-Sql语句插入一条记录。insertintostudentvalues(‘090120′,’陈冬’,’男’,19,’信息系’,’1234567′)系统老显示:将截断字符串或二进制数据,语句已结束。……………………原因:找到student表,查看表的数据类型,才知道在定义ssex时,把ssex的数据类型定义为:c…

    2022年10月7日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号