पृष्ठभूमिएंड्रॉयड कस्टम अनुमतियां - Marshmallow
ऐतिहासिक रूप से, एंड्रॉयड कस्टम अनुमतियां have been a mess और were install order dependent, जो expose vulnerabilities जाना जाता था।
एपीआई 21 से पहले, एक अनजान कामकाज था जिससे आपके मैनिफेस्ट में किसी अन्य एप्लिकेशन की कस्टम अनुमति की घोषणा की गई, अनुमति दी गई ... हालांकि, एपीआई 21 के बाद से, केवल एक आवेदन कस्टम अनुमति घोषित कर सकता है और स्थापना एक ही अनुमति घोषित करने वाला एक और आवेदन, रोका जाएगा।
विकल्पों को अनुमति की आवश्यकता वाले एप्लिकेशन को पुनर्स्थापित करना है, इसलिए उन्हें सिस्टम द्वारा पता चला है, लेकिन is not a good user experience। या कॉलिंग एप्लिकेशन की अनुमतियों के लिए रनटाइम पर जांचें, लेकिन that is not without its theoretical flaws।
समस्या
एंड्रॉयड Marshmallow (6.0 - एपीआई 23) के रूप में एक आवेदन पत्र अपने स्वयं के कस्टम अनुमति उपयोग करने के लिए उपयोगकर्ता, से अनुमति का अनुरोध करने की जरूरत है। एक घोषित कस्टम अनुमति स्वचालित रूप से प्रदान नहीं की जाती है।
यह असाधारण लगता है, यह देखते हुए कि केवल एक ही एप्लिकेशन इसे घोषित कर सकता है।
को दोहराने के लिए
कस्टम अनुमति और प्रकट में एक BroadcastReceiver घोषित।
<permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
android:description="@string/control_description"
android:icon="@mipmap/ic_launcher"
android:label="@string/control_label"
android:protectionLevel="normal or dangerous"/>
<uses-permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>
// etc
<receiver
android:name="com.example.app.MyBroadcastReceiver"
android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
<intent-filter android:priority="999">
<action android:name="com.example.app.REQUEST_RECEIVER"/>
</intent-filter>
</receiver>
एक तीसरे पक्ष के आवेदन से, घोषणा करते हैं कि यह प्रकट में कस्टम अनुमति का उपयोग करता है (और एक संवाद या सेटिंग के माध्यम से इसे स्वीकार करते हैं) और कॉल:
final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");
context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// getResultCode();
}
}, null, Activity.RESULT_CANCELED, null, null);
परिणाम रद्द वापस आ जाएगी और लॉग दिखाएगा:
system_process डब्ल्यू/BroadcastQueue: अनुमति इनकार: आशय प्राप्त { अधिनियम = com.example.app.REQUEST_RECEIVER FLG = 0x10 (अतिरिक्त है)} को,210 com.example.app/.MyBroadcastReceiver इस com.example.thirdparty
अगर मैं मानक ActivityCompat.requestPermissions()
संवाद का उपयोग उपयोगकर्ता की अनुमति स्वीकार करने के लिए अनुमति देने के लिए की वजह से com.example.app.permission.CONTROL_EXAMPLE_APP की आवश्यकता है , रिसीवर, जैसा कि आप उम्मीद करेंगे, सही ढंग से काम करता है।
प्रश्न
इस अपेक्षित व्यवहार है? या मैंने किसी चीज़ को अनदेखा किया है?
यह एक संवाद
आवेदन उदाहरण अनुप्रयोग का उपयोग करने के उदाहरण अनुप्रयोग
अनुमति चाही है कह बढ़ाने के लिए हास्यास्पद लग रहे हैं और यह वास्तव में चिंता का विषय उपयोगकर्ता कर सकते हैं, उन्हें इस तरह के एक अतर्कसंगत के साथ प्रदान करेगा निवेदन।
मैं निश्चित रूप से अनुमति विवरण और नाम बदल सकता हूं, जिसे वे स्वीकार करेंगे, जैसे 'अन्य स्थापित अनुप्रयोगों' के साथ संवाद करें, लेकिन इससे पहले कि मैं चिल्लाता हूं और उस दृष्टिकोण को लेता हूं, मैंने सोचा कि मैं यह पूछूंगा सवाल।
नोट
आदेश दिया प्रसारण के उदाहरण समस्या को दोहराने के लिए है। मेरा आवेदन सामग्री प्रदाताओं और एक बाध्य सेवा के अन्य कार्यान्वयन का उपयोग करता है। यह एक वैकल्पिक कार्यान्वयन नहीं है जो मुझे चाहिए, यह इस मुद्दे की पुष्टि है।
इसे पढ़ने के लिए धन्यवाद।
संपादित करें: अन्य कार्यान्वयन के लिए, जैसे सेवा पर एक अनुमति (जो दोहराना सबसे आसान होगा) घोषित कस्टम अनुमति स्वचालित रूप से दी जाती है।
FWIW, मैं कम से कम एंड्रॉइड 7.1 (Google पिक्सेल) पर आपकी समस्या का पुन: उत्पन्न नहीं कर सकता। मैंने आपके कोड को एक नए एंड्रॉइड स्टूडियो प्रोजेक्ट में कॉपी किया है और क्लाइंट से रिसीवर तक प्रसारण भेजने और प्रतिक्रिया प्राप्त करने में कोई समस्या नहीं है। अब, मेरा नमूना आपके से सरल हो सकता है (उदा।, दोनों ऐप्स एक ही हस्ताक्षर कुंजी द्वारा हस्ताक्षरित हैं)। यदि आप एक नमूना ऐप बना सकते हैं जो लगातार इस समस्या को पुन: उत्पन्न करता है, और आप इसे नमूना ऐप और पूर्ण निर्देश सहित डेवलपर पूर्वावलोकन के विरुद्ध 7.1 पर [पुन: उत्पन्न कर सकते हैं] [http://b.android.com) को पुन: उत्पन्न कर सकते हैं। – CommonsWare
बस स्पष्ट होने के लिए, क्या आप दिशानिर्देश के लिए पूछ रहे हैं कि उपयोगकर्ता से उचित तरीके से अनुमति का अनुरोध कैसे करें, वह इनकार नहीं करेगा? या क्या आप अपनी अनुमति को अस्वीकार करते समय समाधान का प्रस्ताव देने के लिए कह रहे हैं कि संभावनाएं क्या हो सकती हैं? मैं उलझन में हूं –
मुझे लगता है कि ऐप अपनी अनुमति का अनुरोध करने के लिए "मास्टर स्विच" के रूप में व्याख्या की जा सकती है, जैसे कुछ: "अन्य ऐप्स इस ऐप को नियंत्रित करने दें"। और भले ही अनुमति ऐप को नियंत्रित करने में सक्षम होने के लिए तीसरे पक्ष के ऐप्स (भी) में अनुमति दी जानी चाहिए, कुछ उपयोगकर्ता वास्तव में "नियंत्रण" सुविधा को पूरी तरह से अस्वीकार करने के लिए इसका उपयोग कर सकते हैं। (लेकिन फिर भी अजीब बात यह है कि उदाहरण के लिए एक सेवा स्वचालित अनुमति स्वचालित रूप से प्राप्त हो जाती है ...) – Gyebro