Kiểm tra xem ứng dụng đã được cài đặt chưa - Android


104

Tôi đang cố gắng cài đặt ứng dụng từ Google Play. Tôi có thể hiểu rằng khi mở URL cửa hàng Google Play, nó sẽ mở Google Play và khi tôi nhấn nút quay lại, hoạt động sẽ tiếp tục.

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

Khi tôi quay lại hoạt động, tôi đã thử gọi cái này onResume()để kiểm tra xem ứng dụng đã được cài đặt chưa, nhưng tôi nhận được lỗi:

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

private boolean appInstalledOrNot(String uri) {
  PackageManager pm = getPackageManager();
  boolean app_installed = false;
  try {
      pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
      app_installed = true;
  }
  catch (PackageManager.NameNotFoundException e) {
      app_installed = false;
  }
  return app_installed ;
}

Lỗi như sau:

E / AndroidRuntime (796): java.lang.RuntimeException: Không thể bắt đầu hoạt động ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: Không tìm thấy Hoạt động nào để xử lý Intent {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Tôi đoán là hoạt động onPause(). Có cách nào tốt hơn để thực hiện nó không? Tôi đang cố gắng kiểm tra xem ứng dụng đã cài đặt xong chưa.



@SiddharthanAsokan Nếu tôi hiểu chính xác, những gì bạn đang cố gắng đạt được ở đây là khởi động ứng dụng của bạn -> vào cửa hàng chơi-> nhấp vào cài đặt -> quay lại hoạt động của riêng bạn -> khởi động ứng dụng mới cài đặt .. đúng không?
Varun

Không quay lại ứng dụng mà tôi đã mở ban đầu. Tôi cần lấy một số thông tin về ứng dụng đã cài đặt bằng PackageManager. Việc truy xuất thông tin này bắt đầu sau khi tôi cài đặt ứng dụng từ ban đầu được sử dụng để mở url web.
Siddharthan Asokan

Câu trả lời:


299

Thử cái này:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Nó cố gắng tìm nạp thông tin về gói có tên mà bạn đã chuyển vào. Nếu không, nếu a NameNotFoundExceptionđược ném ra, điều đó có nghĩa là không có gói nào có tên đó được cài đặt, vì vậy chúng tôi quay lại false.

Lưu ý rằng chúng ta chuyển vào a PackageManagerthay vì a Context, để phương pháp này có thể sử dụng linh hoạt hơn một chút và không vi phạm luật Demeter . Bạn có thể sử dụng phương pháp này mà không cần quyền truy cập vào một Contextphiên bản, miễn là bạn có một PackageManagerphiên bản.

Sử dụng nó như thế này:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}

1
Điều kiện là: Tôi cần kiểm tra quá trình cài đặt này nếu nó đã hoàn tất. Tôi nhấp vào cài đặt và trong thời gian đó, tôi cố gắng kiểm tra cài đặt trong một vòng lặp. Mã là tốt nhưng phương pháp để kiểm tra xem cài đặt đã hoàn tất là những gì tôi đang tìm kiếm.
Siddharthan Asokan

3
@SiddharthanAsokan Bạn có thể sử dụng bộ thu phát sóng cho hành động package_added.
Varun

@Varun Tôi vừa chỉnh sửa mã. Tôi không sử dụng tên gói ứng dụng nữa. Chỉ url web của ứng dụng trong cửa hàng Google Play
Siddharthan vua A Dục

@Robin Kanters Xin đừng xem các thay đổi tôi đã làm
Siddharthan vua A Dục

Những gì bạn đã làm trong câu hỏi của bạn cũng giống như câu trả lời của tôi.
Robin Kanters

32

Câu trả lời của Robin Kanters là đúng, nhưng nó kiểm tra các ứng dụng đã cài đặt bất kể trạng thái được bật hay tắt của chúng.

Chúng ta đều biết một ứng dụng có thể được cài đặt nhưng bị người dùng vô hiệu hóa, do đó không thể sử dụng được.

Thao tác này kiểm tra các ứng dụng đã cài đặt đã bật:

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        return packageManager.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Bạn có thể đặt phương thức này trong một lớp giống như Utilsvà gọi nó ở mọi nơi bằng cách sử dụng:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

5

Thử cái này:

public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =   mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}

5

Giải pháp nhanh hơn:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGidstừ getPackageInfođó ít tốn kém hơn , vì vậy nó hoạt động nhanh hơn.

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

Lưu ý: Điều này sẽ không hoạt động trong một số không gian ảo. Chúng có thể vi phạm API Android và luôn trả về một mảng, ngay cả khi không có ứng dụng nào có tên gói đó.
Trong trường hợp này, hãy sử dụng getPackageInfo.


0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// phương thức kiểm tra gói cài đặt true / false

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

0

Nếu bạn muốn dùng thử mà không có khối try catch, có thể sử dụng phương pháp sau, Tạo ý định và đặt gói ứng dụng mà bạn muốn xác minh

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

và gọi phương thức sau để kiểm tra xem ứng dụng đã được cài đặt chưa

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}

0

Những người đang tìm kiếm giải pháp Kotlin có thể sử dụng phương pháp này,

Ở đây tôi đã chia sẻ mã đầy đủ và cũng xử lý trạng thái đã bật. Kiểm tra xem ứng dụng đã được cài đặt trong Android Kotlin chưa

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

-9
@Override 
protected void onResume() {
    super.onResume();
    boolean installed = false;

    while (!installed) {
        installed = appInstalledOrNot (APPPACKAGE);
        if (installed) {
            Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
        }
    }
} 

private boolean appInstalledOrNot (String uri) {
    PackageManager pm = getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}

8
Đây là một vòng lặp vô hạn.
Robin Kanters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.