Android 7.0解析包时出现问题 的解决方案(应用内更新)

  • 2017-8-18 08:55
  • PHP二次开发
  • 阅读(178)
  • 评论(1
  • 来源:互联网
  • 摘要: 问题描述我们在进行Android开发的时候,一般都会在应用里检测有没有更新,并且从网上下载最新的版本包,覆盖本地的旧版本。在我的项目中,出现了一个问题,就是当安装包下载到本地的时候,产生了“解析包时出现问题 ...
    问题描述

    我们在进行Android开发的时候,一般都会在应用里检测有没有更新,并且从网上下载最新的版本包,覆盖本地的旧版本。在我的项目中,出现了一个问题,就是当安装包下载到本地的时候,产生了“解析包时出现问题”这样的错误,导致无法安装相应的新版本。同时,值得一提的是,这个问题只有在我们用代码调用去进行安装的时候才会发生,我们手动去用安装包覆盖本地的旧包则没有出现问题。经过反复的测试,发现这个问题只会发生在android 7.0版本的设备上,在较低版本的设备上则无这个问题。

    解决方案:

    解决方案将使用FileProvider,它的步骤是:

    第一步: 
    在AndroidManifest.xml中注册provider,provider可以向应用外提供数据。
    <provider
       android:name="android.support.v4.content.FileProvider"
       android:authorities="包名.fileprovider"
       android:grantUriPermissions="true"
       android:exported="false">
       <meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_paths" />
    </provider>

    第二步: 
    在res/xml/file_paths.xml创建文件。 内容为:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <external-path path="" name="download"/>
        </paths>
    </resources>

    第三步:
    String fileName = cursor.getString(fileNameIdx);//承接我的代码,filename指获取到了我的文件相应路径
    if (fileName != null) {
        if (fileName.endsWith(".apk")) {
            if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上
                File file= new File(fileName);
                Uri apkUri = FileProvider.getUriForFile(context, "包名.fileprovider", file);//在AndroidManifest中的android:authorities值
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
                install.setDataAndType(apkUri, "application/vnd.android.package-archive");
                context.startActivity(install);
            } else{
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(install);
            }
        }
    }

    因为对于7.0以下的设备,还是走以前的逻辑,所以上面的代码进行分情况讨论,6.0及其以下的设备还是走以前的逻辑。


    PHP技术交流QQ群:422137578

    除非注明,文章均为 PHP二次开发 原创,转载请注明本文地址:http://www.php2.cc/article-2637-1.html

    相关阅读

    发表评论

    最新评论

    引用 搜推快排系统   2017-8-18 14:08
    这个安卓系统发展的好快,都7.0 了

    查看全部评论(1)

    用户名:  *

    邮 箱:  *

    网 址: 注意加上“http://”哦!