7

Dies ist mein Code, wenn ich Bild aus dem internen Speicher (Galerie) bekomme. Im Lollipop-Dateipfad gibt immer Null zurück.Dateipfad Rückgabe null immer in Lollipop Android

if (requestCode == PICK_IMAGE) { 
     if(resultCode == RESULT_OK){ 
      //image successfully picked 
      // launching upload activity 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      columnindex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
      file_path = cursor.getString(columnindex); 
      Log.d(getClass().getName(), "file_path"+file_path); 
      fileUri = Uri.parse("file://" + file_path); 
      cursor.close(); 
      launchUploadActivity(true, PICK_IMAGE); 
     }else if (resultCode == RESULT_CANCELED) { 
      // user cancelled recording 
      Toast.makeText(getApplicationContext(),"User cancelled image selection", Toast.LENGTH_SHORT).show(); 
     } else { 
      // failed to record video 
      Toast.makeText(getApplicationContext(),"Sorry! failed to pick image", Toast.LENGTH_SHORT).show(); 
     } 

Antwort

17

Vielen Dank, ich fand th Die Lösung.

Uri selectedImage = data.getData(); 
      String wholeID = DocumentsContract.getDocumentId(selectedImage); 

      // Split at colon, use second item in the array 
      String id = wholeID.split(":")[1]; 

      String[] column = { MediaStore.Images.Media.DATA };  

      // where id is equal to    
      String sel = MediaStore.Images.Media._ID + "=?"; 

      Cursor cursor = getContentResolver(). 
             query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
             column, sel, new String[]{ id }, null); 

      String filePath = ""; 

      int columnIndex = cursor.getColumnIndex(column[0]); 

      if (cursor.moveToFirst()) { 
       filePath = cursor.getString(columnIndex); 
      } 
      cursor.close(); 
      setImageFromIntent(filePath); 
+0

ich bekomme ungültige Argument Ausnahme ungültig uri – BooDoo

+0

können Sie Ihren Code teilen und log. –

1

hinzufügen Erlaubnis zu Ihrem Manifest -

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

Sie haben Leseberechtigung zu definieren, bevor alle Inhalte lesen.

EDITED

Aktualisieren Sie Ihren Code -

 Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 

     columnindex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     file_path = cursor.getString(columnindex); 
     Log.d(getClass().getName(), "file_path"+file_path); 
     fileUri = Uri.parse("file://" + file_path); 
     cursor.close(); 
     launchUploadActivity(true, PICK_IMAGE); 

Also hier, wenn eine Ausnahmedaten von Cursor in immer dann wirft es Ausnahme.

+0

Thanx, aber ich habe dies bereits getan. –

+0

erhalten Sie einen Fehler? – Ravi

+0

Bildpfad zeigt Null ... aber wenn ich Bild von der Kamera klicke, funktioniert es gut. Ein weiteres Problem ist nur in der Lollipop-Version. –

1

Lollipop entschied sich für einen anderen Kurs mit dem Abrufen von Dateien aus dem System. (Manche sagen, es ist von KitKat, aber ich habe es noch nicht auf KitKat gefunden). Der folgende Code ist die Dateipfad auf Lutscher zu bekommen

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && 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.Audio.Media.EXTERNAL_CONTENT_URI; 
     } 

     final String selection = "_id=?"; 
     final String[] selectionArgs = new String[] { 
       split[1] 
     }; 

     String filePath = getDataColumn(context, contentUri, selection, selectionArgs); 
    } 

isMediaDocument:

public static boolean isMediaDocument(Uri uri) 
{ 
    return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 

getDataColumn:

private 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 column_index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(column_index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

Wenn Sie immer noch Probleme haben, ist this die vollständige Antwort, die für Bilder überprüft , Audio, Video, Dateien usw.

+0

Was ist DocumentsContract.getDocumentId (uri); hier .. –

+0

In Lollipop Bilder werden auch als Dokumente gesehen. Also ruft getDocumentId die ID des Bildes ab. Dies wird verwendet, um Typ (in diesem Fall nur Bilder) zu erhalten und um das richtige Bild von der Abfrage zurückzuholen (siehe getDataColumn -> selection). Hier ist die Entwickler-Website mit DocumentsContract: http://developer.android.com/reference/android/provider/DocumentsContract.html#getDocumentId(android.net.Uri) –

+0

habe diesen Code verwendet, auch null bei Dateipfad –

0
///////////////////create file obj: 
private File mFileTemp; 

String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      mFileTemp = new File(Environment.getExternalStorageDirectory(), InternalStorageContentProvider.TEMP_PHOTO_FILE_NAME); 
     } 
     else { 
      mFileTemp = new File(getFilesDir(), InternalStorageContentProvider.TEMP_PHOTO_FILE_NAME); 
     } 
/////////////////// use in start activity for result 
try { 

        InputStream inputStream = getContentResolver().openInputStream(data.getData()); 
        FileOutputStream fileOutputStream = new FileOutputStream(mFileTemp); 
        copyStream(inputStream, fileOutputStream); 
        fileOutputStream.close(); 
        inputStream.close(); 

        imagepath = mFileTemp.getPath(); 

       } catch (Exception e) { 

        Log.e("TAG", "Error while creating temp file", e); 
       } 
///////////////// 
    public static void copyStream(InputStream input, OutputStream output) 
      throws IOException 
      { 
     byte[] buffer = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = input.read(buffer)) != -1) 
     { 
      output.write(buffer, 0, bytesRead); 
     } 
    } 
+1

Bitte erläutern Sie Ihren Code. Während eine reine Code-Antwort den Code des Fragestellers zum Laufen bringen kann, beantwortet sie ihre Frage nicht, weil sie die Lösung normalerweise nicht verstehen wird. – SuperBiasedMan