繁体   English   中英

android.content.ActivityNotFoundException:找不到用于处理Intent的活动{act = android.intent.action.VIEW dat = content://

[英]android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://

我为我的应用程序执行更新操作。 .apk文件夹下载WebService,我手动尝试运行,但下载后的程序上无法启动.apk文件夹。我收到错误的设备,尝试将其安装为“程序安装已停止”,我该如何解决?

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Uri apkUri = FileProvider.getUriForFile(updateManager.updateContext, BuildConfig.APPLICATION_ID + ".provider",
            new File(Environment.getExternalStorageDirectory() + "/download/" + updateManager.apkOutPath));
    Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
    intent.setData(apkUri);
    intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
    updateManager.updateContext.startActivity(intent);

} else {

    try {

 String PATH = Environment.getExternalStorageDirectory() + "/download/";
                File toInstall = new File(PATH,updateManager.apkOutPath );

                Uri apkUri = Uri.fromFile(toInstall);
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setDataAndType(apkUri,
                        "application/vnd.android.package-archive");

                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                    updateManager.updateContext.startActivity(install);
    catch (Exception e){
        e.printStackTrace();
    }
}

在Android 7.0之前,您必须使用file Uri (例如来自Uri.fromFile()file Uri.fromFile()ACTION_VIEWACTION_INSTALL_PACKAGE来请求安装APK。

这不是您问题的答案,但为防止发生此崩溃,您可以检查是否有任何应用程序可以创建intent如果未为Intent创建选择器):

if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    startActivity(Intent.createChooser(intent,"Chooser"));
}

根据我的测试,无法在所有手机上使用ACTION_VIEW 有些手机会引发android.content.ActivityNotFoundException异常

到目前为止,使用ACTION_INSTALL_PACKAGE可以在我测试过的手机上可靠地工作。

我如何管理下载

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
            outputFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "ABC.apk")
        } else {
            outputFile = File(filesDir, "ABC.apk")
        }

并且在安装时

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                    val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE)
                    Timber.e(intent.getStringExtra("uri"))
                    val apkFile = File(filesDir, "ABC.apk")
                    val apkURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider",
                            apkFile )
                    installIntent.setDataAndType(apkURI, "application/vnd.android.package-archive")
                    installIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    installIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                    startActivity(installIntent)
                } else {
                    val installIntent = Intent(Intent.ACTION_VIEW)
                    installIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    Timber.e(intent.getStringExtra("uri"))
                    installIntent.setDataAndType(Uri.parse(intent.getStringExtra("uri")),
                            "application/vnd.android.package-archive")
                }

在provider_paths.xml中

<?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="file_paths" path="."/> </paths>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM