Get realPath retour null sur android marshmallow?

J'utilise cette fonction pour obtenir le chemin d'image depuis uri:

private static String getRealPathFromURI(Context context, Uri contentUri) { Cursor cursor = null; try { String[] proj = {MediaStore.Images.Media.DATA}; cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } finally { if (cursor != null) { cursor.close(); } } } 

La fonction ci-dessus fonctionne bien avec la version <23. Mais il renvoie null avec android marshmallow?

  • Définition des métadonnées de flux vidéo en utilisant Ffmpeg
  • Quelle solution multiplate-forme mobile basée sur Ruby à utiliser?
  • Android: définissez la vue vide sur une vue de liste
  • Est-il possible d'utiliser MMS pour diffuser une radio Internet dans Android?
  • Android RecyclerView qui se trouve dans un fragment qui se trouve dans un ViewPager ne recharge pas / actualise les vues si setOffscreenPageLimit est atteint
  • Obtenir la version Android SDK d'un périphérique à partir de la ligne de commande
  •  I am using emulator nexus 4 with android 6.0 x86_64 

    L'émulateur possède des autorisations de stockage.

    Quel peut être le problème ?

  • Android Email EditText Validation
  • Empêchez les divisions cliquables d'être mises en surbrillance dans Android WebView
  • Quel est le but de Outils-> Android-> Activer le service ADB?
  • Bluetooth BLE Écriture Android vers périphérique avec débit maximal
  • Android BroadcastReceiver ne peut recevoir aucun événement de diffusion
  • Comment augmenter la hauteur de la rangée de table selon les écrans?
  • One Solution collect form web for “Get realPath retour null sur android marshmallow?”

     /** * Get a file path from a Uri. This will get the the path for Storage Access * Framework Documents, as well as the _data field for the MediaStore and * other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @author paulburke */ public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } 

    Pris d' ici et de cette réponse . Il s'agit d'un hack laid qui n'est pas garanti pour fonctionner sur tous les périphériques, mais dans mon expérience, il fonctionne sur 99% des périphériques. Selon Commons, vous ne devriez pas supposer que le flux que vous recevez via ContentResolver est converti en fichier. Au lieu de cela, vous êtes censé ouvrir un inputstream de cet Uri utilisant la méthode context.getContentResolver().openInputStream(fileUri) . Reportez-vous à sa publication CommonsBlog pour plus d'informations à ce sujet et comment gérer Uris

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.