जांचें कि क्या एप्लिकेशन इंस्टॉल है - एंड्रॉइड


104

मैं Google Play से ऐप्स इंस्टॉल करने का प्रयास कर रहा हूं। मैं समझ सकता हूं कि Google Play store URL खोलने पर, यह Google Play को खोलता है और जब मैं बैक बटन दबाता हूं, तो गतिविधि फिर से शुरू हो जाती है।

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

जब मैं वापस गतिविधि में चला गया, तो मैंने यह onResume()जांचने के लिए कॉल करने की कोशिश की कि क्या ऐप इंस्टॉल है, लेकिन मुझे एक त्रुटि मिली:

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

त्रुटि इस प्रकार है:

E / AndroidRuntime (796): java.lang.RuntimeException: गतिविधि प्रारंभ करने में असमर्थ ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: Android .content.ActivityNotFoundException: Intent {अधिनियम = Android को हैंडल करने के लिए कोई गतिविधि नहीं मिली। .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x400800/2}

मुझे लगता है कि गतिविधि है onPause()। क्या इसे लागू करने का एक बेहतर तरीका है? यदि एप्लिकेशन इंस्टॉल करना समाप्त हो गया है, तो मैं जांचने का प्रयास कर रहा हूं।



@SiddharthanAsokan अगर मैं सही तरीके से समझूं, तो आप यहां क्या हासिल करने की कोशिश कर रहे हैं, अपना ऐप शुरू करें -> प्ले स्टोर पर जाएं-> इंस्टॉल पर क्लिक करें -> अपनी गतिविधि पर वापस आएं -> नए इंस्टॉल किए गए ऐप को शुरू करें .. क्या यह सही है?
वरुण

नोप वापस उस ऐप पर जाएं जो मैंने शुरू में खोला था। मुझे PackageManager का उपयोग करके इंस्टॉल किए गए ऐप के बारे में कुछ जानकारी प्राप्त करने की आवश्यकता है। यह जानकारी पुनर्प्राप्ति तब शुरू होती है जब मैं उस ऐप को इंस्टॉल करता हूं, जिसका इस्तेमाल वेब url खोला गया था।
सिद्धार्थ आसोकन

जवाबों:


300

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

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

यह उस पैकेज के बारे में जानकारी प्राप्त करने का प्रयास करता है जिसका नाम आपने पास किया था। असफल होने पर, यदि NameNotFoundExceptionउसे फेंक दिया गया था, तो इसका मतलब है कि उस नाम वाला कोई पैकेज स्थापित नहीं है, इसलिए हम वापस लौट आए false

ध्यान दें कि हम PackageManagerइसके बजाय पास करते हैं Context, ताकि विधि थोड़ा अधिक लचीली रूप से प्रयोग करने योग्य हो और डेमेटर के कानून का उल्लंघन न हो । Contextजब तक आपके पास कोई PackageManagerउदाहरण है , तब तक आप बिना पहुंच के विधि का उपयोग कर सकते हैं ।

इसे इस तरह उपयोग करें:

public void someMethod() {
    // ...

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

    // ...
}

1
शर्त यह है: मुझे इस इंस्टॉलेशन प्रक्रिया को जांचने की जरूरत है अगर यह किया जाता है। मैं इंस्टॉल पर क्लिक करता हूं और इस दौरान मैं लूप में इंस्टॉलेशन के लिए जांच करने की कोशिश करता हूं। कोड ठीक है, लेकिन अगर जाँच पूरी हो गई है तो जाँच करने का तरीका वही है जो इम की तलाश में है।
सिद्धार्थन असोकन

3
@SiddharthanAsokan आप package_added कार्रवाई के लिए एक प्रसारण रिसीवर का उपयोग कर सकते हैं।
वरुण

@ वरुण मैंने अभी कोड संपादित किया है। इसका कोई और अधिक ऐप पैकेज नाम im उपयोग नहीं कर रहा है। Google Play Store में ऐप का केवल वेब url
सिद्धार्थ असोकन

@ रॉबिन कैंटर कृपया मेरे द्वारा किए गए परिवर्तनों की समीक्षा करें
सिद्धार्थ

आपने अपने प्रश्न में जो किया वह मेरे उत्तर के समान है।
रॉबिन कैंटर्स

33

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

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

यह स्थापित और सक्षम ऐप्स के लिए जाँच करता है :

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

आप इस विधि को एक कक्षा में रख सकते हैं जैसे कि Utilsऔर इसका उपयोग करके हर जगह कॉल करें:

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

5

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

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

तेजी से समाधान:

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

getPackageGidsसे कम खर्चीला है getPackageInfo, इसलिए यह तेजी से काम करता है।

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

नोट: यह कुछ वर्चुअल स्पेस में काम नहीं करेगा। वे एंड्रॉइड एपीआई का उल्लंघन कर सकते हैं और हमेशा एक सरणी वापस कर सकते हैं, भले ही उस पैकेज के नाम के साथ कोई एप्लिकेशन न हो।
इस मामले में, का उपयोग करें 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());

// स्थापित पैकेज की जाँच करने का तरीका सही / गलत है

  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

अगर आप इसे बिना ट्राई कैच ब्लॉक के ट्राई करना चाहते हैं, तो निम्न विधि का उपयोग कर सकते हैं, एक आशय बनाएँ और उस ऐप के पैकेज को सेट करें जिसे आप सत्यापित करना चाहते हैं

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

और एप्लिकेशन को स्थापित करने के लिए जाँच करने के लिए निम्न विधि को कॉल करें

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

0

जो लोग कोटलिन समाधान की तलाश में हैं वे इस विधि का उपयोग कर सकते हैं,

यहाँ मैंने पूर्ण कोड साझा किया है, और सक्षम स्थिति को भी संभाला है। जांचें कि एप्लिकेशन Android Kotlin में स्थापित है या नहीं

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
यह एक अनंत लूप है।
रॉबिन कैंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.