2011-10-30 11 views
6

"file:///mnt/sdcard/3dphoto/temp19.jps" のようなファイルの実際のパスは、どのようにして取得できますか?content:// media/external/images/media/1 "?実際のパスからUriを取得する

+0

http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uriに関連するコンテキストを提供できますか? – Renaud

答えて

6

"file:// ..."をファイルパスに変換し、次のコードでアイテムのIDを見つけてプロバイダURIに追加します。ファイル拡張子に基づいて、また、右のプロバイダ(例えばMediaStore.Video.Media.EXTERNAL_CONTENT_URIまたは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; 
} 

つのメディアファイルがある後時にはMediaProviderがすぐに更新されません。デバイスのストレージに追加されました。あなたは、このメソッドを使用して、そのレコードを更新するために強制することができます

/** 
* 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

次に、コンテキストに何を渡す必要がありますか? – newstartgirls

+0

アプリケーションのコンテキスト、呼び出しアクティビティ、コードを呼び出すことで得ることができるあらゆる種類のコンテキスト... – Rainbowbreeze

+0

逆の方法は誰でも知っていますか?実際に私は "content://"からファイルを作成したいと思っています –

6

私は私のファイルエクスプローラの活動のために同じ質問を持っていた...しかし、uがファイルのcontenturiのみ画像、オーディオおよびビデオなどのメディアストアのデータをサポートしていTHT KNW必要があります....私はSDカードから画像を選択から画像コンテンツのURIを取得するためにあなたを与えている....このコードを試してみてください... ...それはあなたのために働くだろう

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

そして、それが画像やビデオでない場合はどうなりますか?私たちはどうしたらいいですか? – soshial

1

もう一つの簡単な方法かもしれません。

File file = new File(Path); 

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

この場合、フォルダの特殊文字は解決できません。良くない。 –

関連する問題