我想从我的Android应用程序启动一个已安装的包。我认为使用意图是可能的,但我没有找到一种方法来做到这一点。有没有链接,在哪里可以找到相关信息?
当前回答
根据评论进行编辑
在某些版本中(如注释中建议的那样),抛出的异常可能不同。
因此,下面的解决方案稍作修改
Intent launchIntent = null;
try{
launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}
if(launchIntent == null){
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
startActivity(launchIntent);
}
原来的答案
虽然回答得很好,有一个相当简单的实现来处理如果应用程序没有安装。我这样做
try{
startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}
将“applicationId”替换为要打开的包,如com.google。地图等。
其他回答
可以使用Intent来启动应用程序的activity。setClassName根据文档。
一个例子:
val activityName = "com.google.android.apps.muzei.MuzeiActivity" // target activity name
val packageName = "net.nurik.roman.muzei" // target package's name
val intent = Intent().setClassName(packageName, activityName)
startActivity(intent)
要在当前应用程序之外打开它,在开始intent之前添加这个标志。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
这里有一个相关的答案
试试下面的代码:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name", "Class_name"));
if (intent.resolveActivity(getPackageManager()) != null)
{
startActivity(intent);
}
从API 30 (Android 11)开始,你可以通过launchIntentForPackage接收nullpointerexception
val launchIntent: Intent? = activity.packageManager.getLaunchIntentForPackage("com.google.android.gm")
startActivity(launchIntent)
为了避免这种情况,您需要将所需的包添加到清单中
<queries>
<package android:name="com.google.android.gm" />
</queries>
这里是文档 https://developer.android.com/training/package-visibility
而媒体文章 https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9
如果你知道数据和安装的包的反应,你只需在启动之前将这些信息添加到你的intent实例中。
如果你可以访问其他应用程序的AndroidManifest,你可以在那里看到所有需要的信息。
我找到了解决办法。在应用程序的清单文件中,我找到了包的名称:com.package.address和我想启动的主活动的名称:MainActivity 下面的代码启动这个应用程序:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 碎片中的onCreateOptionsMenu
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?