2016-07-06 8 views
30

पृष्ठभूमिएंड्रॉयड कस्टम अनुमतियां - 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 की आवश्यकता है , रिसीवर, जैसा कि आप उम्मीद करेंगे, सही ढंग से काम करता है।

प्रश्न

इस अपेक्षित व्यवहार है? या मैंने किसी चीज़ को अनदेखा किया है?

यह एक संवाद

आवेदन उदाहरण अनुप्रयोग का उपयोग करने के उदाहरण अनुप्रयोग

अनुमति चाही है कह बढ़ाने के लिए हास्यास्पद लग रहे हैं और यह वास्तव में चिंता का विषय उपयोगकर्ता कर सकते हैं, उन्हें इस तरह के एक अतर्कसंगत के साथ प्रदान करेगा निवेदन।

मैं निश्चित रूप से अनुमति विवरण और नाम बदल सकता हूं, जिसे वे स्वीकार करेंगे, जैसे 'अन्य स्थापित अनुप्रयोगों' के साथ संवाद करें, लेकिन इससे पहले कि मैं चिल्लाता हूं और उस दृष्टिकोण को लेता हूं, मैंने सोचा कि मैं यह पूछूंगा सवाल।

नोट

आदेश दिया प्रसारण के उदाहरण समस्या को दोहराने के लिए है। मेरा आवेदन सामग्री प्रदाताओं और एक बाध्य सेवा के अन्य कार्यान्वयन का उपयोग करता है। यह एक वैकल्पिक कार्यान्वयन नहीं है जो मुझे चाहिए, यह इस मुद्दे की पुष्टि है।

इसे पढ़ने के लिए धन्यवाद।

संपादित करें: अन्य कार्यान्वयन के लिए, जैसे सेवा पर एक अनुमति (जो दोहराना सबसे आसान होगा) घोषित कस्टम अनुमति स्वचालित रूप से दी जाती है।

+1

