estou obtendo
aberto falhou:
EACCES (Permission denied)
na linha OutputStream myOutput = new FileOutputStream(outFileName);
Eu verifiquei a raiz e tentei android.permission.WRITE_EXTERNAL_STORAGE
.
Como posso resolver este problema?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Respostas:
Eu tive o mesmo problema ... O
<uses-permission
estava no lugar errado. Está certo:A
uses-permission
tag precisa estar fora daapplication
tag.fonte
<uses-permission>
tag aparece após a<application>
tag"android:maxSdkVersion="18"
. Ele estava gerando essa exceçãoPara a API 23+, você precisa solicitar as permissões de leitura / gravação, mesmo que elas já estejam no seu manifesto.
AndroidManifest.xml
Para documentação oficial sobre como solicitar permissões para a API 23+, consulte https://developer.android.com/training/permissions/requesting.html
fonte
O Google possui um novo recurso no Android Q : exibição filtrada para armazenamento externo. Uma solução rápida para isso é adicionar esse código no arquivo AndroidManifest.xml:
Você pode ler mais sobre isso aqui: https://developer.android.com/training/data-storage/compatibility
fonte
android:requestLegacyExternalStorage="true"
isso não vai quebrar as versões inferiores ryt? @UrielFrankelEu observei isso uma vez ao executar o aplicativo dentro do emulador. Nas configurações do emulador, você precisa especificar o tamanho do armazenamento externo ("Cartão SD") corretamente. Por padrão, o campo "armazenamento externo" está vazio, e isso provavelmente significa que não existe esse dispositivo e o EACCES é acionado, mesmo que as permissões sejam concedidas no manifesto.
fonte
Além de todas as respostas, verifique se você não está usando o telefone como armazenamento USB.
Eu estava com o mesmo problema no HTC Sensation no modo de armazenamento USB ativado. Ainda posso depurar / executar o aplicativo, mas não consigo salvar em armazenamento externo.
fonte
Adicionar android: requestLegacyExternalStorage = "true" para o manifesto Android é ele trabalhou com Android 10 (Q) no SDK 29+
ou Após a migração Android X .
fonte
Meu problema foi com "TargetApi (23)", necessário se a sua minSdkVersion for abaixo 23.
Então, eu tenho permissão de solicitação com o seguinte trecho
fonte
Solução para Android Q :
fonte
Estou experimentando o mesmo. O que descobri é que, se você for para Configurações -> Gerenciador de aplicativos -> Seu aplicativo -> Permissões -> Ativar armazenamento , ele resolverá o problema.
fonte
Acabou que foi um erro estúpido, pois eu ainda tinha meu telefone conectado ao PC de mesa e não percebi isso.
Então eu tive que desligar a conexão USB e tudo funcionou bem.
fonte
Eu tive o mesmo problema no Samsung Galaxy Note 3, executando o CM 12.1. O problema para mim era que eu tinha
e teve que usá-lo para tirar e armazenar fotos do usuário. Quando tentei carregar as mesmas fotos no ImageLoader, recebi o
(Permission denied)
erro. A solução foi adicionar explicitamentepois a permissão acima limita apenas a permissão de gravação até a API 18 e, com ela, a permissão de leitura.
fonte
Além de todas as respostas, se os clientes estiverem usando o Android 6.0, o Android adicionou um novo modelo de permissão para (Marshmallow).
Truque: se você estiver direcionando a versão 22 ou inferior, seu aplicativo solicitará todas as permissões no momento da instalação, como faria em qualquer dispositivo executando um sistema operacional abaixo do Marshmallow. Se você estiver experimentando o emulador, a partir do Android 6.0 em diante, precisará explicitamente acessar as configurações-> aplicativos-> YOURAPP-> permissões e alterar a permissão, caso tenha dado alguma.
fonte
Estranhamente depois de colocar uma barra "/" antes do meu newFile, meu problema foi resolvido. Eu mudei isso:
para isso:
fonte
Eu tive o mesmo problema e nenhuma das sugestões ajudou. Mas eu achei uma razão interessante para isso, em um dispositivo físico, o Galaxy Tab .
Quando o armazenamento USB está ativado, as permissões de leitura e gravação do armazenamento externo não têm efeito. Basta desativar o armazenamento USB e, com as permissões corretas, o problema será resolvido.
fonte
Eu esperaria que tudo abaixo
/data
pertencesse ao "armazenamento interno". Você deve, no entanto, poder escrever para/sdcard
.fonte
Altere uma propriedade de permissão no seu
/system/etc/permission/platform.xml
grupo e que você precisa mencionar como abaixo.
fonte
Eu tive o mesmo erro ao tentar escrever uma imagem na pasta DCIM / camera no Galaxy S5 (android 6.0.1) e descobri que apenas essa pasta é restrita. Eu simplesmente poderia escrever em DCIM / qualquer pasta, mas não na câmera. Isso deve ser uma restrição / personalização com base na marca.
fonte
Quando seu aplicativo pertence ao aplicativo do sistema, ele não pode acessar o cartão SD.
fonte
lembre-se de que, mesmo que você defina todas as permissões corretas no manifesto: o único local em que os aplicativos de terceiros podem gravar no cartão externo são "seus próprios diretórios" (por exemplo, / sdcard / Android / data /) tentando gravar no em qualquer outro lugar: você receberá a exceção: EACCES (permissão negada)
fonte
Talvez a resposta seja esta:
na API> = 23 dispositivos, se você instalar o aplicativo (o aplicativo não é um aplicativo do sistema), verifique a permissão de armazenamento em "Configuração - aplicativos", há uma lista de permissões para cada aplicativo, verifique-a! experimentar
fonte
No meu caso, eu estava usando uma biblioteca de seletor de arquivos que retornou o caminho para o armazenamento externo, mas começou a partir
/root/
. E mesmo com a permissão WRITE_EXTERNAL_STORAGE concedida em tempo de execução, ainda recebi o erro EACCES (permissão negada) .Portanto, use
Environment.getExternalStorageDirectory()
para obter o caminho correto para o armazenamento externo.Exemplo:
Não é possível escrever:
/root/storage/emulated/0/newfile.txt
Pode escrever:
/storage/emulated/0/newfile.txt
Saída 1:
Saída 2:
fonte
root
peça do caminho resolveu meu problema.Ao usar esse método descontinuado do Android 29 em diante, você receberá o mesmo erro:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Resolução aqui:
getExternalStoragePublicDirectory descontinuado no Android Q
fonte
Para quem vem aqui dos resultados de pesquisa e está segmentando o Android 10: o Android 10 (API 29) altera algumas permissões relacionadas ao armazenamento.
Corrigi o problema quando substitui minhas instâncias anteriores de
Environment.getExternalStorageDirectory()
(que foi preterido na API 29) porcontext.getExternalFilesDir(null)
.Observe que
context.getExternalFilesDir(type)
pode retornar nulo se o local de armazenamento não estiver disponível; verifique isso sempre que estiver verificando se possui permissões externas.Leia mais aqui .
fonte
Estou criando uma pasta em / data / no meu init.rc (mexendo com o aosp no Nexus 7) e tive exatamente esse problema.
Descobriu-se que dar permissão à pasta rw (666) não era suficiente e tinha que ser rwx (777), então tudo funcionou!
fonte
A imposição pós-6.0 de permissões de armazenamento pode ser ignorada se você tiver um dispositivo raiz através destes comandos adb:
fonte
Adicione permissão no manifesto.
fonte
android.permission.READ_INTERNAL_STORAGE
Eu tive o mesmo problema (API> = 23).
A solução https://stackoverflow.com/a/13569364/1729501 funcionou para mim, mas não era prático desconectar o aplicativo para depuração.
minha solução foi instalar o driver de dispositivo adb adequado no Windows. O driver USB do google não funcionou para o meu dispositivo.
PASSO 1: Faça o download de drivers adb para a marca do seu dispositivo.
PASSO 2: Vá para o gerenciador de dispositivos -> outros dispositivos -> procure entradas com a palavra "adb" -> selecione Atualizar driver -> indique a localização na etapa 1
fonte
depois de adicionar permissão resolveu meu problema
fonte
Adicionar dependências gradle
Adicione o código abaixo em sua atividade principal.
fonte
No meu caso, o erro estava aparecendo na linha
como não consegui criar um novo arquivo no cartão sd, tive que usar a abordagem DocumentFile.
Para a pergunta acima, o problema pode ser resolvido com essa abordagem,
Veja também este tópico: Como usar a nova API de acesso ao cartão SD apresentada para o Android 5.0 (Lollipop)?
fonte