2015-09-29 5 views
29

मुझे कुछ विरासत कोड मिला है जिसे मैं मार्शमलो के लिए अनुमति सुरक्षित कर रहा हूं। PHONE_STATE अनुमति दी जाती है लेकिन फिर बाद में उपयोगकर्ता से इनकार किया तो जब वहाँ एक फोन कॉल वहाँ से संबंधित दुर्घटना एक अनुमति है हैएंड्रॉइड एम में प्रसारण रिसीवर के लिए अनुमति हटाने के साथ कैसे निपटें?

<receiver android:name="redacted.TheBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE"></action> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

:

एक प्रसारण के रूप में निम्नानुसार PHONE_STATE अनुमति का उपयोग कर रहा है। लेकिन क्रैश से पहले होता है ब्रॉडकास्ट रिसीवर के ऑनसेसिव() को कॉल किया जाता है (क्रैश एंड्रॉइड.एप.एक्टिविटी थ्रेड.handleReceiver में है)। इसका मतलब है कि प्रसारण रिसीवर को यह भी जांचने का मौका नहीं मिलता है कि अनुमति दी गई है या नहीं और उस स्थिति से निपटें।

तो मेरा सवाल यह है कि यदि कोई ब्रॉडकास्ट रिसीवर है, तो इस तरह कोड उस स्थिति से निपट सकता है जहां उपयोगकर्ता ने अनुमति को अक्षम कर दिया है क्योंकि AFAIK के पास अनुमतियों में बदलावों की निगरानी करने के लिए कोई एपीआई नहीं है, इसलिए वे कोड उस फ्लाई पर नहीं जान सकता है कि अनुमति रद्द कर दी गई है, और इसलिए यह अपने प्रसारण रिसीवर को अपमानित नहीं कर सकता है।

+2

क्या इस मामले में एक क्रैश संवाद दिखाई देता है? या यह एक "मूक" स्टैक ट्रेस है, जो सिर्फ लॉगकैट में दिख रहा है लेकिन उपयोगकर्ता अनुभव को सीधे नुकसान नहीं पहुंचा रहा है? यदि उत्तरार्द्ध, शायद उत्तर केवल उन संदेशों के साथ रहने के लिए है, और यह देखने के लिए कि क्या आप अनुमति धारण करते हैं और रिसीवर की सक्षम स्थिति को टॉगल करने के लिए 'एप्लिकेशन' के 'ऑनक्रेट() 'जैसे कुछ में जांचने के लिए है। लेकिन यदि उपयोगकर्ता एक ठेठ क्रैश संवाद देखता है ... यह बुरा है। – CommonsWare

+2

एक "दुर्भाग्यवश, XXX बंद हो गया है" संवाद है। – Gruntcakes

+3

ओउओ ... यह एक बढ़िया मामला है कि मैं शर्त लगा रहा हूं कि उन्होंने नहीं सोचा था। कम से कम स्टॉपगैप के रूप में, आपको यह सुनिश्चित करने के लिए 'अलार्ममेनगर' या कुछ जांचने की आवश्यकता हो सकती है कि अनुमति और रिसीवर स्थिति समय-समय पर सिंक्रनाइज़ हो जाती है। इससे निरस्त अनुमति और अगली 'अलार्म प्रबंधक' चेक के बीच कॉल के लिए मदद नहीं मिलेगी, लेकिन यह कुछ भी नहीं है। – CommonsWare

उत्तर

1

एंड्रॉयड Marsmallow में अनुमति के लिए के रूप में आप अपने प्राप्तकर्ता को इस तरह कहा जाता है से पहले की अनुमति की जांच कर सकते हैं:

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.PHONE_STATE) 
     != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.PHONE_STATE)) { 

     // Show an expanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       new String[]{Manifest.permission.PHONE_STATE}, 
       MY_PERMISSIONS_REQUEST_PHONE_STATE); 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

यह एक देर से जवाब है, लेकिन मैं यह किसी की सहायता करेगी !!!

1

एंड्रॉइड एम का अंतिम संस्करण अभी तक बाहर नहीं है (अंतिम एपीआई बाहर है, लेकिन प्लेटफ़ॉर्म कोड नहीं है), इसलिए उम्मीद है कि मंच आपके रिसीवर को कॉल करने से पहले अनुमति जांच को संभालेगा।

1

कोई सफलता के साथ 6.0.1 पर इस मुद्दे को पुन: उत्पन्न करने का प्रयास किया। मैं उपयोग किए गए test project के लिए एक लिंक संलग्न कर रहा हूं।
परिदृश्य सरल है:

  1. अनुमति के साथ चलाएं। सबकुछ अपेक्षित के रूप में काम करता है। onReceive कहा जाता है।
  2. अनुमति बंद करें। फ़ोन स्थिति बदलते समय ऐप क्रैश होने का अपेक्षित परिणाम नहीं होता है।

जब तक कि किसी के पास कोई अलग नतीजा न हो, मुझे लगता है कि यह समस्या एक तरह से "हल" है।

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