美文网首页
Android 7.0更新应用遇到的问题

Android 7.0更新应用遇到的问题

作者: 苍蝇的梦 | 来源:发表于2017-10-23 16:09 被阅读133次

    2017-10-20 遇到的一点小问题

    .

    应用做完了,用模拟器弄了个8.0的环境测试下。结果在应用更新那边卡住了。公司的APP为了省事,没走应用市场,都是服务端给的公司自己的下载链接,我直接弄个带进度条的对话框下载,下载完成后直接跳转应用安装界面进行安装,用户设置运行未知来源就可正常安装。


    应用安装界面

    以前跳转安装界面都是这样

    File file = new File(path);//apk文件路径
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
    startActivity(intent);
    

    但从Android7.0开始,向应用外公开 file:// URI被禁止了,按照以前的方式可能会出现android.os.FileUriExposedException异常,无法正常跳转安装界面。解决办法网上搜一下有很多
    因为项目用的拍照及相册选取压缩库-TakePhoto,也有这个,懒得自己写,就直接用了。
    首先就是在项目的res文件夹里创建一个xml文件夹,然后再随便弄个paths标签的文件,文件里写上

    <paths>
        <root-path path="" name="camera_photos" />
    </paths>
    

    里面的子节点有好几种,具体含义网上有不少说到的
    这边随便截一张图看着方便。path=""为空,代表该目录下所有文件和文件夹,name="xxx"随便填,但不能为空,为空一运行直接出错,提示你需要给定值。

    子节点含义
    然后在AndroidManifest.xml文件里加上provider声明。android:authorities=""随便填,用的时候别写错就行。android:resource=""写的刚才xml文件路径。
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
    </provider>
    

    然后就是FileProvider获取Uri来传递文件路径了。注意兼容7.0以下。

    File file = new File(path);
    Intent intent = new Intent();
    Uri apkUri;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
        String authority = getPackageName() + ".fileprovider";//这个就是刚才android:authorities=""里填的文字
        apkUri = FileProvider.getUriForFile(context, authority , file);
        intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    } else {
        apkUri = Uri.fromFile(file);
        intent.setAction(Intent.ACTION_VIEW);
    }
    intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
    startActivity(intent);
    

    这样子就能正常跳转应用安装界面了。

    .

    按上面一般是可以了,不过测试中出现了些问题,顺便记录一下。
    首先是刚开始自己弄了个其他名字的<paths>文件放在AndroidManifest.xml里的android:resource="@xml/hhhhh"里,编译会提示增加tools:replace=""说明。
    懒得增加,就把名字改成一样,只是<paths>文件里面增加一个<external-files-path>节点,但是出现了java.lang.IllegalArgumentException错误,提示 Failed to find configured root that contains xxxxxxxx信息。
    好吧,直接把自己的这些都删了,直接用那个库的,因为他是直接用的<root-path path="" name="xxx" />设备的根目录,所以也能用。
    再试一下,这次能正常跳转安装界面了,但显示解析软件包时出现问题。,确认安装包没有问题,只好网上找一下,可惜一堆转来转去的信息。又打印了一下文件路径,原始路径是:/storage/emulated/0/Android/data/com.wannoo.test/files/upgrade/wannoo.apk,使用FileProvider获取uri后是content://com.wannoo.test.fileprovider/camera_photos/%20/storage/emulated/0/Android/data/com.wannoo.test/files/upgrade/wannoo.apk。怀疑是文件路径的问题。
    因为Android6.0运行时权限申请的原因,之前图省事,不想申请权限,所以把APK存储位置放在了Context.getExternalFilesDir()而不是Environment.getExternalStorageDirectory()这两个的区别,这边写得很清晰。改了下,先申请权限,然后把APK下载放在Environment.getExternalStorageDirectory()里,测试一下,能正常跳转安装界面,也能正常显示未知来源提醒了。

    解析软件包时出现问题。

    相关文章

      网友评论

          本文标题:Android 7.0更新应用遇到的问题

          本文链接:https://www.haomeiwen.com/subject/fyvwuxtx.html