如何以编程方式检查应用程序是否安装在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)
    }