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

var info : ApplicationInfo? = null
try {
    info = pm.getApplicationInfo(packageName, 0) as ApplicationInfo
} catch (e: PackageManager.NameNotFoundException){
    val intent = Intent(Intent.ACTION_VIEW)
    intent.data = Uri.parse("market://details?id=$packageName")
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    context.startActivity(intent)
}

if (info != null) {
    val intent = pm.getintentForPackage(packageName) as Intent
    context.startActivity(intent)
}

उदाहरण के लिए यह स्निपेट एपीआई 26 (एंड्रॉइड 8) के लिए अब तक अच्छा काम करता है। लेकिन एपीआई 30 (एंड्रॉइड 11) के लिए getApplicationInfo() हमेशा एक NameNotFoundException फेंकता है, तब भी जब मैंने पहले ही ऐप इंस्टॉल कर लिया हो।

यहां क्या गलत है?

0
Mr.T 2 नवम्बर 2020, 16:08

1 उत्तर

सबसे बढ़िया उत्तर

Android 11 पर, PackageManager जैसे getApplicationInfo() अब डिफ़ॉल्ट रूप से काम नहीं करता है। आपको या तो चाहिए:

  • उन्हें फोन न करें, या
  • अपने मेनिफेस्ट में एक <queries> तत्व जोड़ें, उन तृतीय-पक्ष एप्लिकेशन को श्वेतसूची में शामिल करें जिन्हें आप ढूंढना चाहते हैं, या
  • MANAGE_ALL_APPS अनुमति का अनुरोध करें (और Play Store से आपके ऐप के प्रतिबंधित होने का जोखिम उठाएं)

आपके मामले में, <queries> तत्व शायद एक सुरक्षित विकल्प है, यह मानते हुए कि आप जिस एप्लिकेशन आईडी की तलाश कर रहे हैं उसकी सूची संकलन समय पर जानने योग्य है।

0
CommonsWare 2 नवम्बर 2020, 13:27