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


Câu trả lời:


317

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 đăng của bạn thực sự hữu ích, nhưng tôi đang nhận được một ngoại lệ "java.lang.R nbException: Thêm cửa sổ không thành công" và "E / AndroidR.78 (7554): Nguyên nhân bởi: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidR.78 (7554): tại android.os.BinderProxy.transact (Phương thức gốc) 05-14 11: 37: 25.305: E / AndroidR.78 (7554): tại android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidR.78 (7554): 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, stackoverflow.com/questions/11451393/ , nếu bạn đang sử dụng Dialog Class có nghĩa là vui lòng kiểm tra nó. :)
Aerrow

1
@Aerrow .. Giả sử tôi đang kiểm tra .apk của tôi đã được cài đặt hay chưa? tại thời điểm cài đặt ... Tôi nhận được ngoại lệ tương tự trong khi kiểm tra gói com.test.installedornot.My .apk có kích thước lớn hơn 9MB thì trong trường hợp đó tôi sẽ quản lý ngoại lệ này như thế nào?
DJhon

@BlueGreen: Đoạn mã trên sẽ chỉ kiểm tra ứng dụng đã cài đặt, tại thời điểm cài đặt, nó sẽ không hoạt động. Đối với trường hợp của bạn, hãy sử dụng bộ thu phát để nhận thông báo sau khi apk đó được cài đặt.
Aerrow

65

Một số giải pháp sạch hơn câu trả lời được chấp nhận (dựa trên câu hỏi này ):

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 một lớp trợ giúp như một tiện ích tĩnh. Ví dụ sử dụng:

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

Câu trả lời này cho biết cách tải ứng dụng từ Cửa hàng Play nếu ứng dụng bị thiếu, mặc dù cần phải cẩn thận trên các thiết bị không có Cửa hàng Play.


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

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

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

26

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

Tạo một đối tượng Intent với thông tin phù hợp và sau đó kiểm tra xem Intent có thể gọi được hay không sử dụng chức năng sau:

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

5
Điều này tốt hơn bởi vì nó không yêu cầu sử dụng ngoại lệ để kiểm soát luồng!
QED

2
@QED thật kinh khủng khi số lượng người sử dụng Ngoại lệ làm ifbáo cáo! Đây chắc chắn là câu trả lời đúng
ILikeTacos

1
Nội dung của ý định là gì? Chuỗi với gói Tên không hoạt động
Henrique de Sousa

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Đaminh K

Nếu ứng dụng bị vô hiệu hóa, nó sẽ sai.
Hugo

15

Nếu bạn biết tên gói, thì nó hoạt động mà không cần sử dụng khối thử bắt hoặc lặp 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ẽ thân thiện hơn với phong cách java
Headsvk

7

Mã này kiểm tra để đảm bảo ứng dụng được cài đặt, nhưng cũng kiểm tra để đảm bảo ứng dụng đượ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;
    }
}

Đó 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ị packName thay vì uri.
youravgjoe

3

Tôi nghĩ rằng sử dụng mô hình thử / bắt không tốt cho hiệu suất. Tôi khuyên bạn nên sử dụng điều 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;
}

Đoạn mã trên trong kotlin `` `private fun isAppInstalled (bối cảnh: Ngữ cảnh, uri: Chuỗi): Boolean {val packInfoList = bối cảnh.packageManager.getInstalledPackages (PackageManager.GET_ACTIVEER = uri} .any ()} ``
Kishan B

3

Giải pháp sạch hơn (không cần thử bắt) so với câu trả lời được chấp nhận (dựa trên Thư viện AndroidRate ):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}

2

Kiểm tra ứng dụng có được cài đặt hay không trong Android bằng cách sử dụng kotlin.

Tạo phần mở rộng kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Bây giờ, có thể kiểm tra xem ứng dụng đã được cài đặt hay chưa

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

Thử cái này

Mã này được sử dụng để kiểm tra thời tiết ứng dụng của bạn có cài đặt tên gói hay 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 của bạn

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

Việc thực hiện đơn giản hơn bằng cách sử dụ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")

0

@Egemen Hamutçu s 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

Tất cả các câu trả lời chỉ kiểm tra ứng dụng nhất định đã được cài đặt hay chưa. Nhưng, như 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, không thể sử dụng được.

Do đó, giải pháp này kiểm tra cho cả hai. tức là, các ứng dụng đã cài đặt VÀ kích hoạt .

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

Gọi phương thức isPackageInstalled():

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

Bây giờ, sử dụng biến boolean isAppInstalledvà làm bất cứ điều gì bạn muốn.

if(isAppInstalled ) {
    /* do whatever you want */
}

0

Một câu trả lời tuyệt vời cho các vấn đề khác. Nếu bạn không muốn phân biệt "com.myapp.debug" và "com.myapp.release" chẳng hạn!

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

0

Vì vậy, đẹp hơn với đường Kotlin:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
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.