如果应用程序已经安装在设备中,则该应用程序会自动打开。
否则,请安装特定的应用程序。
指导我。我不知道。
谢谢。
#1 楼
尝试以下操作: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("Application is already installed.");
} else {
// Do whatever we want to do if application not installed
// For example, Redirect to play store
Log.i("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;
}
}
评论
@Sathish:希望对您有帮助
–错误
2012年7月9日在9:57
无疑,您的帖子确实很有帮助,但是我遇到了一个异常“ java.lang.RuntimeException:添加窗口失败”和“ E / AndroidRuntime(7554):由以下原因引起:android.os.TransactionTooLargeException 05-14 11:37:25.305 :E / AndroidRuntime(7554):位于android.os.BinderProxy.transact(本机方法)05-14 11:37:25.305:E / AndroidRuntime(7554):位于android.view.IWindowSession $ Stub $ Proxy.add(IWindowSession .java:516)05-14 11:37:25.305:E / AndroidRuntime(7554):位于android.view.ViewRootImpl.setView(ViewRootImpl.java:494)“
– DJhon
2014年5月14日下午6:16
@BlueGreen:您好,希望此链接对您有帮助,stackoverflow.com / questions / 11451393 /…,否则,如果您使用的是Dialog Class,请进行检查。 :)
–错误
2014年5月14日下午6:19
@Aerrow ..假设我正在检查我的.apk是否已安装?在安装时...我在检查我的软件包com.test.installedornot。时遇到了相同的异常。我的.apk大小超过9MB,那么在这种情况下,我将如何处理此异常?
– DJhon
2014年5月14日下午6:39
@BlueGreen:上面的代码将仅检查已安装的应用程序,在安装时这将不起作用。对于您的情况,请在安装该apk之后使用广播接收器获取通知。
–错误
2014年8月26日4:54
#2 楼
比公认的答案(基于此问题)更干净的解决方案:public 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商店。
评论
是否需要任何特定的Android权限才能工作?
–引导程序
17-2-22在14:04
@Bootstrapper:不,不需要任何特殊权限。
– Jonik
17-2-22在15:38
谢谢(工作解决方案)
–纳粹艾哈迈德(Naveed Ahmad)
17年11月10日14:56
#3 楼
上面的代码对我不起作用。可以使用以下方法。使用以下信息创建一个Intent对象,然后使用以下函数检查Intent是否可调用:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
评论
这样比较好,因为它不需要使用异常进行流控制!
– QED
15年8月29日在22:11
@QED令人震惊的是,使用异常的人数就像语句一样!这绝对是正确的答案
– ILikeTacos
2015年9月7日于19:44
目的的内容是什么?带有packageName的字符串不起作用
–索萨(Henrique de Sousa)
15年11月18日在17:42
@HenriquedeSousa目的意图= getPackageManager()。getLaunchIntentForPackage(“ org.package.name”);
– Dominic K
16年5月5日在21:41
如果应用程序被禁用,那应该是错误的。
–雨果
16年6月14日在14:58
#4 楼
如果您知道程序包名称,则无需使用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();
}
评论
返回!list.isEmpty();将更java风格友好
– headsvk
17年4月3日在14:37
#5 楼
此代码检查以确保已安装该应用程序,但也检查以确保已启用该应用程序。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;
}
}
评论
这是应用程序的软件包名称。例如,“ com.example.apps.myapp”。我已经编辑了答案,以显示packageName而不是uri。
–youravgjoe
16年7月11日在14:30
#6 楼
我认为使用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;
}
评论
上面的代码在kotlin```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
17年9月1日在12:42
#7 楼
比公认的答案(基于AndroidRate库)更干净的解决方案(无try-catch):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;
}
#8 楼
使用kotlin在Android中安装或未安装Check App。
创建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
}
#9 楼
使用Kotlin的更简单实现fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
像这样调用它(寻求Spotify应用):
packageManager.isAppInstalled("com.spotify.music")
#10 楼
试试这个此代码用于检查安装了程序包名称的应用程序的天气,或者
如果没有安装,则它将打开您应用程序的playstore链接,否则将
安装的应用程序
String your_apppackagename="com.app.testing";
PackageManager packageManager = getPackageManager();
ApplicationInfo applicationInfo = null;
try {
applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (applicationInfo == null) {
// not installed it will open your app directly on playstore
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
} else {
// Installed
Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
startActivity( LaunchIntent );
}
#11 楼
@EgemenHamutçu在Kotlin B-中的答案) private fun isAppInstalled(context: Context, uri: String): Boolean {
val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
}
#12 楼
所有答案仅检查是否已安装某些应用程序。但是,众所周知,一个应用程序可以安装但被用户禁用,无法使用。因此,此解决方案会同时检查两者。即已安装并启用的应用。
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
try {
return packageManager.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
调用方法
isPackageInstalled()
:boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());
现在,使用布尔变量
isAppInstalled
并执行您想要的任何操作。if(isAppInstalled ) {
/* do whatever you want */
}
#13 楼
解决其他问题的好方法。例如,如果您不想区分“ com.myapp.debug”和“ com.myapp.release”!
public static boolean isAppInstalled(final Context context, final String packageName) {
final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
for (final ApplicationInfo appInfo : appsInfo) {
if (appInfo.packageName.contains(packageName)) return true;
}
return false;
}
#14 楼
与Kotlin suger一起更好: private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {
val packageManager = context.packageManager
return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
}
#15 楼
您可以使用Kotlin扩展名进行操作:fun Context.getInstalledPackages(): List<String> {
val packagesList = mutableListOf<String>()
packageManager.getInstalledPackages(0).forEach {
if ( it.applicationInfo.sourceDir.startsWith("/data/app/") && it.versionName != null)
packagesList.add(it.packageName)
}
return packagesList
}
fun Context.isInDevice(packageName: String): Boolean {
return getInstalledPackages().contains(packageName)
}
评论
Android的可能副本-检查是否存在其他应用程序