¿Cómo verificar permisos de subvenciones en tiempo de ejecución?
En Android M (Vista previa), el usuario puede elegir una aplicación específica y un permiso específico de retreive.
Por lo tanto, estoy preguntando ¿Cómo comprobar permisos de subvenciones en tiempo de ejecución ?
- ¿Qué pasará con aplicaciones que no se actualizan y que ejecutan código que requiere un permiso que el usuario desautorizado en Android 6.0 Marshmallow
- Permisos de tiempo de ejecución de Android en las versiones de android debajo de M?
- ¿Puedo recibir los intentos C2DM de otra aplicación de Android si estoy firmado con la misma firma?
- Negación de permisos de Android 6.0: requiere permiso android.permission.WRITE_SETTINGS
- Si ya tengo ACCESS_FINE_LOCATION, ¿puedo omitir ACCESS_COARSE_LOCATION?
- ¿Cómo UID de una aplicación determinada durante la instalación en Android?
- La aplicación de Android se bloquea en 6.0 mientras busca permisos con ActivityCompat.requestPermissions
- Respondida Incoming Call in Android 6.0
- Ventana de superposición del sistema Android
- Proporcionar texto personalizado para el diálogo de permisos de Android M
- Período de tiempo de ejecución de Marshmallow
- Negación de permisos de Android en Widget RemoteViewsFactory para contenido
- ¿Cómo elimino mi propio calendario personalizado corrompido mediante programación?
Agradable !!
Acabo de encontrar mi necesidad que podemos comprobar si el permiso es concedido por:
checkSelfPermission(Manifest.permission.READ_CONTACTS)
Solicitar permisos si es necesario
if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant return; }
Gestionar la respuesta de solicitud de permisos
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! do the // calendar task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'switch' lines to check for other // permissions this app might request } }
Pruebe este código de solicitud simple
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; private boolean checkAndRequestPermissions() { int camera = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA); int storage = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); int loc = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION); int loc2 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); List<String> listPermissionsNeeded = new ArrayList<>(); if (camera != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.CAMERA); } if (storage != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (loc2 != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION); } if (loc != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this,listPermissionsNeeded.toArray (new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS); return false; } return true; }
Pruebe esto para comprobar Permiso de tiempo de ejecución:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkRunTimePermission(); }
Compruebe el permiso de tiempo de ejecución:
private void checkRunTimePermission() { String[] permissionArrays = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(permissionArrays, 11111); } else { // if already permition granted // PUT YOUR ACTION (Like Open cemara etc..) } }
Handle Resultado del permiso:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); boolean openActivityOnce = true; boolean openDialogOnce = true; if (requestCode == 11111) { for (int i = 0; i < grantResults.length; i++) { String permission = permissions[i]; isPermitted = grantResults[i] == PackageManager.PERMISSION_GRANTED; if (grantResults[i] == PackageManager.PERMISSION_DENIED) { // user rejected the permission boolean showRationale = shouldShowRequestPermissionRationale(permission); if (!showRationale) { //execute when 'never Ask Again' tick and permission dialog not show } else { if (openDialogOnce) { alertView(); } } } } if (isPermitted) if (isPermissionFromGallery) openGalleryFragment(); } }
Establecer alerta personalizada:
private void alertView() { AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogStyle); dialog.setTitle("Permission Denied") .setInverseBackgroundForced(true) //.setIcon(R.drawable.ic_info_black_24dp) .setMessage("Without those permission the app is unable to save your profile. App needs to save profile image in your external storage and also need to get profile image from camera or external storage.Are you sure you want to deny this permission?") .setNegativeButton("I'M SURE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { dialoginterface.dismiss(); } }) .setPositiveButton("RE-TRY", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { dialoginterface.dismiss(); checkRunTimePermission(); } }).show(); }
La mejor descripción está en: http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en
Para permisos de uso simple puedes usar esta lib: http://hotchemi.github.io/PermissionsDispatcher/
fun hasPermission(permission: String): Boolean { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true // must be granted after installed. return mAppSet.appContext.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED }
Para el permiso de ejecución de ubicación
ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d("yes","yes"); } else { Log.d("yes","no"); // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } }
También puede consultar el siguiente fragmento de código como compatible con versiones anteriores;
int hasPermission = ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_CONTACTS); if (hasPermission == PackageManager.PERMISSION_GRANTED) { //Do smthng }
- ¿Aparejos rizados en "nueva" expresión? (Por ejemplo, "new MyClass () {…}")
- ¿Cómo desactivo las verificaciones de anotaciones de Android @IntDef en casos especiales?