Errore di autorizzazione di archiviazione in Marshmallow


159

In Lollipop, la funzionalità di download funziona perfettamente nella mia app, ma quando ho eseguito l'aggiornamento a Marshmallow, la mia app si arresta in modo anomalo e genera questo errore quando provo a scaricare da Internet nella scheda SD:

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

Si lamenta di questa riga di codice:

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

Ho i permessi nell'applicazione manifest esterna:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Ho pulito e ricostruito il progetto, ma si blocca ancora.


Prova questo potrebbe esserti di aiuto: - stackoverflow.com/a/41221852/5488468
Bipin Bharti,

Ho preparato una libreria che aiuterà a gestire facilmente le autorizzazioni di runtime. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Risposte:


357

È necessario verificare se l'utente ha concesso l'autorizzazione per l'archiviazione esterna utilizzando:

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.v(TAG,"Permission is granted");
    //File write logic here
    return true;
}

In caso contrario, devi chiedere all'utente di concedere l'autorizzazione alla tua app:

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

Naturalmente questi sono solo per i dispositivi marshmallow, quindi è necessario verificare se l'app è in esecuzione su Marshmallow:

 if (Build.VERSION.SDK_INT >= 23) {
      //do your check here
 }

Assicurati anche che la tua attività venga implementata OnRequestPermissionResult

L'intera autorizzazione è simile alla seguente:

public  boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {

            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
}

Richiamata del risultato dell'autorizzazione:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}

2
@Houssem felice di aiutarti.!
MetaSnarf,

14
Questo non funziona per API> = 23, richiedendo l'autorizzazione per Manifest.permission.WRITE_EXTERNAL_STORAGErestituisce sempre '-1', ovvero Autorizzazione negata. Controlla la nuova documentazione, dice che per API 19 in poi, non hai bisogno WRITE_EXTERNAL_STORAGEdell'autorizzazione. Come alcuni dei commenti sopra menzionati, dovresti fare tutto questo conManifest.permission.READ_EXTERNAL_STORAGE
AmeyaB

3
@VSB: È in un posto strano ma eccoti qui: developer.android.com/guide/topics/manifest/…
AmeyaB

3
@AmeyB Come detto nella documentazione, per API> = 19, l'autorizzazione a scrivere su memoria esterna non è richiesta per essere dichiarata SE l' applicazione utilizzerà la propria directory specifica su memoria esterna che viene restituita da getExternalFilesDir(). In altri casi, l'autorizzazione android.permission.WRITE_EXTERNAL_STORAGEdeve essere dichiarata nel modo più efficace.
VSB

1
Sì, è stato risolto. Il problema era legato alla libreria di app per hockey. questa libreria ha ignorato il mio permesso di scrittura. @MetaSnarf
Selin,

38

Il sistema di autorizzazioni di Android è una delle maggiori preoccupazioni di sicurezza da sempre poiché tali autorizzazioni sono richieste al momento dell'installazione. Una volta installata, l'applicazione sarà in grado di accedere a tutte le cose concesse senza il riconoscimento di qualsiasi utente cosa fa esattamente l'applicazione con l'autorizzazione.

Android 6.0 Marshmallow introduce una delle più grandi modifiche al modello delle autorizzazioni con l'aggiunta delle autorizzazioni di runtime, un nuovo modello di autorizzazione che sostituisce il modello di autorizzazioni del tempo di installazione esistente quando si target l'API 23 e l'app è in esecuzione su un dispositivo Android 6.0+

La cortesia va a Richiesta di autorizzazioni in fase di esecuzione .

Esempio

Dichiaralo come globale

private static final int PERMISSION_REQUEST_CODE = 1;

Aggiungi questo nella tua onCreate()sezione

Dopo setContentView (R.layout.your_xml);

 if (Build.VERSION.SDK_INT >= 23)
    {
        if (checkPermission())
        {
            // Code for above or equal 23 API Oriented Device 
            // Your Permission granted already .Do next code
        } else {
            requestPermission(); // Code for permission
        }
    }
  else
    {

       // Code for Below 23 API Oriented Device 
       // Do next code
    }

Ora aggiungendo checkPermission () e requestPermission ()

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

private void requestPermission() {

    if (ActivityCompat.shouldShowRequestPermissionRationale(Your_Activity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText(Your_Activity.this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
    } else {
        ActivityCompat.requestPermissions(Your_Activity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 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) {
                Log.e("value", "Permission Granted, Now you can use local drive .");
            } else {
                Log.e("value", "Permission Denied, You cannot use local drive .");
            }
            break;
    }
}

FYI

onRequestPermissionsResult

Questa interfaccia è il contratto per la ricezione dei risultati per le richieste di autorizzazione.


29

Verifica l'autorizzazione multipla nel livello API 23 Passaggio 1:

 String[] permissions = new String[]{
        Manifest.permission.INTERNET,
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.VIBRATE,
        Manifest.permission.RECORD_AUDIO,
};

Passo 2:

 private boolean checkPermissions() {
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p : permissions) {
        result = ContextCompat.checkSelfPermission(this, p);
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 100);
        return false;
    }
    return true;
}

