Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Método checkSelfPermission no funciona en targetSdkVersion 22

El método "CheckSelfPermission" no está funcionando como se esperaba y siempre está devolviendo cero en android 6.0 (Marshmallow). Debido a que el sdk de destino es 22 y estoy utilizando cliente http para la conexión de red. El siguiente es el fragmento de código.

"Private void insertDummyContactWrapper () {List permissionsNeeded = new ArrayList ();

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(); } @TargetApi(Build.VERSION_CODES.M) 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; } private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { new AlertDialog.Builder(MainActivity.this) .setMessage(message) .setPositiveButton("OK", okListener) .setNegativeButton("Cancel", null) .create() .show(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { Map<String, Integer> perms = new HashMap<String, Integer>(); // Initial perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED); // Fill with results for (int i = 0; i < permissions.length; i++) perms.put(permissions[i], grantResults[i]); // Check for ACCESS_FINE_LOCATION if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) { // All Permissions Granted insertDummyContact(); } else { // Permission Denied Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT) .show(); } } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }" 

  • Apoyar Android de nivel de Api nivel 23 a 22 en la consola de desarrolladores
  • Permisos de Android 6.0 y OBB de montaje
  • Tratando de implementar permisos de cámara para android M sin método virtual checkSelfPermission
  • Compartir servicios y permisos de manifiesto del proyecto de la biblioteca
  • Android M: Facturación y permisos de GCM
  • Cómo corregir Advertencia de pelusa de SMS BroadcastReceiver sin protección
  • Android M: revoca los permisos mediante programación
  • Restricción de Android Broadcast Receiver de una aplicación específica
  • 3 Solutions collect form web for “Método checkSelfPermission no funciona en targetSdkVersion 22”

    El método Context#checkSelfPermission(String) se añadió a la API 23. También debajo de la API 23 es inútil que el permiso siempre se conceda. Haga una comprobación de la versión de la API antes de manejar los permisos

     private void insertDummyContactWrapper() { // the only way we insert the dummy contact if if we are below M. // Else we continue on and prompt the user for permissions if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { insertDummyContact(); return; } 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); } } 

    Referencia: http://developer.android.com/reference/android/content/Context.html#checkSelfPermission(java.lang.String)

    1. Si su aplicación tiene como objetivo un nivel de API antes de 23 (Android M) , tanto: ContextCompat # checkSelfPermission y Context # checkSelfPermission no funciona y siempre devuelve 0 ( PERMISSION_GRANTED ). Incluso si ejecuta la aplicación en Android 6.0 (API 23).

    2. No es totalmente cierto que si se apunta a un nivel de API antes de 23, entonces no tiene que hacerse cargo de los permisos. Si orienta un nivel de API antes de 23, entonces:

      • Android <6.0: Todo estará bien.
      • Android 6.0: Los permisos en tiempo de ejecución de la aplicación se otorgarán de forma predeterminada (se aplica el modo de compatibilidad), pero el usuario puede cambiar los permisos en tiempo de ejecución en la configuración de Android, es posible que tenga un problema.
    3. Como dije en el primer punto, si apunta un nivel de API antes de 23 en Android 6.0, entonces ContextCompat # checkSelfPermission y Context # checkSelfPermission no funciona. Afortunadamente, puede utilizar PermissionChecker # checkSelfPermission para comprobar los permisos en tiempo de ejecución.

    Ejemplo de código:

      public boolean selfPermissionGranted(String permission) { // For Android < Android M, self permissions are always granted. boolean result = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (targetSdkVersion >= Build.VERSION_CODES.M) { // targetSdkVersion >= Android M, we can // use Context#checkSelfPermission result = context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; } else { // targetSdkVersion < Android M, we have to use PermissionChecker result = PermissionChecker.checkSelfPermission(context, permission) == PermissionChecker.PERMISSION_GRANTED; } } return result; } 

    Con el fin de obtener la versión de destino Sdk puede utilizar:

      try { final PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), 0); targetSdkVersion = info.applicationInfo.targetSdkVersion; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 

    Funciona en Nexus 5 con Android M.

    Al orientar un nivel de API antes de 23, se aplica un modo de compatibilidad. El antiguo comportamiento de permisos se está ejecutando, incluso en los dispositivos que ejecutan Android 6. Para utilizar el nuevo sistema de permisos, tiene que apuntar a la API 23 (o superior en el futuro).

    El comportamiento completo se especifica en la documentación: https://developer.android.com/training/permissions/requesting.html

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.