5

मेरे पास एक प्रोजेक्ट है जिसमें मैं स्टार्टअप पर 2 अनुमतियों के लिए पूछता हूं। डिबगिंग में, यह तब तक काम करता है जब तक यह दूसरी कॉल को requestPermissions पर नहीं बनाता है। जैसे ही यह करता है, पहला onRequestPermissionsResult खाली grantResults सरणी के साथ आग लगाता है।कॉलिंग अनुरोध कस्टम कर्नेल पर दो बार अनुमतियाँRequestPermissions उपयोगकर्ता प्रतिक्रिया से पहले परिणाम

यह आज तक ठीक काम करता है। एकमात्र चीज जिसे मैं सोच सकता हूं वह अद्यतन है जो मैंने आज किया है। मैंने एंड्रॉइड एसडीके प्लेटफार्म टूल्स 23.1 में अपडेट किया, और मैक कैपिटन में अपना मैक अपडेट किया।

क्या कोई भी मुझे ठीक करने में मदद कर सकता है?

कोड इस प्रकार है:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.blank_layout); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     if (hasCameraPermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_CODE); 
     } 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasStoragePermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION_CODE); 
     } 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } else { 
     startCameraIntent(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CAMERA_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.camera_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
     case REQUEST_STORAGE_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.storage_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } 
} 

संपादित :: परिवर्तन यह है कि दुर्घटना के लिए इस वजह से तथ्य यह है कि मैं कस्टम कर्नेल ElementalX 5 कुछ दिन पहले स्थापित किया था मेरी नेक्सस पर था। मैंने कल अपने भाई के नेक्सस 6 पर उसी कर्नेल का उपयोग करके इस मुद्दे की पुष्टि की। मैं कर्नेल डेवलपर को यह देखने के लिए एक ईमेल शूट करने जा रहा हूं कि वह इसके बारे में क्या कहता है।

हालांकि उत्तर में, ऊपर दिए गए कोड वास्तव में requestPermissions विधि का उपयोग करने का गलत तरीका है। तो हर कोई बस इसे सही तरीके से करते हैं और यह सभी उपकरणों :)

+2

उम, क्यों न केवल अनुरोध अनुरोध() 'पर एक कॉल करें? यह सब के बाद, अनुमति नामों की एक सरणी लेता है। – CommonsWare

+0

@ कॉमन्सवेयर तो ऐसा करता है ... मुझे लगता है कि तब काम करेगा। यह अभी भी समझा नहीं गया है कि आज तक मेरा कोड ठीक क्यों काम करता है। – RayfenWindspear

+0

@ कॉमन्सवेयर यदि आप इसे उत्तर के रूप में पोस्ट करते हैं तो मैं इसे स्वीकार करूंगा। मुझे आपकी अनुमति मार्गदर्शिका मिली और अब इसका पालन कर रहा है। इसके अलावा, मुझे पता चला कि मेरा कोड अब विफल हो गया है। यह मेरे डिवाइस पर हाल ही में स्थापित कस्टम कर्नेल से संबंधित होना चाहिए। मुझे उन्हें एक बग रिपोर्ट शूट करना होगा, हालांकि एक सूची में गुजरने से वास्तव में अनुमतियां जांचनी चाहिए। – RayfenWindspear

उत्तर

5

सबसे अच्छा हालत में है कि मैं requestPermissions() को लगातार दो कॉल से उम्मीद होती है प्रकट करने के लिए लगातार दो में अभी तक अलग संवाद के लिए है के लिए काम करेंगे। मैं उस व्यवहार की अपेक्षा नहीं करता जिसे आप देख रहे हैं। मैंने समान एकाधिक-requestPermissions() कॉल किए हैं, कॉन्फ़िगरेशन परिवर्तनों को ठीक से संभाल नहीं करने के रूप में, और संवाद के दोनों संस्करण दिखाई दिए।

अन्य सभी बराबर हैं, तो आप requestPermissions() में सभी अनुमतियों का अनुरोध करने से बेहतर हैं, इसलिए एक ही संवाद है। यह उपयोगकर्ता अपेक्षाओं को बेहतर ढंग से फिट करेगा, और मुझे लगता है कि यह आपके कोड को एक चुटकी को सरल बना देगा।

+1

एंड्रॉइड मार्शमलो पर कुछ अजीब मुद्दे थे जब एक ऐप शुरू होने पर एक ही समय में दो अलग-अलग कॉलों में दो अलग-अलग अनुमतियों की मांग की गई थी (कार्यक्रम दो बार दुर्घटनाग्रस्त हो गया था)। एक अनुरोध में दोनों के लिए पूछना नियम() को ठीक करना प्रतीत होता था। – Matthias

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