Passaggio 3:

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == 100) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // do something
        }
        return;
    }
}

Step 4: in onCreate of Activity checkPermissions ();


2
Grazie. Sembra una risposta promettente per più autorizzazioni. Ma manca un po 'di esempi. Come gestisce never ask againe manca alcune autorizzazioni? L'utente riceve feedback? Sarebbe stato bello vedere un vero esempio di questo o più commenti sui frammenti di codice.
not2qubit

Per risolvere il problema, non chiedere di nuovo circondare l'aggiunta alle autorizzazioni se blocca con if (shouldshowpermissionrationale ()) {} ... è vero se l'autorizzazione è necessaria e non per sempre scartata
me_

Questa dovrebbe essere la risposta corretta e ottimizzata.
VikaS GuttE,

21

A meno che non vi sia un requisito definito per la scrittura su memoria esterna, puoi sempre scegliere di salvare i file nella directory dell'app. Nel mio caso ho dovuto salvare i file e dopo aver perso 2 o 3 giorni ho scoperto se cambio il percorso di archiviazione da

Environment.getExternalStorageDirectory()

per

getApplicationContext().getFilesDir().getPath() //which returns the internal app files directory path

funziona come un incantesimo su tutti i dispositivi. Questo perché per scrivere su una memoria esterna sono necessarie ulteriori autorizzazioni, ma scrivere nella directory interna dell'app è semplice.


dove scrivi questo codice? Non ricordo di aver usato Environment.getExternalStorageDiretory () sul mio codice
royjavelosa,

5

è necessario utilizzare l'autorizzazione di runtime in marshmallow https://developer.android.com/training/permissions/requesting.html

puoi controllare le informazioni sull'app -> autorizzazione

è la tua app ottenere l'autorizzazione per scrivere memoria esterna o no


2
in realtà questa risposta informazioni app -> permesso risolto il crash :), ma ho accettato l'altra risposta per i dettagli di cosa fare. Vorrei poter accettare entrambi Grazie mille
Badr

Grazie che risolto il crash del browser sul problema di download nell'emulatore Android
sdaffa23fdsf

4

Sembra che l'utente abbia rifiutato l'autorizzazione e l'app tenta di scrivere su disco esterno, causando errori.

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Controlla https://developer.android.com/training/permissions/requesting.html

Questo video ti darà un'idea migliore di UX, gestendo le autorizzazioni di runtime https://www.youtube.com/watch?v=iZqDdvhTZj0


1

Dalla versione marshmallow, gli sviluppatori devono richiedere all'utente le autorizzazioni di runtime. Lascia che ti dia l'intero processo per chiedere le autorizzazioni di runtime.

Sto usando il riferimento da qui: permessi di runtime marshmallow Android .

Innanzitutto creare un metodo che controlli se tutte le autorizzazioni sono concesse o meno

private  boolean checkAndRequestPermissions() {
        int camerapermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        int writepermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int permissionLocation = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
        int permissionRecordAudio = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);


        List<String> listPermissionsNeeded = new ArrayList<>();

        if (camerapermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CAMERA);
        }
        if (writepermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (permissionLocation != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (permissionRecordAudio != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.RECORD_AUDIO);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    } 

Ora ecco il codice che viene eseguito dopo il metodo sopra. Sostituiremo il onRequestPermissionsResult()metodo:

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        Log.d(TAG, "Permission callback called-------");
        switch (requestCode) {
            case REQUEST_ID_MULTIPLE_PERMISSIONS: {

                Map<String, Integer> perms = new HashMap<>();
                // Initialize the map with both permissions
                perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
                // Fill with actual results from user
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i++)
                        perms.put(permissions[i], grantResults[i]);
                    // Check for both permissions
                    if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                            && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, "sms & location services permission granted");
                        // process the normal flow
                        Intent i = new Intent(MainActivity.this, WelcomeActivity.class);
                        startActivity(i);
                        finish();
                        //else any one or both the permissions are not granted
                    } else {
                        Log.d(TAG, "Some permissions are not granted ask again ");
                        //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
//                        // shouldShowRequestPermissionRationale will return true
                        //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
 || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
                            showDialogOK("Service Permissions are required for this app",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            switch (which) {
                                                case DialogInterface.BUTTON_POSITIVE:
                                                    checkAndRequestPermissions();
                                                    break;
                                                case DialogInterface.BUTTON_NEGATIVE:
                                                    // proceed with logic by disabling the related features or quit the app.
                                                    finish();
                                                    break;
                                            }
                                        }
                                    });
                        }
                        //permission is denied (and never ask again is  checked)
                        //shouldShowRequestPermissionRationale will return false
                        else {
                            explain("You need to give some mandatory permissions to continue. Do you want to go to app settings?");
                            //                            //proceed with logic by disabling the related features or quit the app.
                        }
                    }
                }
            }
        }

    }

