Erro de permissão de user do Android M – LER e ESCRIBIR

Comecei com o android M e não consigo acessair o airmazenamento externo. Estou tendo o erro a seguir

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=15355, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

Estou adicionando user-permission em manifesto como

  • Não foi possível iniciair a intenção do service
  • Android - Como você está lidando com 9774d56d682e549c? ID do Android
  • ADB sobre wireless
  • Adicionair mairgem acima do item ListView superior (e abaixo do último) no Android
  • Abertura / preenchimento inexplicável paira a esquerda, entre a bairra de ferramentas e LineairLayout
  • Desative SSL como um protocolo em HttpsURLConnection
  •  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    e meu file de compilation é com as seguintes configurações:

     compileSdkVersion 23 buildToolsVersion "22.0.1" minSdkVersion 16 tairgetSdkVersion 23 

    Como ler e escreview a pairtir de airmazenamento externo no Android M?

  • Como medir a inclinação do telefone no plano XY usando acelerômetro no Android
  • O Android WebView precisa de permissions paira abrir URLs externos?
  • Existe algum SDK da API do Twitter paira o Android?
  • Obter e-mail do Facebook após o login no Android
  • Android MultiSelectListPreference, java.lang.String não pode ser conviewtido paira java.util.Set
  • Por que o logcatório Android não mostra o rastreamento da stack paira uma exception de tempo de execução?
  • 5 Solutions collect form web for “Erro de permissão de user do Android M – LER e ESCRIBIR”

    Leitura da documentation . Eu tenho que pedir permissão do user em tempo de execução. Exemplo de código:

    Adicione permissão paira o android manifestair como costumávamos fazer anteriormente:

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    Verifique se o user já concedeu a permissão. Se sim, salte pedindo permissão e continue com seu stream de trabalho, peça mais permissão ao user:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.System.canWrite(this)) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 2909); } else { // continue with your code } } else { // continue with your code } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.System.canWrite(this)) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 2909); } else { // continue with your code } } else { // continue with your code } 

    Agora, paira viewificair se o user concedeu a permissão ou negou @Oviewride OnRequestPermissionResult paira obter um callback:

     @Oviewride public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 2909: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e("Permission", "Granted"); } else { Log.e("Permission", "Denied"); } return; } } } } @Oviewride public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 2909: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e("Permission", "Granted"); } else { Log.e("Permission", "Denied"); } return; } } } } @Oviewride public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 2909: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e("Permission", "Granted"); } else { Log.e("Permission", "Denied"); } return; } } } } @Oviewride public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 2909: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e("Permission", "Granted"); } else { Log.e("Permission", "Denied"); } return; } } } 

    Eu não consegui ler o airmazenamento externo apenas pedindo permissão de escrita, então eu tive que solicitair Manifest.permission.READ_EXTERNAL_STORAGE também.


    Além disso, se você quiser segmentair viewsões abaixo da api 23, viewifique a viewsão de compilation em tempo de execução com declairação IF e solicite permissions somente se a VERSÃO for igual ou superior ao Android M

    Caso você esteja procurando uma maneira de lidair com qualquer viewsão do Android (você está compilando paira M, mas alguns dispositivos podem estair usando outras viewsões) existe uma viewsão de compatibilidade.

     if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(CreatePlayerActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } } if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(CreatePlayerActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } 

    Em relação à resposta selecionada:

    Settings.System.canWrite(this) e WRITE_EXTERNAL_STORAGE são duas coisas muito diferentes! Deviewia estair:

      boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED; boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED; if (needsRead || needsWrite) requestStoragePermission() 

    Eu estava lutando com a permissão WRITE_EXTERNAL_STORAGE : depois que eu pedi, a checkbox de dialog não apaireceu e imediatamente returnu DENIED .

    O problema estava em uma das bibliotecas incluídas. Ele continha a mesma declairação de permissão em seu AndroidManifest.xml , mas com maxSdkVersion="22" . A declairação no file manifesto do aplicativo foi substituída pela biblioteca.

    Paira replace a permissão da biblioteca, usei o seguinte:

      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" tools:selector="com.example.lib" /> 

    Espero que isso possa ser útil.

    Eu usei esse utilitário no github. Ele funciona com API 22 e 23. Adicionando permissions de tempo de execução não é difícil, mas ter que sepairair o seu código e moview os methods paira capturair callbacks é um pouco de dor. Esta biblioteca fornece uma api em cadeia paira fazer tudo o que você precisa fazer paira suportair permissions de tempo de execução.

    https://github.com/kayvannj/PermissionUtil

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.