2016-05-11 6 views
7

मंगलमलो ने अनुमति प्राप्त करने के लिए फिर से डिजाइन किया है। तो विधि है जो अनुमतियों की आवश्यकता है और यह ठीक काम करता है कॉल करने से पहले अनुमतियाँ प्रबंधित, लेकिन यह इस परिदृश्य में दुर्घटनाओं:मंगलमलो: रन टाइम क्रैश ऐप पर अनुमतियां बदलना

चरण 1: खोला एप्लिकेशन और सभी आवश्यक अनुमतियों दिया

चरण 2: क्लिक किया होम बटन (तो एप्लिकेशन को पृष्ठभूमि में है)

चरण 3: मैन्युअल रूप से सेटिंग्स

चरण 4 में अनुमतियों को बदल दिया: multitasks से एप्लिकेशन लॉन्च किया अब यह एप्लिकेशन संदर्भ के कारण दुर्घटनाओं हो जाता है अमान्य

ने देखा कि ऐप फिर से बनाया गया है, समझ में नहीं आता कि ऐसा क्यों होता है। इस मुद्दे को सुधारने के लिए कोई सुझाव स्वागत होगा!

+0

क्या कोई अपवाद है ?? यदि हां, तो आपको इसे पकड़ने के लिए प्रयास करें –

+0

इसे जांचें .... http://stackoverflow.com/questions/33488589/android-marshmallow- गतिशील- पारिश्रमिक-change- kills-all-plication-processes – Nikunj

+0

देखा गया मुद्दा, ऐप की वजह से ऐप की वजह से जब हम ऐप को पृष्ठभूमि में चलते हुए गतिशील रूप से अनुमतियों को बदलते हैं, तो संदर्भ जो मैंने साझा प्राथमिकताओं तक पहुंचने के लिए उपयोग किया था, शून्य हो जाता है – ABI

उत्तर

1

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

public class AppPermission { 

    public static boolean isMarshmallowPlusDevice() { 
     return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1; 
    } 

    @TargetApi(Build.VERSION_CODES.M) 
    public static boolean isPermissionRequestRequired(Activity activity, @NonNull String[] permissions, int requestCode) { 
     if (isMarshmallowPlusDevice() && permissions.length > 0) { 
      List<String> newPermissionList = new ArrayList<>(); 
      for (String permission : permissions) { 
       if (PackageManager.PERMISSION_GRANTED != activity.checkSelfPermission(permission)) { 
        newPermissionList.add(permission); 
       } 
      } 
      if (newPermissionList.size() > 0) { 
       activity.requestPermissions(newPermissionList.toArray(new String[newPermissionList.size()]), requestCode); 
       return true; 
      } 
     } 
     return false; 
    } 
} 

फिर इस कोड को रखें जहां आपको उपयोगकर्ता से अनुमति की आवश्यकता है।

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case REQUEST_APP_PERMISSION: 
      for (int i = 0; i < permissions.length; i++) { 
       String permission = permissions[i]; 
       int grantResult = grantResults[i]; 
       switch (permission) { 
        case "android.permission.GET_ACCOUNTS": 
         if (PackageManager.PERMISSION_GRANTED == grantResult) { 
          // Your code 
         } 
         break; 
       } 
      } 
      break; 
    } 
} 

ऊपर कोड GET_ACCOUNTS के लिए अनुमति का अनुरोध के लिए है आप जो कुछ भी आवश्यक करने के लिए इसे बदल सकते हैं -

if (!AppPermission.isPermissionRequestRequired(SignInActivity.this, new String[]{"android.permission.GET_ACCOUNTS"}, 
     REQUEST_APP_PERMISSION)) { 
    // Your code if permission available 
} 
इस कोड

इस के बाद, अपने Fragment या Activity पुट में।

+1

क्या आपने ऊपर दिए गए परिदृश्य को पढ़ और समझ लिया? – ABI

+0

