2013-11-28 16 views
21

auswählen Da ich meine App zu Kitkat Version unterstütze, jetzt in dieser Art und Weise der Abruf von Datei aus der Galerie war anders.absoluten Pfad abrufen, wenn Bild aus der Galerie kitkat Android

Ich habe dies bevorzugt Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT für Datei aus der Galerie abrufen und erfolgreich arbeiten, aber ich erforderlich Absoluten Pfad der Datei, erhalte ich

content://com.android.providers.media.documents/document/image:2505 

Für 19 unten Version verwenden wir unterschiedliche uri unter Verwendung dass ich erhalte Weg auf diese Weise

Cursor cursor = this.getContentResolver().query(originalUri, projection, null, null, null); 
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
cursor.moveToFirst(); 
String fpath = cursor.getString(column_index); 

aber in 19-Version wird es mir null-Wert geben, wie absoluten Pfad der image-Datei zu erhalten, die durch den Benutzer ausgewählt wurde.

Dank

Antwort

27

Hier ist ein Weg, den absoluten Pfad nach Datei auswählen zuzugreifen.

Nachdem die Daten immer in neuem URI-Format für KK (KitKat) wie auf diese Weise

content://com.android.providers.media.documents/document/image:2505 

Gerade ID des Dokuments extrahiert

if(requestCode == GALLERY_KITKAT_INTENT_CALLED && resultCode == RESULT_OK){ 

    Uri originalUri = data.getData(); 

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

    /* now extract ID from Uri path using getLastPathSegment() and then split with ":" 
    then call get Uri to for Internal storage or External storage for media I have used getUri() 
    */ 

    String id = originalUri.getLastPathSegment().split(":")[1]; 
    final String[] imageColumns = {MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = null; 

    Uri uri = getUri(); 
    String selectedImagePath = "path"; 

    Cursor imageCursor = managedQuery(uri, imageColumns, 
      MediaStore.Images.Media._ID + "="+id, null, imageOrderBy); 

    if (imageCursor.moveToFirst()) { 
     selectedImagePath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
    } 
    Log.e("path",selectedImagePath); // use selectedImagePath 
}else if() { 
     // for older version use existing code here 
} 

// By using this method get the Uri of Internal/External Storage for Media 
private Uri getUri() { 
    String state = Environment.getExternalStorageState(); 
    if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) 
     return MediaStore.Images.Media.INTERNAL_CONTENT_URI; 

    return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
} 
+0

Ich habe versucht, dies auszuführen, aber ich empfangen Dezember 01-09: 09: 49,333: E/Android Runtime (21760): java.lang.RuntimeException: Ausfall liefern Ergebnis result {die null = beantragen = 1, Ergebnis = -1, data = Intent {dat = Inhalt: flg = 0x1}} zur Aktivität {com.example.loadimage/com.example.loadimage.MainActivity}: java.lang.SecurityException: Keine Berechtigungsfreigabe für UID 10259 und Uri gefunden Inhalt: –

+0

scheint, dass Ausnahme in dieser Zeile auftritt takePersistableUriPermission Muss ich jede Art von Berechtigung in Manifest hinzufügen –

+1

seine throw 'verursacht durch: java.lang.SecurityException: Angeforderte Flags 0x1, aber nur 0x0 sind erlaubt ' – RobinHood

4

Pratik Lösung mir viel geholfen. Im Folgenden ist die Version, die für mich in Kitkat 4.4.2 funktioniert. Drei Dinge, die ich änderte, sind
1) Verwenden von Content Resolver, um den Pfad
2) originalUri.getLastPathSegment(). Split (":") [1] gibt mir Index außerhalb der Grenze, so verwende ich stattdessen Index 0 .Es hat so weit funktioniert
3) Entfernte Takeflags und prüfen auf frische Daten, da wir den Cursor mit ID filtern.

try { 
     Uri originalUri = data.getData(); 
     String pathsegment[] = originalUri.getLastPathSegment().split(":"); 
     String id = pathsegment[0]; 
     final String[] imageColumns = { MediaStore.Images.Media.DATA }; 
     final String imageOrderBy = null; 

     Uri uri = getUri(); 
     Cursor imageCursor = activity.getContentResolver().query(uri, imageColumns, 
           MediaStore.Images.Media._ID + "=" + id, null, null); 

     if (imageCursor.moveToFirst()) { 
      value = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
     } 

    } catch (Exception e) { 
     Toast.makeText(activity, "Failed to get image", Toast.LENGTH_LONG).show(); 
    } 
2
Bitmap bitmap = MediaStore.Images.Media 
.getBitmap(getActivity().getContentResolver(), uri); 

Ich hoffe, dass diese Ihnen helfen.

-1

Perfekt funktionierende Lösung:

package utils; 

/** 
* Created by layer on 4/21/2015. 
*/ 
import android.annotation.TargetApi; 
import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Environment; 
import android.provider.DocumentsContract; 
import android.provider.MediaStore; 

public class ImageFilePath { 

    /** 
    * Method for return file path of Gallery image 
    * 
    * @param context 
    * @param uri 
    * @return path of the selected image file from gallery 
    */ 
    @TargetApi(Build.VERSION_CODES.KITKAT) 
    public static String getPath(final Context context, final Uri uri) { 

     // check here to KITKAT or new version 
     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]; 
       } 
      } 
      // 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()); 
    } 
} 

https://github.com/layerlre/Android-Utility-Class/blob/master/utils/ImageFilePath.java

Hoffnung für Sie arbeitet.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz anzugeben. Link-Only-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. Aus der Bewertung] (/ review/low-quality-posts/18524227) – Jon

Verwandte Themen