11

Google Play पर मेरे ऐप्स के साथ समस्याएं हैं। मेरे पास एक निशुल्क ऐप है जो कस्टम अनुमति का उपयोग करता है। यह अनुमति भुगतान किए गए ऐप्स तक पहुंच की अनुमति देती है। ये सशुल्क ऐप्स "कुंजी" के रूप में कार्य करते हैं और निःशुल्क ऐप में सुविधाओं को अनलॉक करते हैं। असल में मुफ्त ऐप भुगतान किए गए ऐप्स में से किसी एक के इरादे को शुरू करने का प्रयास करेगा। सशुल्क ऐप कुछ सामान करेगा और यह कहकर वापस आ जाएगा कि नि: शुल्क ऐप को सुविधाओं को अनलॉक करना चाहिए या नहीं।ऐप इंस्टॉल ऑर्डर पर आधारित एंड्रॉइड कस्टम अनुमति विफलता

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

  • नि: शुल्क एप्लिकेशन प्रकट (प्रासंगिक कोड):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1"); 
    KeyApp.putExtra("com.company.license.challenge", 1); 
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown 
    try { 
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP); 
    } catch (Exception e) { 
        cancelStartUp(); 
    } 
    
  • सशुल्क ऐप प्रकट (प्रासंगिक कोड):

    ... 
    <uses-permission android:name="com.company.license.PERMISSION" /> 
    ... 
    
  • नि: शुल्क एप्लिकेशन कोड आशय (प्रासंगिक कोड) की जाँच करने के लिए:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.company.installer.1" 
    ... 
    <permission 
        android:name="com.company.license.PERMISSION" 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:protectionLevel="normal" > 
    </permission> 
    
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoDisplay" > 
    
        <activity 
         android:name="com.company.license.auth" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:permission="com.company.license.PERMISSION" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="com.company.license.action.AUTH_1" /> 
    
          <category android:name="android.intent.category.DEFAULT" /> 
         </intent-filter> 
        </activity> 
    
        <activity 
         android:name="com.company.installer.redirect" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
    
          <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter> 
        </activity> 
    </application> 
    
    </manifest> 
    

उत्तर

11

दोनों ऐप्स में एक ही <permission> तत्व रखें। इसके अतिरिक्त, क्योंकि यह आपके दो ऐप्लिकेशन के लिए विशिष्ट है, मैं android:protectionLevel="signature" बजाय normal का प्रयोग करेंगे - इसका मतलब है उपयोगकर्ता की अनुमति स्वीकृत करने की आवश्यकता कभी नहीं होगा और किसी और अनुमति का अनुरोध करने में सक्षम हो जाएगा। और, यह नुस्खा किसी भी क्रम में स्थापना की अनुमति देगा।

अद्यतन: नोट, हालांकि, कस्टम अनुमतियों का उपयोग potential vulnerabilities, due to Android's "first one in wins" approach खुलता है।

अद्यतन # 2: और यह अब no longer supported as of Android 5.0 है, के रूप में दो क्षुधा एक ही <permission> तत्व दोनों नहीं कर सकते जब तक कि वे एक ही हस्ताक्षर कुंजी के हस्ताक्षर होते हैं।

+1

यह चाल है। धन्यवाद! –

+4

समस्या: यदि पहले स्थापित ऐप निर्दिष्ट करता है और उसी अनुमति के लिए <उपयोग-अनुमति> निर्दिष्ट करता है, तो उपयोगकर्ता को इंस्टॉल समय पर अनुमति अनुरोध के बारे में सूचित नहीं किया जाता है। दूसरे ऐप इंस्टॉल होने के बाद, पहला एप उस ऐप की आवश्यकता वाले दूसरे ऐप के घटकों तक पहुंच सकता है। प्रमुख सुरक्षा समस्या? –

+0

@ मार्ककार्टर: उपयोगकर्ता को निश्चित रूप से 'हस्ताक्षर'-स्तर अनुमतियों के लिए संकेत नहीं दिया जाएगा। हालांकि, यह वास्तव में स्थापना आदेश पर निर्भर नहीं है; 'हस्ताक्षर '-स्तर अनुमतियां कभी प्रकट नहीं होतीं। चूंकि 'हस्ताक्षर'-स्तर अनुमतियां एक डेवलपर (या टीम) द्वारा लिखे गए कोड के लिए हैं, धारणा यह है कि ये अनुमतियां आंतरिक संचार के लिए कितनी मात्रा में नियंत्रण कर रही हैं, और उपयोगकर्ता को परेशान करने की आवश्यकता नहीं है। यदि, हालांकि, आप अपने वर्णित व्यवहार को कस्टम 'सामान्य' या 'खतरनाक' अनुमतियों के साथ देख रहे हैं, जो मुझे आश्चर्यचकित करेगा, और मुझे और अधिक शोध करने की आवश्यकता होगी। – CommonsWare

2

मैं चारों ओर के अंक में अपने # 2 अद्यतन उल्लेख @CommonsWare काम करने में सक्षम था। बस द्वारा केवल ऐप में अनुमति घोषित करें जो पहले स्थापित की जाएगी।

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

क्योंकि एप्लिकेशन बी (प्रवेश) सेवा मैं एप्लिकेशन बी App में कस्टम अनुमति घोषित हो रहा है स्थापित करता है बनाता है बी में एक (इरादा) सेवा है जो अन्य ऐप्स उपयोग कर सकती है, जब तक वे अनुमति का उपयोग करें और हमारे श्वेतसूची में हों। तो ऐप बी की सेवा और अनुमति घोषित की गई थी।

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

लेकिन तब मैं एंड्रॉयड 5 पर परीक्षण किया और उनके अद्वितीय अनुमति परिवर्तन का सामना किया।इसलिए मैंने कुछ प्रवाह और अनुमति घोषणाओं का परीक्षण किया और एक समाधान समाधान के साथ आया: पहले इंस्टॉल होने वाले ऐप में कस्टम अनुमति की घोषणा करें! बेशक यह केवल तभी काम करता है जब आप जानते हैं कि कौन सा ऐप पहले स्थापित किया जा रहा है। लेकिन मेरे मामले में, जहां ऐप ए ऐप बी ऐन्ड ऐप पर निर्भर है ए ऐप बी इंस्टॉल करता है, यह समाधान था :)

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