` / stoccaggio / emulato / legacy / ` ` vs / stoccaggio / emulato / 0 / ` ` vs dati / data / myApp '

? Elad Benda @ | Original: StackOverFlow
---

Voglio salvare nella mia app un imageFile

Voglio " Google+ app Cropper " per usarlo .

Ma il più tardi apre un'altra immagine .

Credo che sia problema di autorizzazioni .

Nel mio codice che salvare qui :

È questo storage esterno ? Environment.getExternalStorageDirectory().getAbsolutePath(), Che restituisce : /storage/emulated/0/myApp/file1.tmp

usando adb shell è vedere il file viene salvato in realtà : /storage/emulated/legacy/myApp/file1.tmp

perché è la differenza ?

devo usare questo posto invece ? È questo storage esterno ?

getAppContext().getFilesDir().getParent(), Che restituisce : `data / data / myApp '

---

Top 5 Risposta

1Squonk @

Storicamente la differenza tra storage interno ed esterno è il seguente ...

Interno : La RAM interna di un dispositivo Android utilizzato per assegnare l'ammasso privato per ogni app . L' archiviazione allocato è protetta per impedire l'accesso da qualsiasi altra applicazione ( tranne su dispositivi radicate ) .

Esterno : In molti casi, una scheda SD senza restrizioni di sicurezza, vale a dire, tutte le applicazioni in grado di accedere a tutte le aree di stoccaggio " esterna " .

Come le nuove versioni di Android sono venuti avanti e nuovi dispositivi sono sempre più RAM interna, la differenza tra interno ed esterno diventano più permeabili . Ad esempio il mio Nexus 7 non dispone di uno slot per schede SD .

Nel caso dei dispositivi senza vera di archiviazione esterna, è ancora necessario per Android per fornire una memoria esterna emulato per restare compatibile con le applicazioni meno recenti . In altre parole, la RAM è fisicamente interna ( non rimovibile ), ma una parte di esso è partizionato e le API del file system di Android trattare tale partizione come " esterno" e leggibili da tutti .

Per quanto riguarda i percorsi che si vede per lo storage esterno, ad esempio ...

/storage/emulated/0/myApp/file1.tmp
/storage/emulated/legacy/myApp/file1.tmp

... uno o l'altro di questi ( possibilmente entrambi) è un reindirizzamento o percorso "virtuale " per la stessa parte della directory esterna emulato e file.

Questo è il motivo per cui è indispensabile utilizzare sempre la chiamata API corretto per ottenere l'accesso ai file e alle directory piuttosto che assumere un percorso codificato come può variare da dispositivo a dispositivo .

Se si utilizza Environment.getExternalStorageDirectory(), si può essere sicuri che qualsiasi altra applicazione che fa la stessa sarà in grado di ottenere l'accesso a tutti i file creati lì .

Se si utilizza getFilesDir(), allora si accede alla radice della memoria interna assegnato privatamente per la vostra applicazione e accessibile solo per la vostra applicazione ( anche se, come ho già detto un telefono radicata può accedere ammasso privato / interno) .