एंड्रॉइड में एप्लिकेशन इंस्टॉल किया गया है या नहीं, तो प्रोग्रामेटिक रूप से कैसे जांचें?


147

हमने एप्लिकेशन को प्रोग्रामेटिक रूप से इंस्टॉल किया है।

  1. यदि डिवाइस में एप्लिकेशन पहले से इंस्टॉल है तो एप्लिकेशन अपने आप खुल जाता है।
  2. अन्यथा विशेष एप्लिकेशन इंस्टॉल करें।

मेरा मार्गदर्शन करो। मुझे पता नहीं है। धन्यवाद।


जवाबों:


317

इसके साथ प्रयास करें:

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
@ सतीश: मुझे आशा है कि यह आपके लिए उपयोगी हो सकता है
एरोह

1
इसमें कोई संदेह नहीं है कि आपकी पोस्ट वास्तव में उपयोगी है, लेकिन मुझे एक अपवाद मिल रहा है "java.lang.RuntimeException: विंडो जोड़ना विफल" और "E / AndroidRuntime (7554): इसके कारण: android.os.TransactionTarLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): android.os.BinderProxy.transact (नेटिव मेथड) पर 05-14 11: 37: 25.305: E / AndroidRuntime (7554): android..IindowSession $ Stub $ Proxy.add (IWindowSession) पर। .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): android.view.ViewRootImpl.setView पर (ViewRootImpl.java:494 ":
डीजेफ़ोन

2
@BlueGreen: हाय, आशा है कि यह लिंक आपकी मदद कर सकता है, stackoverflow.com/questions/11451393/… , अन्यथा यदि आप डायलॉग क्लास का उपयोग कर रहे हैं तो कृपया इसे जांचें। :)
एरोज़

1
@ ऐरो .. मान लीजिए मैं चेक कर रहा हूं मेरा .apk इंस्टॉल है या नहीं? स्थापना के समय ... मुझे अपने पैकेज com.test.installedornot.My की जाँच करते समय एक ही अपवाद मिल रहा है। मेरा आकार 9 एमबी से अधिक है तो उस स्थिति में मैं इस अपवाद को कैसे प्रबंधित करूंगा?
13

@BlueGreen: उपरोक्त कोड केवल इंस्टॉल किए गए ऐप की जांच करेगा, स्थापना के समय यह काम नहीं करेगा। अपने मामले के लिए, उस एपीके के इंस्टॉल होने के बाद सूचना प्राप्त करने के लिए ब्रॉडकास्ट रिसीवर का उपयोग करें।
एर्रो

65

स्वीकृत उत्तर की तुलना में कुछ हद तक क्लीनर समाधान ( इस प्रश्न पर आधारित ):

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

यह उत्तर दिखाता है कि यदि ऐप गायब है, तो ऐप को प्ले स्टोर से कैसे प्राप्त करें, हालांकि प्ले स्टोर में न होने वाले उपकरणों पर ध्यान रखने की आवश्यकता है।


क्या इसके लिए किसी विशिष्ट Android अनुमतियों की आवश्यकता है?
बूटस्ट्रैपेर

@ बूटस्ट्रैपर: नहीं, इसके लिए किसी विशेष अनुमति की आवश्यकता नहीं है।
जोनिक

धन्यवाद (वर्किंग सॉल्यूशन)
नावेद अहमद

26

उपरोक्त कोड मेरे लिए काम नहीं किया। निम्नलिखित दृष्टिकोण ने काम किया।

उपयुक्त जानकारी के साथ एक उद्देश्य ऑब्जेक्ट बनाएँ और फिर जाँचें कि क्या इंटेंट कॉल करने योग्य है या निम्न फ़ंक्शन का उपयोग नहीं कर रहा है:

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

5
यह बेहतर है क्योंकि इसे प्रवाह नियंत्रण के लिए अपवादों का उपयोग करने की आवश्यकता नहीं है!
QED

2
@ यह ifकथन के रूप में अपवाद का उपयोग करने वाले लोगों की राशि को याद कर रहा है ! यह निश्चित रूप से सही उत्तर है
ILikeTacos

1
इरादे की सामग्री क्या है? पैकेजनाम के साथ स्ट्रिंग काम नहीं करता है
हेनरिक डे सूसा

3
@ हेनरिकेडेउसाIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
डोमिनिक के

यदि एप्लिकेशन अक्षम था, तो यह गलत होना चाहिए।
ह्यूगो

15

यदि आपको पैकेज का नाम पता है, तो यह बिना किसी ट्राई-कैच ब्लॉक का उपयोग किए या संकुल के एक समूह के माध्यम से पुनरावृत्ति करता है:

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();और अधिक जावा शैली के अनुकूल होगा
हेडस्कॉक

7

यह कोड यह सुनिश्चित करने के लिए जाँचता है कि ऐप इंस्टॉल है, लेकिन यह भी सुनिश्चित करने के लिए जाँच करता है कि यह सक्षम है या नहीं।

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

यह ऐप का पैकेज नाम है। उदाहरण के लिए, "com.example.apps.myapp"। मैंने uri के बजाय पैकेजनाम को दिखाने के लिए अपना उत्तर संपादित किया है।
youravgjoe

3

मुझे लगता है कि कोशिश / कैच पैटर्न का उपयोग प्रदर्शन के लिए बहुत अच्छा नहीं है। मैं इसका उपयोग करने की सलाह देता हूं:

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

Kotlin में उपरोक्त कोड `` निजी मज़ा isAppInstalled (संदर्भ: संदर्भ, uri: स्ट्रिंग): बूलियन {val packageInfoList = reference.packageManager.getInstalledPassages (PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence (?) फ़िल्टर करें = uri} .any ()} `` `
किशन बी

3

स्वीकृत उत्तर ( 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

कोटलिन का उपयोग करके चेक ऐप Android में स्थापित है या नहीं।

कोटलिन एक्सटेंशन बनाना।

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
}

1

इसे इस्तेमाल करे

इस कोड का उपयोग मौसम के अनुप्रयोग को पैकेज नाम के साथ स्थापित करने की जाँच करने के लिए किया जाता है या नहीं, यदि ऐसा नहीं है तो यह आपके ऐप के प्लेस्टोर लिंक को खोलेगा या आपके इंस्टॉल किए गए ऐप को

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

0

@Egemen Hamutçu का जवाब 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

सभी उत्तर केवल यह निश्चित करते हैं कि कुछ ऐप इंस्टॉल किया गया है या नहीं। लेकिन, जैसा कि हम सभी जानते हैं कि एक ऐप इंस्टॉल किया जा सकता है लेकिन उपयोगकर्ता द्वारा अक्षम किया जा सकता है, अनुपयोगी है।

इसलिए, यह समाधान दोनों के लिए जाँच करता है। अर्थात्, स्थापित और सक्षम ऐप्स

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

विधि को बुलाओ isPackageInstalled():

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

अब, बूलियन वैरिएबल का उपयोग करें isAppInstalledऔर जो चाहें करें।

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

0

अन्य समस्याओं का एक ठंडा जवाब। यदि आप उदाहरण के लिए "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;
}

0

कोटलिन suger के साथ इतना अच्छा:

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

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.