web-dev-qa-db-fra.com

Android 6(M) problème d'autorisation (le répertoire de création ne fonctionne pas)

J'ai ce code pour créer un répertoire pour enregistrer des images:

        File storageDir = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {                
            storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myphoto");
            if (!storageDir.mkdirs()) {                    
                if (!storageDir.exists()){                       
                    Log.d("photo", "failed to create directory");
                    return null;
                }
            }
        }
        return storageDir;

storeDir renvoie "/storage/emulated/0/Pictures/myphoto/" sous Android 6 et sur Android 6, il renvoie null

J'ai la permission <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>

buildToolVersion 23 targetSdkVersion 23

Comment réparer?

13
Jemshit Iskenderov

Comme @CommonsWare a répondu, il existe un concept de demande d'autorisation au moment de l'exécution sur Android M; ainsi, dans la nouvelle approche, les autorisations ne sont pas demandées lors de l'installation de l'application, mais lors de la tentative d'utilisation d'une fonctionnalité spécifique du téléphone qui demande l'autorisation, au moment de l'exécution. L'utilisateur peut ensuite désactiver l'autorisation de phone settings->app->yourapp->permissions également. Vous devez donc vérifier avant de faire quelque chose avec cette permission et demander à l'utilisateur:

int REQUEST_WRITE_EXTERNAL_STORAGE=1;
////...
        File storageDir = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            //RUNTIME PERMISSION Android M
            if(PackageManager.PERMISSION_GRANTED==ActivityCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myPhoto");
            }else{
                requestPermission(context);
            }    

        } 
        return storageDir;
////...
        private static void requestPermission(final Context context){
        if(ActivityCompat.shouldShowRequestPermissionRationale((Activity)context,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.

            new AlertDialog.Builder(context)
                    .setMessage(context.getResources().getString(R.string.permission_storage))
                    .setPositiveButton(R.string.tamam, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions((Activity) context,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            REQUEST_WRITE_EXTERNAL_STORAGE);
                }
            }).show();

        }else {
            // permission has not been granted yet. Request it directly.
            ActivityCompat.requestPermissions((Activity)context,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_WRITE_EXTERNAL_STORAGE);
        }
    }

///...

    @Override
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
        switch (requestCode) {
            case UtilityPhotoController.REQUEST_WRITE_EXTERNAL_STORAGE: {
                if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(context,
                            getResources().getString(R.string.permission_storage_success),
                            Toast.LENGTH_SHORT).show();

                } else {
                    Toast.makeText(context,
                            getResources().getString(R.string.permission_storage_failure),
                            Toast.LENGTH_SHORT).show();
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                }
                return;
            }
        }
    }
22
Jemshit Iskenderov

Vous utilisez ceci sur un environnement Android 6.0+ et vous avez une targetSdkVersion de 23.

Dans ce cas, WRITE_EXTERNAL_STORAGE fait partie de le système de permission d'exécution Android 6.0 . Révisez votre application pour participer à ce système ou déposez votre targetSdkVersion ci-dessous 23.

16
CommonsWare

Vous devez obtenir la permission pour ce travail comme:

enter image description here

pour le faire implémenter ce code:

 if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

        } else {


            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},23
                    );
        }
    }

bonne chance!!!

4
saeid aslami

Essayez ce code. 

@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            if (checkPermission()) {
                                //do your work
                            } else {
                                requestPermission();
                            }
                        }
               }


                protected boolean checkPermission() {
                    int result = ContextCompat.checkSelfPermission(this, Android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
                    if (result == PackageManager.PERMISSION_GRANTED) {
                        return true;
                    } else {
                        return false;
                    }
                }

                protected void requestPermission() {

                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
                    } else {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
                        }
                    }
                }

            @Override
            public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
                switch (requestCode) {
                    case 100:
                        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            //do your work
                        } else {
                            Log.e("value", "Permission Denied, You cannot use local drive .");
                        }
                        break;
                }
            }
0
Kush Patel