2012-06-17 8 views
10

क्या यह जानने का कोई तरीका है कि अमेज़ॅन ऐप स्टोर या Google Play Store से कोई एप्लिकेशन डाउनलोड किया गया है या नहीं? मेरा मतलब है, ऐप के भीतर ही।कैसे पता चले कि Google Play या अमेज़ॅन से कोई ऐप डाउनलोड किया गया है या नहीं?

मैं दोनों साइटों के लिए एक ऐप्लिकेशन तैनात किया है और मैं नहीं बल्कि जहां ग्राहक आवेदन के भीतर इसे डाउनलोड किया गया है से जानना चाहते। मुझे पता है, मैं प्रत्येक सेवा में विभिन्न अनुप्रयोगों को तैनात कर सकता हूं, लेकिन यह कुछ रखरखाव कार्य जोड़ता है जिसे उसी पैकेज का उपयोग करके ऐप के भीतर एक सशर्त के साथ हल करने के कुछ तरीके थे, इससे बचा जा सकता है।

+3

क्यों न सिर्फ विज्ञप्ति दिखा जहां यह करने के लिए अपलोड किया गया था में से प्रत्येक के भीतर एक चर है? या उपयोगकर्ता के रूप में एक विकल्पपैन है ... –

+9

'पैकेज प्रबंधक 'और' getInstallerPackageName() 'आपको बताएगा कि इंस्टॉलर क्या था। आपको अपने विभिन्न परिदृश्यों के तहत क्या लौटाता है यह देखने के लिए प्रयोगों को चलाने होंगे। – CommonsWare

+0

@ फ़ारन यदि आपने प्रयोग किया है तो आप किसके साथ आए थे? – ahsteele

उत्तर

12

कोड में:

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

"com.android.vending" आपको बताता है कि यह Google Play स्टोर से आया था। मुझे यकीन नहीं है कि अमेज़ॅन ऐपस्टोर क्या है, लेकिन उपर्युक्त कोड का उपयोग करके परीक्षण करना आसान होना चाहिए।

वाया एडीबी:

adb shell pm dump "PACKAGE_NAME" | grep "vending" 

उदाहरण:

adb shell pm dump "com.android.chrome" | grep "vending" 

installerPackageName=com.android.vending 
+0

जब एंड्रॉयड स्टूडियो डीबगर से जुड़ी है और दोनों एक गूगल नेक्सस 7 के साथ ही एक Kindle Fire HD के लिए सीधी निर्माण इस पैदावार 'null' के' installerPackageName'। क्या यह डीबगर से कनेक्ट होने पर अपेक्षित है? और यह रिलीज.एपीके होने पर कानूनी स्ट्रिंग वापस कर देगा? –

+1

हां और नहीं। ऐप स्टोर के माध्यम से ऐप इंस्टॉल नहीं किया गया है, या जब इंस्टॉल ऐप स्टोर फ़ील्ड सेट नहीं करता है तो 'null' की अपेक्षा की जाती है। एंड्रॉइड स्टूडियो द्वारा उपयोग किया जाने वाला इंस्टॉलर फ़ील्ड सेट नहीं करता है, इसलिए यह शून्य है। (मेरे लिए, जैसा कि "रन" टैब में देखा गया है 'डिवाइस शेल कमांड: pm install -r "/data/local/tmp/com.mypackage.myapp" ') किसी भी मामले में, एंड्रॉइड स्टूडियो लगभग निश्चित रूप से मूल्य निर्धारित नहीं करेगा 'com.android करने के लिए।वेंडिंग ', लेकिन' com.android.studio' या कुछ 'की संभावना अधिक है। – nmr

1

ज्यादातर मामलों में आप एक चेक इस के समान शामिल करके दुकान का नाम प्राप्त कर सकते हैं जबकि:

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } else if ("com.amazon.venezia".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Amazon Appstore 
    } else { 
     // App was installed from somewhere else 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

"com.andr oid.vending "Google Play स्टोर और है
" com.amazon.venezia "अमेज़न एपस्टोर है, और
अशक्त जब यह बीटा के दौरान साइडलोड था

परिणाम तथापि अविश्वसनीय हो सकते हैं, उदाहरण के लिए के रूप में, एक दुकान का परीक्षण यह मान सेट नहीं हो सकता है, और इसके अलावा यह संस्थापक के पैकेज का नाम है कि एक दुकान नाम के रूप में व्याख्या की जा सकती निर्दिष्ट करने अपने अनुप्रयोग में साइडलोड संभव है:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK> 

आप विभिन्न दुकानों के लिए अलग-अलग पैकेज के नाम रखने पर विचार करने के लिए उदाहरण के लिए चाहते हो सकता है अमेज़ॅन के लिए "com.example.yourapp" और "com.example.yourapp.amazon" के लिए - आप आसानी से कर सकते हैं ily उनको अपनी ग्रैडल स्क्रिप्ट में सेट करें।

संबंधित मुद्दे

 संबंधित मुद्दे