Android采坑记录-自动更新APK出现No Activity found to handle Intent{act=android.intent.action.View,dat=content:/

最近在做app自动更新,遇到了一些问题。在as的自带模拟器中运行没有问题,放到手机上就出现了问题。原本的安装apk的代码如下:

protected void installApk(File file) {
     
        Uri uri =  FileProvider.getUriForFile(context, "com.gzairports.xxbjkb.gza_fids.fileprovider", file);
       Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        //执行的数据类型
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        context.startActivity(installIntent);
        LogUtil.writeLogtoFile(LogType.LOG_TYPE_INFO, LogType.LOG_SOURCE_APP,"安装完成!");
        LoginMain();
    }

传入的file参数是下载得到的文件

查询了很多大佬的解释,决定在下载完成之后从本地目录获取file,进行安装。

修改代码:

         file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/update.apk");
        String path = file.getAbsolutePath();
        Uri downloadFileUri = Uri.parse("file://" + path);
        Intent installIntent=new Intent(Intent.ACTION_VIEW);
        installIntent.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
        installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

主要是将file从下载的路径中获取,并在进行Uri转换的时候加上file://头。

发现可以没有报错了,但是出现了安装的时候:解析安装包时出现问题,直接安装是没问题的。就是通过更新就安装不了。。。。。哭

好吧,继续查资料,有的说是文件权限的问题,但是我的安卓版本是5.0的。以为不是这个问题,但是我发现自己开发的编译版本等都是26.所以还是试一下。通过比较版本的方式选择不同的Uri获取方式。

修改后代码如下:

        Intent intent = new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= 24) {
            Uri apkUri = FileProvider.getUriForFile(context, "com.gzairports.xxbjkb.gza_fids.fileprovider", file);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        }
        context.startActivity(intent);

发不上去一试,完美搞定。下一次把整个apk更新的代码和过程发布上来。刚开始搞安卓,很多原理上的东西还一知半解,很多都是借鉴的。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云间歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值