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 ();

  • FragmentTransaction antes y después de callback de setCustomAnimation
  • Cómo cargar un ImageView desde un archivo png?
  • Cómo hacer que la altura de la caja EditText se expanda
  • Actividad de Android - DataBinding con preferencias
  • No se pudo encontrar el estilo vpiCirclePageIndicatorStyle
  • Insertar en base de datos SQLite android
  • 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); } }" 

  • Migración del proyecto a un nuevo complemento gradle experimental
  • Lectura de archivos de texto desde el servidor en Android
  • WebView de Android - Interceptar clics
  • Detectar evento táctil de botones de navegación dentro de un servicio con ventana
  • Permitir al usuario insertar una imagen en la aplicación android
  • GetMeasuredHeight () de TextView con el texto incluido
  • 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.