web-dev-qa-db-fra.com

`/ stockage / émulé / hérité /` vs `/ stockage / émulé / 0 /` vs `data / data / myApp '

Je veux enregistrer dans mon application un fichier image

Je souhaite que "l'application de recadrage Google+" l'utilise.

Mais ce dernier ouvre une autre image.

Je suppose que c'est un problème d'autorisations.

Dans mon code, j'économise ici:

S'agit-il d'un stockage externe? Environment.getExternalStorageDirectory().getAbsolutePath() qui renvoie: /storage/emulated/0/myApp/file1.tmp

l'utilisation de adb Shell signifie que le fichier est réellement enregistré dans: /storage/emulated/legacy/myApp/file1.tmp

pourquoi est la différence?

dois-je utiliser cet endroit à la place? S'agit-il d'un stockage externe?

getAppContext().getFilesDir().getParent() qui renvoie: `data/data/myApp '

16
Elad Benda

Historiquement, la différence entre le stockage interne et externe était la suivante ...

Internal: Le stockage flash interne d'un appareil Android utilisé pour allouer du stockage privé pour chaque application. Le stockage alloué est protégé pour empêcher l'accès par toute autre application (sauf sur appareils rootés).

Externe: Dans de nombreux cas, une carte SD sans aucune restriction de sécurité, c'est-à-dire que toutes les applications peuvent accéder à toutes les zones de stockage "externe".

Avec l'arrivée de nouvelles versions de Android et les nouveaux appareils ont de plus en plus de stockage flash interne, la différence entre interne et externe devient floue. Par exemple, mon Nexus 7 n'a pas de fente pour carte SD .

Dans le cas d'appareils sans véritable stockage externe, il est toujours nécessaire pour Android de fournir un stockage externe émulé afin de rester compatible avec les applications plus anciennes. En d'autres termes, le RAM est physiquement interne (non amovible) mais une section de celui-ci est partitionnée et les API du système de fichiers Android Android traitent cette partition comme étant "externe" et lisible dans le monde entier).

Quant aux chemins que vous voyez pour le stockage externe tels que ...

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

... l'un ou l'autre (éventuellement les deux) est une redirection ou un chemin "virtuel" vers la même partie du répertoire et du fichier externes émulés.

C'est pourquoi il est essentiel de toujours utiliser l'appel d'API correct pour accéder aux fichiers et aux répertoires plutôt que de supposer un chemin codé en dur car il peut très bien varier d'un appareil à l'autre.

Si vous utilisez Environment.getExternalStorageDirectory(), vous pouvez être sûr que toute autre application qui fait de même pourra accéder à tous les fichiers que vous y créez.

Si vous utilisez getFilesDir(), vous accédez à la racine du stockage interne alloué en privé à votre application et accessible uniquement à votre application (bien que, comme je l'ai mentionné, un téléphone enraciné puisse accéder au stockage privé/interne).

28
Squonk