Se l'utente fa clic sull'opzione NegashowDialogOK() , verrà utilizzato il metodo per mostrare la finestra di dialogo

Se l'utente fa clic su Nega e fa anche clic su una casella di controllo che dice "non chiedere mai più" , il explain()metodo verrà utilizzato per mostrare la finestra di dialogo.

metodi per mostrare le finestre di dialogo:

 private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", okListener)
                .create()
                .show();
    }
    private void explain(String msg){
        final android.support.v7.app.AlertDialog.Builder dialog = new android.support.v7.app.AlertDialog.Builder(this);
        dialog.setMessage(msg)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        //  permissionsclass.requestPermission(type,code);
                        startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.exampledemo.parsaniahardik.marshmallowpermission")));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        finish();
                    }
                });
        dialog.show();
    }

Lo snippet di codice sopra riportato richiede quattro autorizzazioni alla volta. Puoi anche richiedere un numero qualsiasi di autorizzazioni nella tua attività secondo le tue esigenze.


0

Dopo molte ricerche Questo codice funziona per me:

Verifica che l'autorizzazione abbia già: Verifica l'autorizzazione WRITE_EXTERNAL_STORAGE Consentita o no?

if(isReadStorageAllowed()){
            //If permission is already having then showing the toast
            //Toast.makeText(SplashActivity.this,"You already have the permission",Toast.LENGTH_LONG).show();
            //Existing the method with return
            return;
        }else{
            requestStoragePermission();
        }



private boolean isReadStorageAllowed() {
    //Getting the permission status
    int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

    //If permission is granted returning true
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;

    //If permission is not granted returning false
    return false;
}

//Requesting permission
private void requestStoragePermission(){

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }

    //And finally ask for the permission
    ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE_STORAGE);
}

Implementare il metodo Override onRequestPermissionsResult per il controllo è l'utente consentire o negare

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    //Checking the request code of our request
    if(requestCode == REQUEST_WRITE_STORAGE){

        //If permission is granted
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            //Displaying a toast
            Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();

        }else{
            //Displaying another toast if permission is not granted
            Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
        }
    }

0

ha funzionato per me

 boolean hasPermission = (ContextCompat.checkSelfPermission(AddContactActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
    if (!hasPermission) {
        ActivityCompat.requestPermissions(AddContactActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
    }

   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(AddContactActivity.this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}

0
   Try this



int permission = ContextCompat.checkSelfPermission(MainActivity.this,
                    android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

     if (permission != PackageManager.PERMISSION_GRANTED) {
                Log.i("grant", "Permission to record denied");

                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage(getString(R.string.permsg))
                            .setTitle(getString(R.string.permtitle));

                    builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            Log.i("grant", "Clicked");
                            makeRequest();
                        }
                    });

                    AlertDialog dialog = builder.create();
                    dialog.show();

                } else {

                    //makeRequest1();
                    makeRequest();
                }
            }


     protected void makeRequest() {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    500);
        }



     @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case 500: {

                    if (grantResults.length == 0
                            || grantResults[0] !=
                            PackageManager.PERMISSION_GRANTED) {

                        Log.i("1", "Permission has been denied by user");

                    } else {

                        Log.i("1", "Permission has been granted by user");

                    }
                    return;
                }

            }
        }

0

Prima di iniziare il download, controlla le autorizzazioni di runtime e se non disponi delle autorizzazioni, richiedi le autorizzazioni come questo metodo

requestStoragePermission ()

private void requestStoragePermission(){
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
                android.Manifest.permission.READ_EXTERNAL_STORAGE))
        {

        }

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

@Override
public void onRequestPermissionsResult(int requestCode, 
                @NonNull String[] permissions, 
                @NonNull int[] grantResults) {

    if(requestCode == STORAGE_PERMISSION_CODE){
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        }
        else{
            Toast.makeText(this,
                           "Oops you just denied the permission", 
                           Toast.LENGTH_LONG).show();
        }
    }
}

0

In modo semplice l'autorizzazione può essere concessa utilizzando il file manifest.xml, ma era ok fino al livello api 23 sdk versione 6, dopo da qui, se vogliamo ottenere l'autorizzazione dobbiamo chiedere l'uso per consentire l'autorizzazione che sono necessari.

Aggiungi questo codice in mainActivity.java

Override
            public void onClick(View view) {
                // Request the permission
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA},
                        PERMISSION_REQUEST_CAMERA);

Sostituisci CAMERA o aggiungi con WRITE_EXTERNAL_STORAGE se lo desideri e con il codice univoco.

                            new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    101);

Questo è il semplice codice per ottenere l'autorizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.