如何以编程方式检查应用程序是否安装在Android中?
我们以编程方式安装了应用程序如何以编程方式检查应用程序是否安装在Android中?,android,apk,Android,Apk,我们以编程方式安装了应用程序 如果应用程序已安装在设备中,则应用程序将自动打开 否则,请安装特定的应用程序 指引我。我不知道。 谢谢。试试这个: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
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;
}
}
上面的代码对我不起作用。以下方法奏效了 使用适当的信息创建一个Intent对象,然后检查Intent是否可调用或未使用以下函数:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
private boolean可调用(意图){
List List=getPackageManager().QueryInputActivities(意图,
PackageManager.MATCH_(仅限默认值);
返回列表.size()>0;
}
比公认答案更干净的解决方案(基于):
我选择将它作为一个静态实用程序放在helper类中。用法示例:
boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");
显示了如果应用程序丢失,如何从Play Store获取应用程序,但在没有Play Store的设备上需要小心。如果您知道软件包名称,则无需使用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();
}
publicstaticbooleanispackageinstalled(上下文上下文,字符串packageName){
final-PackageManager-PackageManager=context.getPackageManager();
Intent Intent=packageManager.getLaunchIntentForPackage(packageName);
if(intent==null){
返回false;
}
List List=packageManager.querytentActivities(intent,packageManager.MATCH_DEFAULT_仅限);
return!list.isEmpty();
}
此代码检查以确保应用程序已安装,但也检查以确保其已启用
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;
}
}
我认为使用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;
}
public静态布尔appInstalledOrNot(上下文,字符串uri){
PackageManager pm=context.getPackageManager();
List-packageinfo-List=pm.getInstalledPackages(PackageManager.GET_活动);
if(PackageInfo列表!=null){
对于(PackageInfo PackageInfo:PackageInfo列表){
字符串packageName=packageInfo.packageName;
if(packageName!=null&&packageName.equals(uri)){
返回true;
}
}
}
返回false;
}
@Egemen Hamutçu在kotlin B-中的回答)
试试这个
此代码用于检查是否安装了包名为的应用程序
如果不是,则它将打开你的应用程序的playstore链接,否则你的
已安装的应用程序
使用Kotlin的更简单实现
fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
并这样称呼它(寻找Spotify应用程序):
比公认答案(基于)更干净的解决方案(无试水):
public静态布尔值isPackageExists(@NonNull final Context Context,@NonNull final String targetPackage){
List packages=context.getPackageManager().getInstalledApplication(0);
对于(ApplicationInfo packageInfo:packages){
if(targetPackage.equals(packageInfo.packageName)){
返回true;
}
}
返回false;
}
所有答案仅检查是否安装了某些应用程序。但是,正如我们都知道的那样,一个应用程序可以被安装,但被用户禁用,无法使用
因此,此解决方案同时检查这两种情况。i、 e、已安装和已启用的应用程序
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
try {
return packageManager.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
调用方法isPackageInstalled()
:
现在,使用布尔变量isAppInstalled
,并执行您想要的任何操作
if(isAppInstalled ) {
/* do whatever you want */
}
对其他问题的冷静回答。 例如,如果您不想区分“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;
}
publicstaticbooleansappinstalled(最终上下文,最终字符串packageName){
最终列表appsInfo=context.getPackageManager().getInstalledApplications(0);
用于(最终应用程序信息appInfo:appsInfo){
if(appInfo.packageName.contains(packageName))返回true;
}
返回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
}
与Kotlin suger一起更美好:
private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {
val packageManager = context.packageManager
return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
}
您可以使用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)
}
fun Context.getInstalledPackages():列表{
val packagesList=mutableListOf()
packageManager.getInstalledPackages(0.forEach){
if(it.applicationInfo.sourceDir.startsWith(“/data/app/”)&&it.versionName!=null)
packagesList.add(it.packageName)
}
退货包装清单
}
有趣的上下文.isInDevice(packageName:String):布尔值{
返回getInstalledPackages().contains(packageName)
}
@Sathish:我希望这对你有帮助毫无疑问,你的帖子确实很有帮助,但我收到了一个异常“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)“@BlueGreen:Hi,希望此链接对您有所帮助,否则如果您使用的是对话类方式,请检查它。:)@阿尔罗。。假设我正在检查.apk是否已安装?安装时。。。我在检查我的包com.test.installedornot.my.apk大小超过9MB时遇到相同的异常,那么在这种情况下,我将如何管理此异常?@BlueGreen:上述代码将仅检查已安装的应用程序,在安装时这将不起作用。对于您的情况,在安装apk之后使用广播接收器获取通知。这更好,因为它不需要使用异常进行流控制@QED使用异常作为if
语句的人数惊人!这绝对是正确的答案内容是什么
if(isAppInstalled ) {
/* do whatever you want */
}
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;
}
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
}
private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {
val packageManager = context.packageManager
return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
}
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)
}