` / storage / emulado / legacy /` ` vs / storage / emulado / 0 / ` vs `data / data / myApp '

? Elad Benda @ | Original: StackOverFlow
---

Eu quero salvar em meu aplicativo uma imageFile

Eu quero " Google+ app cultivador " de usá-lo .

Mas o mais tarde abre outra imagem.

Eu acho que é problema de permissões .

No meu código i salvar aqui:

É este armazenamento externo ? Environment.getExternalStorageDirectory().getAbsolutePath() Que retorna : /storage/emulated/0/myApp/file1.tmp

usando adb shell é ver o arquivo é realmente salvo em : /storage/emulated/legacy/myApp/file1.tmp

por que é a diferença ?

devo usar este lugar em vez disso? É este armazenamento externo ?

getAppContext().getFilesDir().getParent() Que retorna : `data / data / myApp '

---

Top 5 Responder

1Squonk @

Historicamente, a diferença entre o armazenamento interno e externo foi como se segue ...

Interno : A memória RAM interna de um dispositivo Android usado para alocar armazenagem privada de cada app . O armazenamento alocado é protegido para evitar o acesso de qualquer outro aplicativo (exceto em dispositivos enraizadas ) .

Externa: Em muitos casos, um cartão SD sem restrições de segurança, ou seja, todos os aplicativos podem acessar todas as áreas de armazenamento "externo" .

À medida que novas versões do Android têm vindo ao longo e novos dispositivos tem memória RAM cada vez mais interna, a diferença entre interno e externo é cada vez mais ténue . Por exemplo o meu Nexus 7 não tem um slot para cartão SD.

No caso de dispositivos de armazenamento externo sem verdade, ainda é necessário para Android para fornecer uma memória externa emulado, a fim de continuar a ser compatível com aplicativos mais antigos. Em outras palavras, a memória RAM é fisicamente interna ( não removível ), mas uma parte dela é particionado e as APIs do sistema de arquivos do Android tratar essa partição como sendo " externo " e lido por todos .

Quanto aos caminhos que você vê para o armazenamento externo, como ...

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

... um ou outro daqueles (possivelmente ambos) é um redirecionamento ou caminho "virtual" para a mesma parte do diretório externo emulado e arquivo.

É por isso que é essencial usar sempre a chamada API correta para obter acesso a arquivos e diretórios ao invés de assumir um caminho codificado como ele pode muito bem variar de dispositivo para dispositivo .

Se você usar Environment.getExternalStorageDirectory(), você pode ter certeza que qualquer outro aplicativo que faz a mesma será capaz de obter acesso a todos os arquivos que você criou lá.

Se você usar getFilesDir(), então você está acessando a raiz do armazenamento interno alocado em particular com o seu app e acessível apenas para o seu app (embora, como eu mencionei um telefone enraizada pode acessar armazenagem privada / interno).