【问题标题】:Can't start external application无法启动外部应用程序
【发布时间】:2021-06-02 15:11:08
【问题描述】:

我有以下代码来启动外部应用程序,但它不起作用:

private fun launchApplication(packageName: String)
{
    try
    {
        val application = packageManager.getLaunchIntentForPackage(packageName)
        startActivity(application)
    }
    catch (ex: Exception) { }
}

我尝试过以下软件包:

  • com.google.android.youtube
  • com.teamviewer.quicksupport.market

有什么想法吗?

编辑

使用来自@Mayur Gajra 的代码,它可以与com.google.android.youtube 一起使用,但不能与com.teamviewer.quicksupport.market 一起使用,引发以下错误:

android.content.ActivityNotFoundException:找不到要处理的活动 意图 { act=android.intent.action.MAIN 猫=[android.intent.category.LAUNCHER] flg=0x4000000 pkg=com.teamviewer.quicksupport.market }

但如果我搜索使用以下代码安装的软件包,TeamViewer 就会出现:

val intent = Intent(Intent.ACTION_MAIN, null)
intent.addCategory(Intent.CATEGORY_LAUNCHER)
val appsList = packageManager.queryIntentActivities(intent, 0)

ResolveInfo{40c33b1 com.teamviewer.quicksupport.market/com.teamviewer.quicksupport.ui.QSActivity m=0x108000}

  • packageName = com.teamviewer.quicksupport.market
  • className = com.teamviewer.quicksupport.QSApplication

有什么想法吗?

【问题讨论】:

  • 在 Android 11 上? .
  • 您应该尝试启动自己的应用程序。
  • @blackapps Android 8.1
  • but it's not working: 不清楚您所说的“不工作”是什么意思。

标签: android android-intent start-activity


【解决方案1】:

您可以尝试这种方式,让系统找到该包的Launcher 类别的活动并启动它。

private fun launchApplication(packageName: String) {
        try {
            val intent = Intent(Intent.ACTION_MAIN)
            intent.addCategory(Intent.CATEGORY_LAUNCHER)
            intent.setPackage(packageName)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            startActivity(intent)
        } catch (ex: Exception) {
        }
    }

【讨论】:

  • 它不工作。事实上,甚至应用程序选择器都没有出现。
  • @Lechucico 您正在测试的设备型号和 API 级别是什么?
  • Android 8.1,API min 21,target 28
  • @Lechucico 这很奇怪。我在多个设备上进行了测试,并且可以正常工作。您能否打印应用我的代码后得到的异常(ex.printStackTrace())?
  • 也不例外,就是继续,什么都不做。
【解决方案2】:

最后用下面的代码解决了:

private fun launchApplication(packageName: String)
{
    try
    {
        // Find application with that package name
        val mainIntent = Intent(Intent.ACTION_MAIN, null)
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
        val pkgAppsList = packageManager.queryIntentActivities(mainIntent, 0)
        val application = pkgAppsList.first { it.activityInfo.applicationInfo.packageName == packageName }

        // Start that application
        val intent = Intent()
        intent.setClassName(application.activityInfo.packageName, application.activityInfo.name)
        startActivity(intent)
    }
    catch (ex: Exception) { }
}

一些额外的cmets:如果应用程序在Lock Task Mode,此方法将不起作用,记得之前调用stopLockTask()

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多