Permisos de tiempo de ejecución de Android en Android 6.0 (API nivel 23) mejores prácticas

Permisos de tiempo de ejecución de Android en Android 6.0 (API nivel 23) mejores prácticas

He agregado correctamente permisos en el tiempo de ejecución a mi aplicación usando

Estas referencias

http://developer.android.com/training/permissions/requesting.html

y

https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

este es el código que he usado

private static final int PERMISSION_REQUEST_CODE = 1;

    switch (id){
                case R.id.check_permission:
                    if (checkPermission()) {

                        Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();

                    } else {

                        Snackbar.make(view,"Please request permission.",Snackbar.LENGTH_LONG).show();
                    }
                    break;
                case R.id.request_permission:
                    if (!checkPermission()) {

                        requestPermission();

                    } else {

                        Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();

                    }
                    break;
            }

private boolean checkPermission(){
        int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
        if (result == PackageManager.PERMISSION_GRANTED){

            return true;

        } else {

            return false;

        }
    }

    private void requestPermission(){

        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.ACCESS_FINE_LOCATION)){

            Toast.makeText(context,"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();

        } else {

            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show();

                } else {

                    Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show();

                }
                break;
        }
    }

Las mejores prácticas proporcionadas por android

http://developer.android.com/training/permissions/best-practices.html

declare lo siguiente

1) Considere usar una intención

2) Solo solicite los permisos que necesita

3) No abrumes al usuario

4) Explica por qué necesitas permisos

ahora siguiendo lo anterior, solicitamos permisos solo cuando sea necesario y solo para el permiso específico que requiere esa actividad

sin embargoEstas mejores prácticas no indican la frecuencia del permiso, es decir, cuántas veces se necesita mostrar este permiso o solo se puede mostrar una vez

ahora el problema que estoy enfrentando es

1) cada vez que se llama a la actividad en la aplicación aparecen los permisos, esto sucede para esa sesión particular de uso de la aplicación (si se llama a la misma actividad durante la misma sesión, no se solicita el permiso una vez que se otorga)

2) ¿Podemos almacenar los permisos que se han otorgado (es decir, la variable estática que realiza la primera verificación en la preferencia compartida para que los permisos no se llamen una y otra vez)

3)¿Necesitamos solicitar el permiso de acceso cada vez que se usa la aplicación?

4) Si no se permiten preferencias compartidas, ¿cómo gestionamos estos permisos de manera más elegante?

Respuestas a la pregunta(1)

Su respuesta a la pregunta