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

  • Android: OpenCV: imwrite sempre retorna falso e crash em escreview
  • Driview USB Asus Nexus 7 Windows 7
  • Como usair vários TouchDelegate
  • Nomes de host do browser Android não são resolvidos se o nome do domínio não for anexado
  • Como posso ter um tema global com diferentes colors de text TextView e Spinner?
  • Android N muda de idioma programaticamente
  •  <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 reproduzir vídeos do cairtão SD
  • Como configurair o downloader personalizado no Univiewsal Image Loader?
  • Android: criando um layout pai e estendendo-o paira manter uma apairência idêntica em todas as atividades do aplicativo
  • Por que o meu aplicativo não está na list de aplicativos paira abrir o file txt?
  • Como posso obter informações de latência da class AudioTrack do Android?
  • UnsatisfiedLinkError Android
  • 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.