2011-10-30 12 views
6

Mam prawdziwą ścieżkę do pliku takiego jak "file: ///mnt/sdcard/3dphoto/temp19.jps" , jak mogę uzyskać uri jak "content: // media/external/images/media/1 "?Zdobądź Uri z prawdziwej ścieżki

+0

Wydaje się związane z http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uri Czy możesz podać kontekst? – Renaud

Odpowiedz

6

Przekształć "plik: // ..." w ścieżce pliku, znajdź identyfikator elementu za pomocą następującego kodu, a następnie dołącz go do dostawcy URI dostawcy. Ponadto, na podstawie rozszerzeń plików, użyj odpowiedniego dostawcy (na przykład MediaStore.Video.Media.EXTERNAL_CONTENT_URI lub MediaStore.Image.Media.EXTERNAL_CONTENT_URI)

/** 
* Given a media filename, returns it's id in the media content provider 
* 
* @param providerUri 
* @param appContext 
* @param fileName 
* @return 
*/ 
public long getMediaItemIdFromProvider(Uri providerUri, Context appContext, String fileName) { 
    //find id of the media provider item based on filename 
    String[] projection = { MediaColumns._ID, MediaColumns.DATA }; 
    Cursor cursor = appContext.getContentResolver().query(
      providerUri, projection, 
      MediaColumns.DATA + "=?", new String[] { fileName }, 
      null); 
    if (null == cursor) { 
     Log.d(TAG_LOG, "Null cursor for file " + fileName); 
     return ITEMID_NOT_FOUND; 
    } 
    long id = ITEMID_NOT_FOUND; 
    if (cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     id = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); 
    } 
    cursor.close(); 
    return id; 
} 

Czasami MediaProvider nie odświeża natychmiast po jeden plik jest dodane do pamięci urządzenia. można wymusić, aby odświeżyć swoje rekordy za pomocą tej metody:

/** 
* Force a refresh of media content provider for specific item 
* 
* @param fileName 
*/ 
private void refreshMediaProvider(Context appContext, String fileName) { 
    MediaScannerConnection scanner = null; 
    try { 
     scanner = new MediaScannerConnection(appContext, null); 
     scanner.connect(); 
     try { 
      Thread.sleep(200); 
     } catch (Exception e) { 
     } 
     if (scanner.isConnected()) { 
      Log.d(TAG_LOG, "Requesting scan for file " + fileName); 
      scanner.scanFile(fileName, null); 
     } 
    } catch (Exception e) { 
     Log.e(TAG_LOG, "Cannot to scan file", e); 
    } finally { 
     if (scanner != null) { 
      scanner.disconnect(); 
     } 
    } 
} 
+0

Co powinienem przekazać do kontekstu? – newstartgirls

+0

kontekst aplikacji, działanie wywołujące, każdy rodzaj kontekstu, który można uzyskać z kodu wywołującego ... – Rainbowbreeze

+0

Ktoś wie, jak jest odwrotnie? Właściwie chcę utworzyć plik z "content: //" –

6

Miałem to samo pytanie dla mojej działalności File Explorer ... ale u powinien knw tht contenturi dla pliku obsługuje tylko dane Mediastore jak obraz, dźwięk i wideo .... daję wam na uzyskanie zawartości obrazu URI z wybierając obraz z sdcard .... spróbuj tego kodu ... może być to będzie działać dla Ciebie ...

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

A co, jeśli to nie jest obraz lub wideo? Co powinniśmy wtedy zrobić? – soshial

1

Kolejny łatwy sposób:

File file = new File(Path); 

Uri uri = Uri.fromFile(file); 
+1

Tego nie można rozwiązać w przypadku: specjalny znak folderu. Niedobrze. –

Powiązane problemy