इसलिए मैंने अनुमतियों का अनुरोध करने के लिए कोड को पूरी तरह से फिर से लिखा है। अब यह उचित अनुमति के साथ एकाधिक अनुमतियों और चलने वाले कोड के लिए अनुरोध करने का समर्थन करता है। यह प्रीमारशैलो उपकरणों के साथ भी काम करता है, इसलिए आपको उस मामले में कोड को जांचने और कॉपी करने की आवश्यकता नहीं है।
पहले, इस कोड के साथ एक गतिविधि वर्ग बनाने (आप गतिविधि के किसी भी राजा की जरूरत है, जैसे AppCompatActivity विस्तार कर सकते हैं):
:
public abstract class PermissionActivity extends AppCompatActivity {
private final ArrayList<PermissionListener> permissionListeners = new ArrayList<>();
@SuppressWarnings("unused")
public void requestPermissions(int requestCode, String[] requestPermissions, PermissionListener permissionListener) {
requestPermissions(requestCode, requestPermissions, null, permissionListener);
}
@SuppressWarnings("unused")
public void requestPermissions(final int requestCode, String[] requestPermissions, String message, final PermissionListener permissionListener) {
final int[] grantResults = new int[requestPermissions.length];
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> list_notGranted = new ArrayList<>();
for (String requestPermission : requestPermissions)
if (ContextCompat.checkSelfPermission(this, requestPermission) != PackageManager.PERMISSION_GRANTED)
list_notGranted.add(requestPermission);
if (list_notGranted.size() > 0) {
permissionListeners.add(permissionListener);
requestPermissions = list_notGranted.toArray(new String[list_notGranted.size()]);
if (message != null) {
boolean shouldShowRequestPermissionRationale = false;
for (String permission : requestPermissions)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
shouldShowRequestPermissionRationale = true;
break;
}
if (shouldShowRequestPermissionRationale) {
final String[] f_requestPermissions = requestPermissions;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(message);
DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
PermissionActivity.super.requestPermissions(f_requestPermissions, requestCode);
break;
default:
for (int i = 0; i < grantResults.length; i++)
grantResults[i] = PackageManager.PERMISSION_DENIED;
if (permissionListener != null)
permissionListener.onResult(requestCode, f_requestPermissions, grantResults);
break;
}
}
};
builder.setPositiveButton("OK", onClickListener);
builder.setNegativeButton("Cancel", onClickListener);
builder.show();
} else {
super.requestPermissions(requestPermissions, requestCode);
}
} else {
super.requestPermissions(requestPermissions, requestCode);
}
} else {
for (int i = 0; i < grantResults.length; i++)
grantResults[i] = PackageManager.PERMISSION_GRANTED;
if (permissionListener != null)
permissionListener.onResult(requestCode, requestPermissions, grantResults);
}
} else {
if (permissionListener != null) {
for (int i = 0; i < grantResults.length; i++)
grantResults[i] = PackageManager.PERMISSION_GRANTED;
permissionListener.onResult(requestCode, requestPermissions, grantResults);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
for (Iterator<PermissionListener> it = permissionListeners.iterator(); it.hasNext();) {
PermissionListener permissionListener = it.next();
if (permissionListener.onResult(requestCode, permissions, grantResults)) {
it.remove();
}
}
}
public interface PermissionListener {
boolean onResult(int requestCode, String[] requestPermissions, int[] grantResults);
}
}
आप टुकड़े से अनुमतियों का अनुरोध करने, इस वर्ग को जोड़ने चाहते हैं
public class PermissionFragment extends Fragment {
@SuppressWarnings("unused")
public void requestPermissions(int requestCode, String[] requestPermissions, PermissionActivity.PermissionListener permissionListener) {
requestPermissions(requestCode, requestPermissions, null, permissionListener);
}
@SuppressWarnings("unused")
public void requestPermissions(final int requestCode, String[] requestPermissions, String message, PermissionActivity.PermissionListener permissionListener) {
((PermissionActivity) getActivity()).requestPermissions(requestCode, requestPermissions, message, permissionListener);
}
}
आपकी गतिविधियां और टुकड़े स्टैंडआउट वाले लोगों के बजाय इन वर्गों का विस्तार करना चाहिए।
अब तुम एक विधि को फोन करके अनुमतियों का अनुरोध करने के लिए तैयार हैं:
requestPermissions(int requestCode, String[] requestPermissions, PermissionListener permissionListener)
अनुमति काम करने के लिए एप्लिकेशन के लिए आवश्यक है, तो आप इस विधि कॉल और क्यों अनुमति की आवश्यकता नहीं है कह संदेश निर्दिष्ट करना चाहिए ।
requestPermissions(int requestCode, String[] requestPermissions, String message, PermissionListener permissionListener)
न Misscall डिफ़ॉल्ट विधि है, जो
// DON'T USE THIS ONE!
requestPermissions(String[] requestPermissions, int requestCode)
// DON'T USE THIS ONE!
यहाँ का अनुरोध संपर्कों के उदाहरण है:
private void requestAndLoadContacts() {
String[] permissions = new String[]{Manifest.permission.READ_CONTACTS};
requestPermissions(REQUEST_PERMISSIONS_CONTACTS, permissions, "Read contacts permission is required for the app to work!", new PermissionListener() {
@Override
public boolean onResult(int requestCode, String[] requestPermissions, int[] grantResults) {
// Check if the requestCode is ours
if (requestCode == REQUEST_PERMISSIONS_CONTACTS) {
// Check if the permission is correct and is granted
if (requestPermissions[0].equals(Manifest.permission.READ_CONTACTS) && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted
// Calling a method to actually load the contacts
loadContacts();
} else {
// Permission not granted
Toast.makeText(MainActivity.this, "Access denied!", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
});
}
नोट: जब आप PermissionListener लागू, मत भूलना पर वापस लौटें जब अनुरोध कोड सही एक है, ओथ Rwise PermissionListener को ArrayList से हटाया नहीं जाएगा और आपको सबसे छोटी स्मृति रिसाव मिल जाएगी।
धन्यवाद दोस्त.मैंने तुम्हें मिला। –
अच्छा विचार! क्या ContextCompat का उपयोग करके सुधार करना संभव है जो पुराने एंड्रॉइड संस्करणों को संभालता है? धन्यवाद! – Gilian
लेकिन "allowListeners.remove (अनुमति लिस्टनर);" एक ConcurrentModificationException फेंक नहीं होगा? – Gilian