getlaunchintentforpackage返回null。

6
请问为什么这段代码会使变量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);
    }
}

我在Pixel 4上测试,从未卸载YouTube应用程序。 另外,SideQuest列出了该应用程序并提供了包名com.google.android.youtube


6
你的Pixel 4已经更新到Android 11了吗?如果是这样,你可能会受到https://developer.android.com/about/versions/11/privacy/package-visibility的影响。 - CommonsWare
@CommonsWare 就是这样。在 Android 10 设备上,我没有这个问题。所以现在我知道该怎么做来解决 Android 11 的问题了。谢谢。 - alegro sandermann
@CommonsWare 我已经为这个问题奋斗了好几天。我一直很疯狂,为什么我的意图总是“null”。谢谢你提供的链接。你能把它发表成一个答案吗? - Nekomajin42
3个回答

10

<queries> 元素已经为我修复了。谢谢! - M. Usman Khan
它对我不起作用,请帮助我。 - mhammad alkhalaf

1
请在清单文件的下面级别添加以下代码,希望它可以适用于您。
<manifest
    <application
            >
        </application>

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

0

如果你在构建时知道要启动的应用程序的软件包名称,请查看CommonsWare的答案,因为这将适用于Android 11+。对于我的情况,我不知道构建时的软件包名称,因为我们从服务器调用中获取它,所以我不能将其放入manifest文件中。我必须采取不同的方法。

如果您知道要启动的包的活动名称,则不需要调用getLaunchIntentForPackage,因为您可以自行复制其行为。如果您查看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:如果您知道应用程序包名称,但不知道活动名称,那么可能获取活动名称的最佳方法就是在早期版本的Android(版本10或以下)上运行getLaunchIntentForPackage,其中安装了该应用程序,并从生成的意图中获取活动名称(intent.getComponent().getClassName())。

例如,对于YouTube,值将是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接