【问题标题】:Determine if a specific activity in an application can be launched确定是否可以启动应用程序中的特定活动
【发布时间】:2010-06-09 01:50:29
【问题描述】:

应用程序可以有任意数量的可启动活动。我知道如何通过 PackageManager 获取这些活动的列表。

有没有办法确定哪些活动可以通过 startActivity 启动?

例如,Documents To Go 应用程序有不同的活动,可以启动 Word、Excel、Powerpoint、PDF 等...我能够启动所有这些都很好。

但是,它还包含一些我无法使用 startActivity 启动的活动...如果我尝试这样做,我会收到 SecurityException。

我希望能够确定哪些活动可以安全启动,哪些不能,因此我只向用户显示我可以从我的应用程序中安全启动的活动列表...

这可能吗?

【问题讨论】:

    标签: android android-activity launch securityexception


    【解决方案1】:

    使用您拥有的参数/数据创建意图,然后使用包管理器resolveActivity() 方法检查将处理您的请求的活动。

    然后使用 PackageManager 的checkPermission() 方法检查权限。

    HTH!

    【讨论】:

    • 不幸的是,resolveActivity() 方法仅用于隐式意图。因为我有我正在启动的活动的包名和类名(我通过 PackageManager 获取它们),所以这个方法不适用于我想做的事情。查找要启动的活动没有问题。问题是,当我尝试通过 startActivity() 启动它时,我收到 SecurityException 错误...欢迎任何其他建议。
    • 对于它的价值,我从 SecurityException 得到的确切错误是:Permission Denial:starting Intent { flg=0x10600000 cmp=com.dataviz.docstogo/com.dataviz.dxtg.common。 android.WelcomeScreenActivity } 来自 ProcessRecord{43565cb0 14660:com.magouyaware.appswipe/10043} (pid=14660, uid=10043) 需要 null
    • 但是,我可以成功启动 Docs To Go 应用程序提供的其他活动。所以问题是,我如何确定哪些可以启动,哪些不能启动...(请注意,使用 Docs To Go 只是一个示例...许多不同的应用程序都会出现同样的问题)
    【解决方案2】:

    这对你来说可能是旧帽子,但你可以使用这个方法:

    getPackageManager().getLaunchIntentForPackage(
                    packageName);
    

    以下是获取已安装应用程序包名称的方法:

    final PackageManager pm = getPackageManager();
    
            List<ApplicationInfo> packages = pm
                    .getInstalledApplications(PackageManager.GET_META_DATA);
    
            for (ApplicationInfo packageInfo : packages) {
    
                Log.d(TAG, "Installed package :" + packageInfo.packageName);
                Log.d(TAG,
                        "Launch Activity :"
                                + pm.getLaunchIntentForPackage(packageInfo.packageName));
    
            }
    

    【讨论】:

    • 谢谢尼尔森,但这并没有真正回答我的问题。您拥有的代码找到了启动给定包的默认活动的意图。我的要求不一样。我已经有了给定活动的包名和类名……在大多数情况下,我可以以明确的意图启动它。但是,在某些情况下,我收到权限被拒绝错误...我所有检查我是否有权启动活动的努力都被忽略了,我仍然收到 SecurityException 说权限被拒绝。
    • 啊,我明白了。如果您能够捕捉到错误,那可能就已经很好了。抱歉,我帮不上忙。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多