यदि ऊपर पर्याप्त नहीं है तो कुछ कोड डालें। उपर्युक्त कोड अधिकतर –

+2

से चूकता है, इसका कोड स्तर समस्या नहीं है, मैं यह सुनिश्चित करना चाहता हूं कि जब मैं सेटिंग्स में मैन्युअल रूप से अनुमतियां बदलूं (ऐप को पृष्ठभूमि में चल रहा है, तो इसे लॉन्च करते समय ऐप फिर से बनाया जाता है) दुर्घटनाग्रस्त हो जाता है) – ABI

0

देखा गया कि ऐप फिर से बनाया गया है, यह समझ में नहीं आता कि यह क्यों होता है। इस मुद्दे को सुधारने के लिए कोई सुझाव स्वागत होगा!

क्योंकि जब अनुमतियां बदलती हैं, तो आवेदन "स्थिति" को अमान्य किया जाना चाहिए। ऐसा करने का सही तरीका मूल संदर्भ को नष्ट कर देता है, जो स्वयं ही एप्लिकेशन है।

प्रत्येक बार जब आप उन अनुमतियों की आवश्यकता वाले एपीआई विधियों से पूछते हैं तो आपको अनुमति दी गई स्थिति की जांच करनी होगी। आप SharedPreferences ध्वज पर भरोसा नहीं कर सकते हैं कि "उपयोगकर्ता ने ऑनबोर्डिंग में अनुमतियां दी हैं, ठीक है, मज़े करें"। इस संबंध में अपना ऐप स्टेटलेस बनाएं।

उदाहरण के लिए, आप कुछ बेसएक्टिविटी/बेसफ्रैगमेंट या उपयोगिता बना सकते हैं और वहां सभी चेकिंग लॉजिक को स्थानांतरित कर सकते हैं।

0

पहले

private boolean isPermissionGranted = false; 

पर एक बूलियन मान को परिभाषित करें और फिर जाँच अगर अनुमति दी:

if (!isPermissionGranted) { 
     checkPermission(); 
    } 
रन टाइम अनुमति की जांच के लिए

वास्तविक कोड का पालन है:

private void checkPermission() { 
    int hasPermission = ContextCompat.checkSelfPermission(UserProfile.this, Manifest.permission.CAMERA); 
    int hasWritePermission = ContextCompat.checkSelfPermission(UserProfile.this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (hasPermission != PackageManager.PERMISSION_GRANTED && hasWritePermission != PackageManager.PERMISSION_GRANTED) { 
     if (!ActivityCompat.shouldShowRequestPermissionRationale(UserProfile.this, Manifest.permission.CAMERA) && !ActivityCompat.shouldShowRequestPermissionRationale(UserProfile.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
      showMessage(getString(R.string.allow_access_to_camera_external_storage), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions(UserProfile.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
            REQUEST_CODE_ASK_PERMISSIONS); 
         } 
        }); 
      return; 
     } 
     ActivityCompat.requestPermissions(UserProfile.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       REQUEST_CODE_ASK_PERMISSIONS); 
     return; 
    } else { 
     isPermissionGranted = true; 
    } 
} 

private void showMessage(String message, DialogInterface.OnClickListener  listener) { 
    new AlertDialog.Builder(UserProfile.this) 
      .setMessage(message) 
      .setPositiveButton(R.string.ok, listener) 
      .setNegativeButton(R.string.cancel, null) 
      .create() 
      .show(); 
} 

    @Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_PERMISSIONS: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       isPermissionGranted = true; 

      } else { 
       isPermissionGranted = false; 
       Toast.makeText(UserProfile.this, R.string.permission_denied, Toast.LENGTH_SHORT) 
         .show(); 
      } 
      break; 

     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

आप उपरोक्त कोड से संदर्भ ले सकते हैं और इसे अपने आवेदन में लागू कर सकते हैं।

+0

यदि आपके पास उपरोक्त नमूना कोड के साथ कोई प्रश्न है, तो आप पूछ सकते हैं ... – Riten

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