Imansible creare la directory nello storage esterno sebbene le autorizzazioni siano apparentemente impostate correttamente

io ho

 

nel mio file manifest, tuttavia non riesco nel tentativo di creare una directory

  Log.d(LOG_STRING, android.os.Environment.getExternalStorageState() ); java.io.File folder = new java.io.File(Environment.getExternalStorageDirectory() + java.io.File.separator + "test"); boolean success = true; if (!folder.exists()) { success = folder.mkdir(); } if (success) { Log.d(LOG_STRING, "Created directory"); } else { Log.d(LOG_STRING, "FAILED WHILE CREATING DIRECTORY"); } 

Lo stato della memoria esterna è “montato”, ma la directory di test non può essere creata e l’output è "FAILED WHILE CREATING DIRECTORY" .

Navigando nel telefono su “Info app”, l’authorization “modifica o cancella il contenuto dell’archivio USB” è contrassegnata per essere triggersta per la mia applicazione.

Quale potrebbe essere la causa di questo? Alcune impostazioni speciali del telefono? Si tratta di un Samsung GT-I9506 con Android 4.3 (API18). Da notare che getExternalStorageDirectory non si trova sulla scheda SD, ma nella memoria interna ( /storage/emulated/0/ ).


Aggiornare:

Parlando con i colleghi, sembra che questo dispositivo abbia subito numerosi aggiustamenti dopo essere stato radicato (per consentire a un’applicazione specifica di scrivere direttamente sulla scheda SD). Probabilmente non vale la pena di indagare ulteriormente, semplicemente passerò a un altro dispositivo. Terrò il dispositivo per un po ‘e se qualcuno si presentasse con una risposta, testerò rapidamente se risolve il problema.


Aggiornamento 2: (estremità del Bounty)

Il problema rimane irrisolto, ma come affermato in precedenza, è molto probabilmente qualcosa di molto specifico per questo dispositivo. Non è ansible scrivere su alcun percorso, essendo esso storage esterno o interno, nemmeno nel percorso restituito da getExternalCacheDir() .

Devi prima usare file.mkdirs() invece di folder.mkdir() .

E se anche non funziona allora è necessario controllare se è ansible accedere alla sdcard o no.

Per il controllo è ansible utilizzare il metodo seguente.

 boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, but all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; } 

Leggi al documento ufficiale.

Spero che ti dia qualche indizio.

Puoi provare questo codice. Ho anche emulato la scheda sd su Lg g2 mini e posso accedere solo alla scheda esterna nella mia cartella dei pacchetti

 for(File f : getExternalFilesDirs(null)){ try { File f2 = new File(f.getAbsolutePath(), "testFile"); Log.d("test log", "file path " + f2.getAbsolutePath()); f2.createNewFile(); Log.d("test log", "file exist " + f2.exists()); } catch (IOException e) { Log.d("test log", "error"); } } 

e l’output è:

 D/test log? file path /storage/emulated/0/Android/data/my.awesome.package/files/testFile D/test log? file exist true D/test log? file path /storage/external_SD/Android/data/my.awesome.package/files/testFile D/test log? file exist true 

Nel mio caso ho dovuto andare in Settings -> Apps -> NameOfApp -> Permissions e triggersre le autorizzazioni di archiviazione. Non so perché questo viene distriggersto di default se ho tutte le autorizzazioni su AndroidManifest.xml. Sono su un Moto G (3rd Gen) con Android Marshmallow 6.0.

Prova questo:

  final File externalStoragePublicDirectory = Environment.getExternalStorageDirectory(); File file = new File(externalStoragePublicDirectory, "test"); file.mkdirs();