我们已经通过编程方式安装了应用程序。
- 如果设备中已经安装了该应用程序,则自动打开该应用程序。
- 否则,安装该特定的应用程序。
指导我。我一无所知。 谢谢。
试试这个:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Add respective layout
setContentView(R.layout.main_activity);
// Use package name which we want to check
boolean isAppInstalled = appInstalledOrNot("com.check.application");
if(isAppInstalled) {
//This intent will help you to launch if the package is already installed
Intent LaunchIntent = getPackageManager()
.getLaunchIntentForPackage("com.check.application");
startActivity(LaunchIntent);
Log.i("SampleLog", "Application is already installed.");
} else {
// Do whatever we want to do if application not installed
// For example, Redirect to play store
Log.i("SampleLog", "Application is not currently installed.");
}
}
private boolean appInstalledOrNot(String uri) {
PackageManager pm = getPackageManager();
try {
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
}
return false;
}
}
Fatal Exception: java.lang.RuntimeException 包管理器已停止运行
。 - Mathi Arasanpublic static boolean isAppInstalled(Context context, String packageName) {
try {
context.getPackageManager().getApplicationInfo(packageName, 0);
return true;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
我选择将它放在一个帮助类中作为一个静态实用程序。使用示例:
boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");
这篇回答 展示了如何从 Play 商店获取应用程序(如果应用程序丢失),但在没有 Play 商店的设备上需要小心。
上面的代码对我没用,以下方法有效。
使用适当的信息创建一个Intent对象,然后使用以下函数检查Intent是否可调用:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Intent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Intent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
- Dominic K如果您知道包的名称,那么可以不使用try-catch块或迭代一堆包就能实现:
public static boolean isPackageInstalled(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
if (intent == null) {
return false;
}
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return !list.isEmpty();
}
return !list.isEmpty();
更符合 Java 风格。 - headsvkAndroid 11更新
您必须在清单文件中指定要搜索的确切捆绑标识。
以Facebook和WhatsApp为例:
在“应用程序”上面的清单文件中(即权限所在位置)
<queries>
<package android:name="com.whatsapp" />
<package android:name="com.facebook.katana" />
</queries>
这段代码检查应用程序是否已安装,同时还检查是否已启用。
private boolean isAppInstalled(String packageName) {
PackageManager pm = getPackageManager();
try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return pm.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return false;
}
}
使用 Kotlin 检查 Android 应用是否已安装。
创建 Kotlin 扩展。
fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
getApplicationInfo(packageName, PackageManager.GET_META_DATA)
true
} catch (e: Exception) {
false
}
现在,可以检查应用程序是否已安装
if (packageManager.isAppInstalled("AppPackageName")) {
// App is installed
}else{
// App is not installed
}
下面的解决方案(不需要try-catch)比被接受的答案更干净,基于AndroidRate库:
public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
for (ApplicationInfo packageInfo : packages) {
if (targetPackage.equals(packageInfo.packageName)) {
return true;
}
}
return false;
}
使用 Kotlin 实现一个更简单的方法
fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
可以这样调用(查找 Spotify 应用):
packageManager.isAppInstalled("com.spotify.music")
我认为使用try/catch模式的性能并不是很好。我建议使用以下方法:
public static boolean appInstalledOrNot(Context context, String uri) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
if (packageInfoList != null) {
for (PackageInfo packageInfo : packageInfoList) {
String packageName = packageInfo.packageName;
if (packageName != null && packageName.equals(uri)) {
return true;
}
}
}
return false;
}
private fun isAppInstalled(context: Context, uri: String): Boolean {
val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
}
- Kishan B