FWIW, मैं कम से कम एंड्रॉइड 7.1 (Google पिक्सेल) पर आपकी समस्या का पुन: उत्पन्न नहीं कर सकता। मैंने आपके कोड को एक नए एंड्रॉइड स्टूडियो प्रोजेक्ट में कॉपी किया है और क्लाइंट से रिसीवर तक प्रसारण भेजने और प्रतिक्रिया प्राप्त करने में कोई समस्या नहीं है। अब, मेरा नमूना आपके से सरल हो सकता है (उदा।, दोनों ऐप्स एक ही हस्ताक्षर कुंजी द्वारा हस्ताक्षरित हैं)। यदि आप एक नमूना ऐप बना सकते हैं जो लगातार इस समस्या को पुन: उत्पन्न करता है, और आप इसे नमूना ऐप और पूर्ण निर्देश सहित डेवलपर पूर्वावलोकन के विरुद्ध 7.1 पर [पुन: उत्पन्न कर सकते हैं] [http://b.android.com) को पुन: उत्पन्न कर सकते हैं। – CommonsWare

+0

बस स्पष्ट होने के लिए, क्या आप दिशानिर्देश के लिए पूछ रहे हैं कि उपयोगकर्ता से उचित तरीके से अनुमति का अनुरोध कैसे करें, वह इनकार नहीं करेगा? या क्या आप अपनी अनुमति को अस्वीकार करते समय समाधान का प्रस्ताव देने के लिए कह रहे हैं कि संभावनाएं क्या हो सकती हैं? मैं उलझन में हूं –

+0

मुझे लगता है कि ऐप अपनी अनुमति का अनुरोध करने के लिए "मास्टर स्विच" के रूप में व्याख्या की जा सकती है, जैसे कुछ: "अन्य ऐप्स इस ऐप को नियंत्रित करने दें"। और भले ही अनुमति ऐप को नियंत्रित करने में सक्षम होने के लिए तीसरे पक्ष के ऐप्स (भी) में अनुमति दी जानी चाहिए, कुछ उपयोगकर्ता वास्तव में "नियंत्रण" सुविधा को पूरी तरह से अस्वीकार करने के लिए इसका उपयोग कर सकते हैं। (लेकिन फिर भी अजीब बात यह है कि उदाहरण के लिए एक सेवा स्वचालित अनुमति स्वचालित रूप से प्राप्त हो जाती है ...) – Gyebro

उत्तर

-1

हालांकि उपयोगकर्ता के लिए एक ही ऐप में घोषित ऐप के लिए अनुमति अनुरोध देखने के लिए संदिग्ध हो सकता है, यह है कि एंड्रॉइड को मार्शमलो के बाद चलाने के लिए डिज़ाइन किया गया है। मुझे लगता है, एंड्रॉइड के परिप्रेक्ष्य पर, व्यवहार इरादा और सही है।

+0

यह कथन सही नहीं हो सकता है, क्योंकि कस्टम अनुमति स्वचालित रूप से अन्य परिस्थितियों में दी जाती है - इसलिए यह सार्वभौमिक रूप से 'डिज़ाइन द्वारा' नहीं है – brandall

0

मुझे लगता है कि आपके उदाहरण में समस्या यह है कि आपको स्पष्ट रूप से दोनों की आवश्यकता है, आपके अनुप्रयोगों को कस्टम अनुमति दी गई है।

इस भाग की आवश्यकता है, कि com.example.thirdparty एप्लिकेशन की अनुमति है:

<receiver 
    android:name="com.example.app.MyBroadcastReceiver" 
    android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP"> 

और इस हिस्से की आवश्यकता है, कि com.example.app आवेदन अनुमति के रूप में अच्छी तरह से है:

context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", ... 

आप उल्लेख करते हैं कि सेवा का उपयोग करते समय आपको यह समस्या नहीं है। मैं कैसे वास्तव में आप सेवा का उपयोग नहीं पता है, लेकिन अगर आप बस इस तरह यह घोषणा: इस तरह

<service 
    android:name="com.example.app.MyService" 
    android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP"> 

और फिर इसे बाँध:

context.bindService(serviceIntent, mServiceConnection, ... 

तो यह अगर com.example काफी है .thirdparty की अनुमति है, जबकि com.example.app को इसकी आवश्यकता नहीं है।

दूसरे शब्दों में, मुझे लगता है कि इस व्यवहार डिज़ाइन द्वारा है, और अंतर आप प्रसारण और सेवा व्यवहार के बीच देखना है, क्योंकि प्रसारण मामले में आप विशेष रूप से अनुरोध है कि com.example.app कस्टम की अनुमति है, जबकि सेवा मामले में आप नहीं करते हैं।

मुझे आशा है कि मैंने आपकी समस्या को गलत समझा नहीं है। अगर मैंने किया, तो कृपया मुझे बताएं और मैं इस प्रतिक्रिया को हटा दूंगा।

-2
मैनिफ़ेस्ट फ़ाइल में

पहले ऐड अनुमतियों के बाद

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
1

के रूप में मैं समझ गया कि आप अगली बात करने की कोशिश की (कम से कम, कि कैसे मैं आपकी समस्या को पुन: पेश करने में सक्षम था है):

  1. आप पहले अपनी नई कस्टम अनुमति घोषित करें (इसे कॉल करें एफ) आवेदन

    <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"/> 
    
  2. आप परिभाषित करते हैं कि आपका एफ ऐप com.example.app.permission.CONTROL_EXAMPLE_APP अनुमति का उपयोग करता है। यह सही है क्योंकि दिशानिर्देश कहते हैं।

    <uses-permission 
        android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/> 
    
  3. आप अपने एफ ऐप में अपना कस्टम प्रसारण रिसीवर घोषित करते हैं। उस के साथ अपने अनुप्रयोग प्रसारित बातचीत करने के लिए अपने कस्टम अनुमति प्राप्त करनी होगी (यह कोई फर्क नहीं पड़ता जो एक, एफ या अन्य अनुप्रयोग है)

    <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> 
    
  4. आप को परिभाषित आप दूसरा (की सुविधा देता है यह एस कहते हैं) आवेदन com.example.app.permission.CONTROL_EXAMPLE_APP अनुमति का उपयोग करता है। क्योंकि आप एस ऐप को एफ ऐप रिसीवर को प्रसारण संदेश भेजने की अनुमति देना चाहते हैं।

    <uses-permission 
        android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/> 
    
  5. अंत में आप इस कोड का उपयोग कर अपने एस app से प्रसारण संदेश भेजने का प्रयास करें।

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

    और, इस महत्वपूर्ण है, तो आप अपने एस एप्लिकेशन करने की अनुमति दी, लेकिन आप अपने एफ अनुप्रयोग के लिए अनुमति नहीं दी।

    परिणामस्वरूप आपका प्रसारण रिसीवर एफ ऐप में घोषित नहीं हुआ था।

  6. आपके एफ ऐप को अनुमति देने के बाद (ध्यान दें कि अब एस और एफ ने आपकी कस्टम अनुमति दी है) सब कुछ ठीक काम करता है। एफ ऐप में घोषित ब्रॉडकास्ट रिसीवर एस ऐप से संदेश प्राप्त हुआ।

मुझे लगता है कि सही व्यवहार है, क्योंकि इस doc हमें का कहना है:

ध्यान दें कि, इस उदाहरण में, DEBIT_ACCT अनुमति न केवल तत्व के साथ की घोषणा की, है इसके उपयोग भी अनुरोध किया गया है तत्व के साथ। सुरक्षित गतिविधि, लॉन्च करने के लिए आवेदन के अन्य घटकों को के लिए आपको इसके उपयोग का अनुरोध करना होगा, भले ही सुरक्षा स्वयं ही एप्लिकेशन द्वारा लगाई गई हो।

और ऐप जो अनुमति घोषित करता है उसे भी अपने साथ संवाद करने के लिए एक ही अनुमति का अनुरोध करना होगा।

परिणामस्वरूप, एंड्रॉइड एपीआई 23 को पहले आपके अनुमति फॉर्म उपयोगकर्ता का उपयोग करने के लिए उपयोग करना चाहिए। और हमें एफ एप से पहले 2 अनुमोदित अनुमतियां प्राप्त करनी होंगी (क्योंकि गाइडलाइन उस के रूप में कहती है) और एस ऐप से दूसरी (क्योंकि हमें केवल पहुंच प्राप्त करने की आवश्यकता है)।

लेकिन मैं अपने अगले अंक समझ नहीं आया:

यह एक संवाद

आवेदन उदाहरण अनुप्रयोग उदाहरण अनुप्रयोग

उपयोग करने की अनुमति चाहता है कह बढ़ाने के लिए हास्यास्पद प्रतीत होता है

मेरा मूल एंड्रॉइड एपीआई 23 मुझे ऐसा कुछ दिखाता है:

आवेदन उदाहरण अनुप्रयोग

0

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

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