2012-07-09 39 views
114

Chúng tôi đã cài đặt các ứng dụng theo chương trình.Cách kiểm tra theo chương trình nếu ứng dụng được cài đặt hay không trong Android?

  1. Nếu ứng dụng đã được cài đặt trong thiết bị, ứng dụng sẽ tự động mở.
  2. Nếu không, hãy cài đặt ứng dụng cụ thể.

Hướng dẫn tôi. Tôi không có ý kiến. Cảm ơn.

+0

có thể trùng lặp của [Android - kiểm tra sự hiện diện của ứng dụng khác ] (http://stackoverflow.com/questions/3694267/android-check-for-presence-of-another-app) – noelicus

Trả lời

269

Hãy thử với điều này:

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: Tôi hy vọng nó có thể hữu ích cho bạn – Aerrow

+1

Không nghi ngờ gì bài viết của bạn thực sự là h elpful, nhưng tôi nhận được một ngoại lệ "java.lang.RuntimeException: Thêm cửa sổ không thành công" và "E/AndroidRuntime (7554): Gây ra bởi: android.os.TransactionTooLargeException 05-14 11: 37: 25.305: E/AndroidRuntime (7554)): \t tại android.os.BinderProxy.transact (Phương thức Gốc) 05-14 11: 37: 25.305: E/AndroidRuntime (7554): \t tại android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession.java: 516) 05-14 11: 37: 25.305: E/AndroidRuntime (7554): \t tại android.view.ViewRootImpl.setView (ViewRootImpl.java:494) " – DJhon

+2

@BlueGreen: Xin chào, hy vọng liên kết này có thể giúp bạn, http://stackoverflow.com/questions/11451393/what-to-do-on-transactiontoolargeexception, nếu bạn đang sử dụng Dialog Class có nghĩa là vui lòng kiểm tra nó. :) – Aerrow

22

Đoạn mã trên không làm việc cho tôi. Cách tiếp cận sau đây đã hiệu quả.

Tạo một đối tượng Ý định với thông tin thích hợp và sau đó kiểm tra nếu tiếp cận mục đích là callable hoặc không sử dụng các chức năng sau:

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

Điều này tốt hơn vì nó không yêu cầu sử dụng ngoại lệ cho điều khiển luồng! – QED

+2

@QED nó làm kinh ngạc số lượng người sử dụng Ngoại lệ như là câu lệnh 'if'! Đây chắc chắn là câu trả lời đúng – ILikeTacos

+1

nội dung của Mục đích là gì?String với packageName không hoạt động –

47

Hơi sạch giải pháp hơn là câu trả lời được chấp nhận (dựa trên this question):

public static boolean isAppInstalled(Context context, String packageName) { 
    try { 
     context.getPackageManager().getApplicationInfo(packageName, 0); 
     return true; 
    } 
    catch (PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 

Tôi đã chọn đặt nó trong lớp trợ giúp như một tiện ích tĩnh. Cách sử dụng Ví dụ:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp"); 

This answer cho thấy làm thế nào để có được ứng dụng từ Play Store nếu ứng dụng là mất tích, mặc dù chăm sóc cần được thực hiện trên các thiết bị mà không có Cửa hàng Play.

+0

thực hiện điều này có yêu cầu bất kỳ quyền Android cụ thể nào để hoạt động không? – Bootstrapper

+0

@Bootstrapper: Không, nó không yêu cầu bất kỳ quyền đặc biệt nào. – Jonik

+0

Cảm ơn (Giải pháp làm việc) –

12

Nếu bạn biết tên gói, sau đó làm việc này mà không cần sử dụng một khối try-catch hoặc lặp lại thông qua một loạt các gói:

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();' sẽ có nhiều kiểu java thân thiện hơn – headsvk

6

kiểm tra Mã này để đảm bảo các ứng dụng được cài đặt, nhưng cũng kiểm tra để đảm bảo nó được bật.

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 ở đây là gì? –

+0

Đó là tên gói của ứng dụng. Ví dụ: "com.example.apps.myapp". Tôi đã chỉnh sửa câu trả lời của mình để hiển thị packageName thay vì uri. – youravgjoe

+0

Cảm ơn bạn. –

2

Tôi nghĩ rằng việc sử dụng mẫu try/catch không thực sự tốt cho hiệu suất.Tôi khuyên sử dụng này:

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

Đoạn mã trên trong Kotlin '' ' niềm vui riêng isAppInstalled (bối cảnh: Bối cảnh, uri: String):. Boolean { val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) trở packageInfoList.asSequence() {lọc it? .packageName == uri} .any() } '' ' –

0

@Egemen Hamutçu s câu trả lời trong 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() 
    } 
0

Hãy thử điều này

Mã này được sử dụng để kiểm tra thời tiết ứng dụng của bạn với tên gói được cài đặt hoặc không nếu không thì nó sẽ mở liên kết playstore của ứng dụng của bạn nếu không ứng dụng đã cài đặt

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

Một thực hiện đơn giản bằng Kotlin

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

Và gọi nó như thế này (tìm kiếm ứng dụng Spotify):

packageManager.isAppInstalled("com.spotify.music") 
Các vấn đề liên quan