【问题标题】:getlaunchintentforpackage returning nullgetlaunchintentforpackage 返回 null
【发布时间】:2021-02-09 13:53:48
【问题描述】:

谁能告诉我为什么这给了我变量intent上的null?

public class MainActivity extends AppCompatActivity {
    private static String action = "com.google.android.youtube";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onResume() {
        super.onResume();
        this.launch();
    }

    public void launch() {
        PackageManager pm = getPackageManager();
        Intent intent = pm.getLaunchIntentForPackage(action);
        System.out.println("debug: " + intent);
        //startActivity(intent);
    }
}

我在像素 4 上对此进行了测试,但我从不卸载 youtube。此外,sidequest 列出了该应用并给了我包 com.google.android.youtube

【问题讨论】:

  • 您的 Pixel 4 更新到 Android 11 了吗?如果是这样,您可能会被developer.android.com/about/versions/11/privacy/… 抓住。
  • @CommonsWare 就是这样。在 Android 10 设备上,我没有这个问题。所以现在我知道如何为 Android 11 做些什么了。谢谢
  • @CommonsWare 我已经处理这个问题好几天了。为什么我的意图总是null,这让我很生气。感谢您的链接。你会把它作为答案发布吗?

标签: android android-package-managers


【解决方案1】:

对于许多(可能是大多数)PackageManager 方法,在 Android 11 及更高版本上,您需要考虑 package visibility rules 和 add a <queries> element to your manifest 来声明您有兴趣发现或分析哪些第三方应用程序。

【讨论】:

  • 元素为我修复。谢谢!
  • 它不适合我,请帮助我
【解决方案2】:

如果您知道要在构建时启动的应用程序包名称,请参阅 CommonsWare 的回答,因为这适用于 Android 11+。对于我的情况,我在构建时不知道包名称,因为我们从服务器调用中获取它,所以我不能把它放在我的清单中。我不得不采取不同的方法。

如果您知道要尝试启动的包的活动名称,则无需无需致电getLaunchIntentForPackage,因为您可以自己复制其行为。如果您将look at the source 用于getLaunchIntentForPackage,则PackageManager 仅用于获取正在启动的包的活动类名称。

如果您已经知道活动类名称,那么这是我在 Android 11+ 上工作的重新实现:

// you have String variables packageName and className (fully-qualified)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage(packageName);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(packageName, className);
startActivity(intent);

PS:如果你知道app包名,但不知道activity名,可能最好的获取activity名的方法就是在较早版本的Android(10或更低版本)上运行getLaunchIntentForPackage ) 安装该应用的位置,并从生成的意图 (intent.getComponent().getClassName()) 中获取活动名称。

例如,对于 YouTube,值为:

  • packageName = "com.google.android.youtube"
  • className = "com.google.android.youtube.app.honeycomb.Shell$HomeActivity"

【讨论】:

    【解决方案3】:

    在以下级别的清单中添加以下代码,希望它对您有用。

    <manifest
        <application
                >
            </application>
    
            <queries>
            <intent>
             <action android:name="com.google.android.youtube.api.service.START"/>
            </intent>
            </queries>
        </manifest>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2020-06-19
      • 2011-10-15
      • 2014-06-28
      相关资源
      最近更新 更多