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更新的代码和过程发布上来。刚开始搞安卓,很多原理上的东西还一知半解,很多都是借鉴的。

你可能感兴趣的:(Android,开发)