2012-07-09 201 views
114

我們已經通過編程安裝了應用程序。如何以編程方式檢查應用程序是否安裝在Android中?

  1. 如果應用程序已經安裝在設備中,應用程序會自動打開。
  2. 否則安裝特定的應用程序。

指導我。我不知道。 謝謝。

+0

[Android系統可能的複製 - 檢查另一個應用程序的存在](http://stackoverflow.com/questions/3694267/android-check-for-presence-of-another-app) – noelicus 2017-04-04 09:19:13

回答

269

試試這個:

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; 
    } 

} 
+1

@Sathish:我希望這可能對你有所幫助 – Aerrow 2012-07-09 09:57:24

+1

毫無疑問,你的帖子真的是h但我收到異常「java.lang.RuntimeException:添加窗口失敗」和「E/AndroidRuntime(7554):引起:android.os.TransactionTooLargeException 05-14 11:37:25.305:E/AndroidRuntime(7554 ):\t at android.os.BinderProxy.transact(Native Method) 05-14 11:37:25.305:E/AndroidRuntime(7554):\t at android.view.IWindowSession $ Stub $ Proxy.add(IWindowSession.java: 516) 05-14 11:37:25.305:E/AndroidRuntime(7554):\t at android.view.ViewRootImpl.setView(ViewRootImpl.java:494) 「 – DJhon 2014-05-14 06:16:00

+2

@BlueGreen:嗨,希望這個鏈接可以幫助你, http://stackoverflow.com/questions/11451393/what-to-do-on-transactiontoolargeexception,否則,如果你使用Dialog Class意味着請檢查它。 :) – Aerrow 2014-05-14 06:19:50

22

上面的代碼並沒有爲我工作。以下方法奏效。

創建具有適當信息的意圖對象,然後檢查是否意圖是可調用或不使用下面的函數:

private boolean isCallable(Intent intent) { 
     List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
     PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
} 
+4

這樣更好,因爲它不需要使用異常來控制流量! – QED 2015-08-29 22:11:29

+2

@QED它使用Exception作爲'if'語句的人數驚人!這絕對是正確的答案 – ILikeTacos 2015-09-07 19:44:25

+1

意圖的內容是什麼?使用packageName的字符串不起作用 – 2015-11-18 17:42:06

47

有點清潔的解決方案比接受的答案(基於this question):

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"); 

This answer演示如何從Play商店獲取應用程序,如果應用程序丟失,雖然護理需要採取上沒有Play商店的設備。

+0

這是否需要任何特定的Android權限才能使用? – Bootstrapper 2017-02-22 14:04:54

+0

@Bootstrapper:不,它不需要任何特殊的權限。 – Jonik 2017-02-22 15:38:40

+0

謝謝(工作解決方案) – 2017-11-10 14:56:58

12

如果您知道軟件包名稱,則此工程沒有使用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(); 
} 
+1

'return!list.isEmpty();'會更java風格友好 – headsvk 2017-04-03 14:37:10

6

此代碼檢查,以確保已安裝的應用程序,而且還檢查確保它已啓用。

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; 
    } 
} 
+0

這裏的uri是什麼? – 2016-07-10 04:35:42

+0

這是應用程序的包名稱。例如,「com.example.apps.myapp」。我編輯了我的答案以顯示packageName而不是uri。 – youravgjoe 2016-07-11 14:30:54

+0

有道理謝謝。 – 2016-07-11 14:37:43

2

我認爲使用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; 
} 
+0

在科特林上述代碼 ''' 私人樂趣isAppInstalled(上下文:語境,URI:字符串):布爾{ VAL packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES) 返回packageInfoList.asSequence()過濾{它?.packageName == uri} .any() } ''' – 2017-09-01 12:42:28

0

@EgemenHamutçuS IN科特林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() 
    } 
0

試試這個

此代碼是用於檢查的天氣包名稱您的應用程序安裝或 如果不是,那麼它會打開您的應用程序的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); 
    } 
1

使用科特林

fun PackageManager.isAppInstalled(packageName: String): Boolean = 
     getInstalledApplications(PackageManager.GET_META_DATA) 
       .firstOrNull { it.packageName == packageName } != null 

,並調用它像這樣的簡單的實現(尋求Spotify應用):

packageManager.isAppInstalled("com.spotify.music") 
相關問題