2011-09-05 15 views
5

Chcę wybrać plik (za pomocą selektora plików) z astro manager (w moim przypadku * .pdf lub * .doc), ale uri zawiera tylko ścieżkę pliku ("sdcard/my_folder/test.pdf"). Do mojej aplikacji potrzebuję ścieżki treści podobnej do tej z wyboru obrazu (zawartość: // media/external/images/media/2 ). Czy istnieje sposób przekonwertowania pliku "file:///" na "content://"?Konwertuj plik uri na zawartość uri

Lub ma ktoś inny pomysł, jak rozwiązać ten problem?

pozdrawiam

UPDATE: głównym problemem jest to, że po tym, jak wybrać mój plik z valuecallback.onReceiveValue metody filechooser (URI) dodaje „/” za ścieżką. Dostaję więc uri w ten sposób: "sdcard/my_folder/test.pdf /" i moja aplikacja uważa, że ​​pdf jest folderem. Kiedy używam zawartości uri z selektora obrazów, działa.

+0

sdcard/my_folder/test .pdf to jest właściwy URL do odczytu danych z sdcard w urządzeniu mobilnym –

Odpowiedz

11

Podobnie jak w @CommmonsWare, nie ma prostego sposobu na konwersję plików dowolnego typu do treści: //.
Ale o to, w jaki sposób przekonwertować plik obrazu do treści: //

public static Uri getImageContentUri(Context context, File imageFile) { 
    String filePath = imageFile.getAbsolutePath(); 
    Cursor cursor = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Images.Media._ID }, 
      MediaStore.Images.Media.DATA + "=? ", 
      new String[] { filePath }, null); 

    if (cursor != null && cursor.moveToFirst()) { 
     int id = cursor.getInt(cursor 
       .getColumnIndex(MediaStore.MediaColumns._ID)); 
     Uri baseUri = Uri.parse("content://media/external/images/media"); 
     return Uri.withAppendedPath(baseUri, "" + id); 
    } else { 
     if (imageFile.exists()) { 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.DATA, filePath); 
      return context.getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     } else { 
      return null; 
     } 
    } 
} 
+0

Próbowałem tego dla - file: ///storage/emulated/0/Android/data/com.pkg_name/files/out.mp4, ale zwracana * null *. Próbowałem też zmienić 'MediaStore.Images.Media' na' MediaStore.Video.Media', ale wciąż nie ma szczęścia – NarendraJi

+0

Dzięki, to jest jedyne rozwiązanie, które zadziałało na moim urządzeniu z Androidem-N. Moja aplikacja kieruje na interfejs API 24. – zeeshan

+0

@Ben Lee, gdy próbuję zdekodować ten obraz w bitmapie, zwróci on null. –

5

Oto prostsza droga do rozważenia, które mogą być odpowiednie dla Ciebie.

Używam go do dzielenia pobrane obrazy na Google Plus z mojego Android App:

/** 
* Converts a file to a content uri, by inserting it into the media store. 
* Requires this permission: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
*/ 
protected static Uri convertFileToContentUri(Context context, File file) throws Exception { 

    //Uri localImageUri = Uri.fromFile(localImageFile); // Not suitable as it's not a content Uri 

    ContentResolver cr = context.getContentResolver(); 
    String imagePath = file.getAbsolutePath(); 
    String imageName = null; 
    String imageDescription = null; 
    String uriString = MediaStore.Images.Media.insertImage(cr, imagePath, imageName, imageDescription); 
    return Uri.parse(uriString); 
} 
0

Jednym z prostszych sposobów osiągnięcia tego celu może być za pomocą MediaScannerConnection

File file = new File("pathname"); 
MediaScannerConnection.scanFile(getContext(), new String[]{file.getAbsolutePath()}, null /*mimeTypes*/, new MediaScannerConnection.OnScanCompletedListener() { 
      @Override 
      public void onScanCompleted(String s, Uri uri) { 
       // uri is in format content://... 
      } 
     });