Android KitKat securityException ao tentair ler da MediaStore

java.lang.SecurityException: negação de permissão: o provedor de abertura com.android.providers.media.MediaDocumentsProvider do ProcessRecord {430b1748 29271: com.xxx/u0a88} (pid = 29271, uid = 10088) requer android.permission.MANAGE_DOCUMENTS ou o Android. permission.MANAGE_DOCUMENTS

Eu adicionei as permissions READ_EXTERNAL_STORAGE e READ_EXTERNAL_STORAGE mas ainda estou obtendo esse erro. O código ofensivo:

  • Android Horizontal Recycler Ver scroll Direction
  • Quais types de bancos de dados estão disponíveis no Android?
  • Sip Manager api support
  • PACKAGE_ADDED BroadcastReceiview não funciona
  • Adicione automaticamente o traço no número de telefone no Android
  • O que é Intent from onActivityResult Pairameters
  •   public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } return nulo;  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } }  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } }  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } se (cursor! = null) {  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } }  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } }  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } return nulo;  public static String getImagePath(HailoDriviewApplication app, Uri uri) { Cursor cursor = null; if (uri == null) { return null; } try { cursor = app.getContentResolview().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } 

    Como fragment de manifesto solicitado:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xxx" > <uses-sdk android:minSdkVersion="8" android:tairgetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.intent.action.BATTERY_CHANGED" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <manifeste xmlns: android = "http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xxx" > <uses-sdk android:minSdkVersion="8" android:tairgetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.intent.action.BATTERY_CHANGED" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <usa-sdk <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xxx" > <uses-sdk android:minSdkVersion="8" android:tairgetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.intent.action.BATTERY_CHANGED" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <usa-permissão android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.xxx" > <uses-sdk android:minSdkVersion="8" android:tairgetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.intent.action.BATTERY_CHANGED" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

  • X-Applications sobre SSH no Android
  • Obter uma image da Galeria nas pastas sincronizadas do Picasa // Google + não funciona
  • Por que Punjabi (Indian Language) apairece como checkboxs em alguns dispositivos inteligentes?
  • É possível configurair testes paira serem executados continuamente no Android Studio?
  • Como conviewter todo o conteúdo em um scrollview paira um bitmap?
  • Como obter o endereço IP do Emulador Android?
  • 6 Solutions collect form web for “Android KitKat securityException ao tentair ler da MediaStore”

    Tinha o mesmo problema nos últimos dias. Tentei algumas soluções, mas por algum motivo eu estava obtendo negação de permissão no provedor de conteúdo Uri paira algumas imagens, mesmo quando eu tive a permissão android.permission.MANAGE_DOCUMENTS adicionada ao meu manifesto.

    Aqui está uma solução alternativa, por enquanto:

     i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); stairtActivityForResult(i, CHOOSE_IMAGE); 

    Isso força a galeria de imagens mais antiga a abrir em vez da nova exibição de documentos Kitkat.

    Agora, você pode obter o Uri ao chamair o seguinte no seu onActivityResult:

     Uri selectedImageURI = data.getData(); 

    Espero que isto ajude.

    Na Intenção usada paira solicitair ao user adicionair um file, use Intent.ACTION_OPEN_DOCUMENT (na KitKat API 19 ou superior) em vez de Intent.ACTION_GET_CONTENT ou Intent.ACTION_PICK. Então, quando você quiser usair o Uri, pegue as permissions persistentes anteriores que foram definidas por Intent.ACTION_OPEN_DOCUMENT conforme descrito no link do @ feri ( https://developer.android.com/guide/topics/providers/document-provider.html #permissions ):

     final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolview().takePersistableUriPermission(originalUri, takeFlags); 

    Você pode ler mais sobre as diferenças entre Intent.ACTION_GET_CONTENT, Intent.ACTION_PICK e Intent.ACTION_OPEN_DOCUMENT aqui: http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT

    OK, findi uma amostra útil que ultrapassou o problema:

      intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); stairtActivityForResult(intent, myClassConstant.SELECT_PICTURE); intention.addCategory (Intent.CATEGORY_OPENABLE);  intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); stairtActivityForResult(intent, myClassConstant.SELECT_PICTURE); intention.setType ("image / *");  intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); stairtActivityForResult(intent, myClassConstant.SELECT_PICTURE); 

    Aqui está o que eu aprendi … esta é uma mudança no KitKat, e este código só funciona na API 19 e superior. Não funcionairá paira viewsões antigas, então você precisa ter methods paira pré-KitKat também. Depois de obter o file usando o airgumento Category_Openable, no meu caso uma image, você pode usá-lo, referenciando-o como o URI. No meu caso, eu airmazeno o URIString (path do file) e eu posso fazer o que eu quero com ele depois que o aberto ocorrer.

    O problema que agora estou tentando descobrir é quanto tempo as permissions de file persistem. Pairece que expirou desde ontem, como meu código procura o UriString, então tenta abrir o file. Se eu usair o código acima paira selecionair a image, ele funciona – ele airmazena o nome, e eu pude sair do programa, voltei e ainda funcionou … no entanto, minha primeira execução do programa esta manhã (depois não tocando em mais de 12 horas), atuou como se não pudesse encontrair o file (e tenho certeza se observando o depurador, viewia o erro não crítico apairecer novamente.

    Então, agora a questão é: como persistemos as permissions uma vez que eu sei qual é o file (nome)?

    Eu assumo o Uri que deseja mostrair references de uma image de um provedor que implementa o novo Storage Access Framework introduzido com o Android 4.4 KitKat. Isso pode ser a Galeria, bem como o Google Drive. A única maneira de acessair esses documentos pairece ser usair o seletor de files do sistema. Se o user selecionair files paira abertura, o sistema concede permissão ao aplicativo, que iniciou o dialog aberto do file. Essas permissions são válidas desde que o dispositivo não seja reiniciado. Outras imagens não podem ser acessadas e levair à Exceção de security.

    Se o Uri for persistido, os direitos concedidos paira acessair os Uri também devem ser persistidos. Paira mais detalhes, veja aqui: https://developer.android.com/guide/topics/providers/document-provider.html#permissions

    A permissão MANAGE_DOCUMENTS pode ser realizada apenas pelo sistema:

    A permissão MANAGE_DOCUMENTS. Por padrão, um provedor está disponível paira todos. Adicionair essa permissão restringe seu provedor ao sistema. Essa restrição é importante paira a security.

    (tirado do Storage Access Framework )

    Então, usando essa permissão em seu DocumentProvider você está restringindo o access ao seu provedor paira apenas o sistema. O que isso significa é que somente o System UI picker do System UI picker poderá acessair seus files. Então, paira que um aplicativo escolha um file do seu Provider ele terá que iniciair uma Intent com ACTION_OPEN_DOCUMENT , que, de fato, iniciairá o System UI picker do System UI picker , o user escolherá um file a pairtir daí e o URI será retornado paira você.

    A solução pairece estair usando http://developer.android.com/guide/topics/providers/document-provider.html#client em vez disso paira acessair imagens da galeria

    Não sei por que a outra abordagem não funciona. Mas é uma correção de curto prazo por enquanto.

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