No Lollipop, a funcionalidade de download funciona bem no meu aplicativo, mas quando atualizei para o Marshmallow, meu aplicativo falha e gera esse erro quando tento fazer o download da Internet para o cartão SD:
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
Ele reclama dessa linha de código:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Eu tenho as permissões no manifesto fora do aplicativo:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Limpei e reconstruí o projeto, mas ele ainda falha.
Respostas:
Você deve verificar se o usuário concedeu permissão de armazenamento externo usando:
Caso contrário, você precisa pedir ao usuário para conceder uma permissão ao seu aplicativo:
É claro que estes são apenas para dispositivos marshmallow, então você precisa verificar se o aplicativo está sendo executado no Marshmallow:
Certifique-se também de que sua atividade implemente
OnRequestPermissionResult
A permissão inteira é assim:
Retorno de chamada do resultado da permissão:
fonte
Manifest.permission.WRITE_EXTERNAL_STORAGE
sempre retorna '-1', ou seja, permissão negada. Verifique a nova documentação, que diz que para a API 19 em diante, você não precisa daWRITE_EXTERNAL_STORAGE
permissão. Como alguns dos comentários acima mencionado, você deve fazer tudo isso com aManifest.permission.READ_EXTERNAL_STORAGE
getExternalFilesDir()
. Em outros casos, a permissão aindaandroid.permission.WRITE_EXTERNAL_STORAGE
deve ser declarada da maneira mais manifesta.A cortesia vai para Solicitar permissões no tempo de execução .
Exemplo
Declare isso como Global
Adicione isso na sua
onCreate()
seçãoApós setContentView (R.layout.your_xml);
Agora adicionando checkPermission () e requestPermission ()
Para sua informação
onRequestPermissionsResult
fonte
Verifique várias permissões no nível da API 23 Etapa 1:
Passo 2:
Etapa 3:
Etapa 4: em onCreate of Activity checkPermissions ();
fonte
never ask again
e perde algumas permissões? O usuário recebe algum feedback? Seria bom ver um exemplo real deste ou mais comentários nos seus trechos de código.A menos que haja um requisito definido de gravação no armazenamento externo, você sempre pode optar por salvar os arquivos no diretório do aplicativo. No meu caso, tive que salvar arquivos e, depois de desperdiçar 2 a 3 dias, descobri se alterei o caminho de armazenamento de
para
funciona como charme em todos os dispositivos. Isso ocorre porque para escrever no armazenamento externo, você precisa de permissões extras, mas a escrita no diretório interno do aplicativo é simples.
fonte
você precisa usar a permissão de tempo de execução no marshmallow https://developer.android.com/training/permissions/requesting.html
você pode verificar as informações do aplicativo -> permissão
é seu aplicativo obter permissão para gravar armazenamento externo ou não
fonte
Parece que o usuário recusou a permissão e o aplicativo tenta gravar no disco externo, causando erro.
Verifique https://developer.android.com/training/permissions/requesting.html
Este vídeo lhe dará uma idéia melhor sobre o UX, tratando das permissões de tempo de execução https://www.youtube.com/watch?v=iZqDdvhTZj0
fonte
Na versão marshmallow, os desenvolvedores precisam solicitar permissões de tempo de execução ao usuário. Deixe-me dar todo o processo para solicitar permissões de tempo de execução.
Eu estou usando referência a partir daqui: permissões de tempo de execução do marshmallow android .
Primeiro, crie um método que verifique se todas as permissões são concedidas ou não
Agora, aqui está o código que é executado após o método acima. Substituiremos o
onRequestPermissionsResult()
método:Se o usuário clicar na opção Negar , o
showDialogOK()
método será usado para mostrar o diálogoSe o usuário clicar em Negar e também clicar em uma caixa de seleção dizendo "nunca perguntar novamente" , o
explain()
método será usado para mostrar a caixa de diálogo.métodos para mostrar diálogos:
O trecho de código acima solicita quatro permissões por vez. Você também pode solicitar qualquer número de permissões em qualquer atividade, conforme seus requisitos.
fonte
Após muita pesquisa, este código funciona para mim:
Verifique se a permissão já possui: Verifique a permissão WRITE_EXTERNAL_STORAGE Permitida ou não?
Implementar o método onRequestPermissionsResult Override para verificar se o usuário permite ou nega
fonte
funcionou para mim
fonte
fonte
Antes de iniciar o download, verifique suas permissões de tempo de execução e, se você não tiver permissão, solicite permissões como este método
requestStoragePermission ()
fonte
De uma maneira simples, a permissão pode ser concedida usando o arquivo manifest.xml, mas foi aprovado até o nível 23 da API 23 sdk versão 6, depois daqui em diante, se quisermos obter a permissão, precisamos solicitar o uso para permitir a permissão que são necessários.
Basta adicionar este código no mainActivity.java
Substitua CAMERA ou adicione com WRITE_EXTERNAL_STORAGE, se desejar, e com o código exclusivo.
Este é o código simples para obter permissão.
fonte