varios studio solicitar shouldshowrequestpermissionrationale requestpermissions programacion permisos pedir onrequestpermissionsresult multiples internet example android android-6.0-marshmallow runtime-permissions

studio - ¿Cómo verificar el permiso múltiple en una sola solicitud en Android M?



shouldshowrequestpermissionrationale (15)

Quiero usar el

  1. android.permission.CAMERA
  2. android.permission.WRITE_EXTERNAL_STORAGE

en una sola solicitud utilizando

ActivityCompat.requestPermissions(Activity activity,new String permisionList[],int permissionRequestcode);

Pero mi problema es que en el momento solicito solo un permiso, leí sobre el permiso de grupo, pero solo funciona para el mismo grupo que decidió el desarrollador, como CONTACT_GROUP : read_contact,write_contact etc.

Quiero crear el permiso de grupo personalizado que solo me solicita una solicitud y me proporciona una sola respuesta.

Gracias


Agregar código genérico para diferentes tipos de permisos. Copiar y pegar con pequeños cambios. Lea los comentarios de "TODO" en el siguiente código.

Convierta la siguiente actividad en su actividad de iniciador:

public class PermissionReqActivity extends AppCompatActivity { private static final int CODE_WRITE_SETTINGS_PERMISSION = 332; private static String[] PERMISSIONS_ALL = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; //TODO You can Add multiple permissions here. private static final int PERMISSION_REQUEST_CODE = 223; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_permission_req); context = this; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { boolean allPermissionsGranted = true; ArrayList<String> toReqPermissions = new ArrayList<>(); for (String permission : PERMISSIONS_ALL) { if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { toReqPermissions.add(permission); allPermissionsGranted = false; } } if (allPermissionsGranted) //TODO Now some permissions are very special and require Settings Activity to launch, as u might have seen in some apps. handleWriteSettingsPermission() is an example for WRITE_SETTINGS permission. If u don''t need very special permission(s), replace handleWriteSettingsPermission() with initActivity(). handleWriteSettingsPermission(); else ActivityCompat.requestPermissions(this, toReqPermissions.toArray(new String[toReqPermissions.size()]), PERMISSION_REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_REQUEST_CODE) { boolean allPermGranted = true; for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Permissions not granted: " + permissions[i], Toast.LENGTH_LONG).show(); allPermGranted = false; finish(); break; } } if (allPermGranted) handleWriteSettingsPermission();//TODO As mentioned above, use initActivity() here if u dont need very special permission WRITE_SETTINGS } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private void handleWriteSettingsPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Settings.System.canWrite(context)) { initActivity(); } else { Toast.makeText(this, "Please Enable this permission for " + getApplicationInfo().loadLabel(getPackageManager()).toString(), Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION); } } } //TODO You don''t need the following onActivityResult() function if u dont need very special permissions. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && requestCode == CODE_WRITE_SETTINGS_PERMISSION) { if (Settings.System.canWrite(this)) initActivity(); else { Toast.makeText(this, "Permissions not granted: " + Manifest.permission.WRITE_SETTINGS, Toast.LENGTH_LONG).show(); finish(); } } } private void initActivity() { startActivity(new Intent(this, MainActivity.class)); } }


Basado en vedval tengo esta solución.

public boolean checkForPermission(final String[] permissions, final int permRequestCode) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } final List<String> permissionsNeeded = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { final String perm = permissions[i]; if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) { if (shouldShowRequestPermissionRationale(permissions[i])) { Snackbar.make(phrase, R.string.permission_location, Snackbar.LENGTH_INDEFINITE) .setAction(android.R.string.ok, new View.OnClickListener() { @Override @TargetApi(Build.VERSION_CODES.M) public void onClick(View v) { permissionsNeeded.add(perm); } }); } else { // add the request. permissionsNeeded.add(perm); } } } if (permissionsNeeded.size() > 0) { // go ahead and request permissions requestPermissions(permissionsNeeded.toArray(new String[permissionsNeeded.size()]), permRequestCode); return false; } else { // no permission need to be asked so all good...we have them all. return true; } } /** * Callback received when a permissions request has been completed. */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_READ_LOCATION) { int i = 0; for (String permission : permissions ){ if ( permission.equals(Manifest.permission.ACCESS_FINE_LOCATION) && grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) { initLocationManager(); } i++; } } }


Como se dijo anteriormente, actualmente cada grupo de permisos tiene un diálogo de permisos propio que debe llamarse por separado.

Tendrá diferentes cuadros de diálogo para cada grupo de permisos, pero seguramente puede verificar el resultado juntos en el método de devolución de llamada onRequestPermissionsResult ().

Aquí hay un enlace de ejemplo de trabajo, puede ser útil para alguien.


Llego tarde, pero quiero decirle a la biblioteca con qué he terminado.

RxPermission es la mejor biblioteca con código reactivo, lo que hace que el código de permiso sea inesperado solo 1 línea.

RxPermissions rxPermissions = new RxPermissions(this); rxPermissions .request(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE) .subscribe(granted -> { if (granted) { // All requested permissions are granted } else { // At least one permission is denied } });

agregue su build.gradle

allprojects { repositories { ... maven { url ''https://jitpack.io'' } } } dependencies { implementation ''com.github.tbruyelle:rxpermissions:0.10.1'' implementation ''com.jakewharton.rxbinding2:rxbinding:2.1.1'' }


Me enfrenté al mismo problema y a continuación se muestra la solución que se me ocurrió:

public boolean checkForPermission(final String[] permissions, final int permRequestCode, int msgResourceId) { final List<String> permissionsNeeded = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { final String perm = permissions[i]; if (ContextCompat.checkSelfPermission(getActivity(), permissions[i]) != PackageManager.PERMISSION_GRANTED) { if (shouldShowRequestPermissionRationale(permissions[i])) { final AlertDialog dialog = AlertDialog.newInstance( getResources().getString(R.string.permission_title), getResources().getString(msgResourceId) ); dialog.setPositiveButton("OK", new View.OnClickListener() { @Override public void onClick(View view) { // add the request. permissionsNeeded.add(perm); dialog.dismiss(); } }); dialog.show( getActivity().getSupportFragmentManager(), "HCFAlertDialog" ); } else { // add the request. permissionsNeeded.add(perm); } } } if (permissionsNeeded.size() > 0) { // go ahead and request permissions requestPermissions(permissionsNeeded.toArray(new String[permissionsNeeded.size()]), permRequestCode); return false; } else { // no permission need to be asked so all good...we have them all. return true; } }

Y llamas al método anterior así:

if ( checkForPermission( new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_PERMISSION_EXTERNAL_STORAGE_RESULT, R.string.permission_image) ) { // DO YOUR STUFF }


No hay hack disponible en esta etapa para evitar pedir permisos de diferentes grupos juntos. Esa es la naturaleza de cómo Android ha desarrollado permisos de tiempo de ejecución, para dar a los usuarios la opción de elegir qué permisos aceptar. Por supuesto, no aceptar todos los permisos requeridos por una aplicación, puede hacer que la aplicación no funcione correctamente.

CAMERA y WRITE_EXTERNAL_STORAGE se consideran permisos peligrosos y en grupos separados, por lo que ambos requieren una solicitud de permiso de tiempo de ejecución.

Una vez que se otorga el permiso para un grupo en particular, no es necesario volver a solicitarlo durante la vida útil de la aplicación o hasta que se revoque si se otorga como configuración predeterminada.

Lo único que puede hacer es pedirle al usuario que acepte las decisiones como predeterminadas, que pueden revocarse, here


Para permisos múltiples, puede usar este código:

final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; private void insertDummyContactWrapper() { List<String> permissionsNeeded = new ArrayList<String>(); final List<String> permissionsList = new ArrayList<String>(); if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION)) permissionsNeeded.add("GPS"); if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS)) permissionsNeeded.add("Read Contacts"); if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS)) permissionsNeeded.add("Write Contacts"); if (permissionsList.size() > 0) { if (permissionsNeeded.size() > 0) { // Need Rationale String message = "You need to grant access to " + permissionsNeeded.get(0); for (int i = 1; i < permissionsNeeded.size(); i++) message = message + ", " + permissionsNeeded.get(i); showMessageOKCancel(message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); } }); return; } requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); return; } insertDummyContact(); } private boolean addPermission(List<String> permissionsList, String permission) { if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { permissionsList.add(permission); // Check for Rationale Option if (!shouldShowRequestPermissionRationale(permission)) return false; } return true; }


Para solicitar permisos múltiples a la vez, puede usar este link método

compile ''com.kishan.askpermission:askpermission:1.0.3''

Si tienes conflictos en la biblioteca de soporte, entonces

compile(''com.kishan.askpermission:askpermission:1.0.3'', { exclude group: ''com.android.support'' })

Ahora pide permiso

new AskPermission.Builder(this) .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE) .setCallback(/* PermissionCallback */) .setErrorCallback(/* ErrorCallback */) .request(/* Request Code */);

permiso concedido devolución de llamada

public void onPermissionsGranted(int requestCode) { // your code }

permiso denegado devolución de llamada

public void onPermissionsDenied(int requestCode) { // your code}

ErrorCallbacks

public void onShowRationalDialog(PermissionInterface permissionInterface, int requestCode) { // Alert user by Dialog or any other layout that you want. // When user press OK you must need to call below method. permissionInterface.onDialogShown();

}

public void onShowSettings(PermissionInterface permissionInterface, int requestCode) { // Alert user by Dialog or any other layout that you want. // When user press OK you must need to call below method. // It will open setting screen. permissionInterface.onSettingsShown();

}


Primero inicialice el código de solicitud de permiso

public static final int PERMISSIONS_MULTIPLE_REQUEST = 123;

Verifique la versión de Android

private void checkAndroidVersion() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { checkPermission(); } else { // write your logic here } }

verifica el código de permiso múltiple

private void checkPermission() { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) + ContextCompat .checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale (getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale (getActivity(), Manifest.permission.CAMERA)) { Snackbar.make(getActivity().findViewById(android.R.id.content), "Please Grant Permissions to upload profile photo", Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", new View.OnClickListener() { @Override public void onClick(View v) { requestPermissions( new String[]{Manifest.permission .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, PERMISSIONS_MULTIPLE_REQUEST); } }).show(); } else { requestPermissions( new String[]{Manifest.permission .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, PERMISSIONS_MULTIPLE_REQUEST); } } else { // write your logic code if permission already granted } }

método de devolución de llamada después de otorgar permiso del usuario

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case PERMISSIONS_MULTIPLE_REQUEST: if (grantResults.length > 0) { boolean cameraPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED; boolean readExternalFile = grantResults[0] == PackageManager.PERMISSION_GRANTED; if(cameraPermission && readExternalFile) { // write your logic here } else { Snackbar.make(getActivity().findViewById(android.R.id.content), "Please Grant Permissions to upload profile photo", Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", new View.OnClickListener() { @Override public void onClick(View v) { requestPermissions( new String[]{Manifest.permission .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, PERMISSIONS_MULTIPLE_REQUEST); } }).show(); } } break; } }


Puede solicitar múltiples permisos (de diferentes grupos) en una sola solicitud. Para eso, debe agregar todos los permisos a la matriz de cadenas que proporciona como primer parámetro a la API requestPermissions de esta manera:

requestPermissions(new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION}, ASK_MULTIPLE_PERMISSION_REQUEST_CODE);

Al hacer esto, verá la ventana emergente de permisos como una pila de ventanas emergentes de permisos múltiples. Por supuesto, debe manejar la aceptación y el rechazo (incluidas las opciones "Nunca preguntar de nuevo") de cada permiso. Lo mismo ha sido bellamente explicado here .


Según lo que he buscado, creo que esta es la mejor respuesta que he encontrado con Android 6.0 permisos múltiples


Tuve el mismo problema y me topé con esta library .

Básicamente, puede solicitar varios permisos de forma secuencial, además puede agregar oyentes para abrir una barra de bocadillos si el usuario niega su permiso.


marque más de un permiso y solicite si no se otorga

public void checkPermissions(){ if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA)==PackageManager.PERMISSION_GRANTED){ //Do_SOme_Operation(); }else{ requestStoragePermission(); } } public void requestStoragePermission(){ ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA},1234); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case 1234:if(grantResults[0]==PackageManager.PERMISSION_GRANTED && grantResults[1]==PackageManager.PERMISSION_GRANTED){ // Do_SOme_Operation(); } default:super.onRequestPermissionsResult(requestCode,permissions,grantResults); } }


Aquí tengo una solución simple, - (Verificación de permisos múltiples)

String[] permissions = new String[]{ Manifest.permission.WRITE_CALL_LOG, Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}; // Here i used multiple permission check

Entonces llámalo en Oncreate

if (checkPermissions()) { // permissions granted. getCallDetails(); }

Finalmente, copie el siguiente código

private boolean checkPermissions() { int result; List<String> listPermissionsNeeded = new ArrayList<>(); for (String p : permissions) { result = ContextCompat.checkSelfPermission(getApplicationContext(), p); if (result != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(p); } } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), MULTIPLE_PERMISSIONS); return false; } return true; } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MULTIPLE_PERMISSIONS: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permissions granted. getCallDetails(); // Now you call here what ever you want :) } else { String perStr = ""; for (String per : permissions) { perStr += "/n" + per; } // permissions list of don''t granted permission } return; } } }


// **For multiple permission you can use this code :** // **First:** //Write down in onCreate method. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{ android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); } //**Second:** //Write down in a activity. @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { new Handler().postDelayed(new Runnable() { @Override public void run() { progressBar.setVisibility(View.GONE); Intent i = new Intent(SplashActivity.this, HomeActivity.class); startActivity(i); finish(); } }, SPLASH_DISPLAY_LENGTH); } else { finish(); } return; } }