2011-06-10 8 views
4

Droid XのファイルアプリとAstroファイルマネージャを使用して画像ファイルを選択する際に問題が発生しています。この2つのアプリケーションは、選択された画像をスキーム "file://"で返しますが、Galleryはスキーム "content://"を持つ画像を返します。どのようにして最初のスキーマを2番目のスキーマに変換しますか?または、2番目の形式で画像をデコードするにはどうすればよいですか?ファイル://スキームをコンテンツに変換する//スキーム

答えて

3

おそらく、コンテンツを変換したい://はファイルに:ギャラリー画像の場合//

、このような何かしてみてください:ここで

Uri myFileUri; 
Cursor cursor = context.getContentResolver().query(uri,new String[]{android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null); 
if(cursor.moveToFirst()) 
{ 
    myFileUri = Uri.parse(cursor.getString(0)).getPath(); 
} 
cursor.close 
+0

これを読む前に解決しました。しかし、これは私がしたことです。 とにかく、ファイルとアストロはfile://をトリミングしてBitmapFactory.decodeFileに渡すことで、file://形式のデータを返すことができます。 お返事ありがとうございます。 – KITT

+0

'Uri.getPath()'は 'String'を返しますが、それ以外の場合は+1します。 –

3

ContentResolver.openInputStream()または関連するメソッドを使用して、バイトストリームにアクセスします。一般に、ファイル:contentかURI:contentかどうかは気にしないでください。

http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri

+1

あるアプリケーションから取得したURIを別のアプリケーションに渡すことができます。それでは、変換は便利ですが、いくつかのアプリケーションは受け入れられるURIの種類を知っています(私はこれを難しい方法で学びました)。まだ解決策を探しています... –

+0

@hackbod、あなたはsdcardを交換するときにUriのバグがあります別のsdcard。ウリは別の絵を指している。 – KITT

+1

それはウリのバグではありません、それはちょうど...よくあなたは何を期待していますか? :)あなたがファイルへのパスを持っていて、基礎となるファイルシステムを内容の異なるものにスワップすると、そのパスがもう意味をなさないことにはなりません。ここで唯一の問題は、メディアコンテンツプロバイダのURIがパスではなく、スキャンした各ファイルの一意のIDで作成されていることです。別のSDカードを挿入すると、古いデータベースが削除され、ファイルが再スキャンされて新しいIDが割り当てられるため、古いカードのURIがあれば、無効になるか、新しいカードのファイルをランダムに参照します。 – hackbod

3

を、問題があることですすべてのファイルに対して、コンテンツUri(con​​tent://)を持つことはできません。コンテンツuriは、MediaStoreの一部であるファイルのためです。例:画像、音声&ビデオ。

ただし、サポートされているファイルについては絶対パスを見つけることができます。

File myimageFile = new File(path); 
Uri content_uri=getImageContentUri(this,myimageFile); 

一般的な方法は次のとおりです。

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; 
    } 
}}