Autore Topic: File su micro sd marshmallow  (Letto 832 volte)

Offline Rino63

  • Utente normale
  • ***
  • Post: 167
  • Respect: +3
    • Mostra profilo
File su micro sd marshmallow
« il: 20 Luglio 2017, 18:06:46 CEST »
0
Ciao a tutti, sto implementando un'app che dovrebbe salvare i dati su una scheda micro sd. Il sistema operativo è marshmallow ed ho eseguito le seguenti operazioni
1) ho messo i permessi
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
mel manifest
2) chiesto i permessi a run time:
        if ((ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)|| (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE))
                != PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            android.Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION);
            Log.v("nei permessi", "permessi");
        }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        int i = 0;


        switch (requestCode) {
            case REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION: {

                Log.v("In mering informt", "else =>");
                System.out.println(grantResults[0]);
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {

                    Log.v("PermResult", "OK");

                } else {


                }
                return;
            }

        }
    }

3) ho usato il seguente codice:
        String extPath = "";
        if (fs != null && fs.length >= 2)
        {
            extPath = fs[1].getAbsolutePath();
        }

        File miofile=new File((extPath+"/time").toString());
        miofile.mkdir();

ma non funziona.... qualche suggerimento?
Grazie a chi mi risponderà
« Ultima modifica: 20 Luglio 2017, 19:03:41 CEST da Rino63 »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:File su micro sd marshmallow
« Risposta #1 il: 21 Luglio 2017, 10:01:23 CEST »
0
"Non funziona" non si può sentire >_<

Spiega bene qual'è il problema:
- Non succede nulla? E i log che dicono?
- Va in errore? E i log che dicono?
- Non ottieni i permessi? E i log che dicono?
- Non ottieni il path alla SD? E i log che dicono?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Rino63

  • Utente normale
  • ***
  • Post: 167
  • Respect: +3
    • Mostra profilo
Re:File su micro sd marshmallow
« Risposta #2 il: 21 Luglio 2017, 14:12:13 CEST »
0
i permessi vengono regolarmente registrati infatti ad un successivo riavvio non vengono chiesti di nuovo (ma quel codice, sia pure per finalità diverse, è testato e funzionante con altre due app). Nel logcat non vengono segnalati errori viene solo visualizzato il percorso  che riporto qui
E/SD Path: /storage/16EF-2C14/Android/data/com.time/files
e ovviamente non trovo la cartella time.......

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:File su micro sd marshmallow
« Risposta #3 il: 21 Luglio 2017, 14:53:11 CEST »
0
l'array fs come lo ricavi?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Rino63

  • Utente normale
  • ***
  • Post: 167
  • Respect: +3
    • Mostra profilo
Re:File su micro sd marshmallow
« Risposta #4 il: 21 Luglio 2017, 14:59:49 CEST »
0
 File[] fs = this.getExternalFilesDirs(null);
        String extPath = "";
        if (fs != null && fs.length >= 2)
        {
            extPath = fs[1].getAbsolutePath();
            Log.e("SD Path",fs[1].getAbsolutePath());
         
        }

Offline wlf

  • Utente normale
  • ***
  • Post: 373
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:File su micro sd marshmallow
« Risposta #5 il: 21 Luglio 2017, 16:33:16 CEST »
0
Mi provi a togliere da  "/storage/16EF-2C14/Android/data/com.time/files" tutto lasciando solo " /storage/16EF-2C14/"?


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:File su micro sd marshmallow
« Risposta #6 il: 21 Luglio 2017, 17:40:30 CEST »
+1
Il problema sembra essere condiviso da altri sviluppatori, ma non ho trovato una soluzione chiara.

Non ho la possibilità di fare dei test, ma leggendo in giro sembra che specificando un nome in getExternalFilesDirs generi la cartella specificata:

Codice (Java): [Seleziona]
File[] fs = this.getExternalFilesDirs("time");
Mi sembra molto strano, soprattutto perché questo comportamento non è documentato. Valuta tu se fare questa prova

Inoltre, un'altra prova da fare è usare "mkdirs" invece di "mkdir"

Codice (Java): [Seleziona]
miofile.mkdirs();
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Rino63

  • Utente normale
  • ***
  • Post: 167
  • Respect: +3
    • Mostra profilo
Re:File su micro sd marshmallow
« Risposta #7 il: 21 Luglio 2017, 18:08:24 CEST »
0
Grazie, File[] fs = this.getExternalFilesDirs("time"); questa è la soluzione, ho provato anche tutte le altre suggerite ma solo questa ha funzionato. Grazie ancora :)

Offline wlf

  • Utente normale
  • ***
  • Post: 373
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:File su micro sd marshmallow
« Risposta #8 il: 21 Luglio 2017, 18:16:39 CEST »
0
Ma poi nella microSD dove ti scrive realmente, in radice o sotto la cartella della tua App?
Hai provato a togliere la microSD e leggerla da un PC per verificare dove viene scritto realmente?

A mio avviso non si può scrivere in radice, ma creando una cartella relativa all'App come ti ha suggerito Ohmnibus allora si!

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:File su micro sd marshmallow
« Risposta #9 il: 21 Luglio 2017, 18:20:23 CEST »
0
@wlf: La cartella viene creata nella memoria esterna in un percorso legato all'app, in questo caso particolare:

/storage/16EF-2C14/Android/data/com.time/files/time
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline wlf

  • Utente normale
  • ***
  • Post: 373
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:File su micro sd marshmallow
« Risposta #10 il: 24 Luglio 2017, 09:45:23 CEST »
0
@Ohmnibus
Ok, ma la mia curiosità è se si riesca a scrivere in radice della microSD che dovrebbe essere "/storage/16EF-2C14" oppure questo comporti che si abbiano i permessi di root?
E' praticamente come scrivere file nella memoria interna? Non si esce quindi dalla cartella dell'App senza permessi di root?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:File su micro sd marshmallow
« Risposta #11 il: 25 Luglio 2017, 22:41:11 CEST »
0
Da quel che ho capito fino ad Android 7.0 sulle schede SD non è possibile uscire dalla cartella dell'app in scrittura.

Qui c'è una disanima sull'argomento: https://stackoverflow.com/a/40201333/466938

Non so aiutarti meglio di così.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline wlf

  • Utente normale
  • ***
  • Post: 373
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:File su micro sd marshmallow
« Risposta #12 il: 31 Luglio 2017, 17:30:25 CEST »
0
Un inferno; come spesso accade il comportamento è in base alla versione del SO.