2011-11-13 6 views
4

私のAndroidアプリは画像を開いて操作します。ファイル、ギャラリー、など私が望む画像を開いているときにAndroidの異なるソースからURIを解決する

これを行うには
Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, 
              "Complete action using"), 
              PICK_FROM_FILE); 

、それはESファイルエクスプローラのように、3〜4オプションのダイアログを起動します:My活動は、次のようにイメージを開くことを要求しますBitmapFactory.decodeFile(path)を使用してこれをビットマップとして読み込みます。

私はESからファイルを選択し、パスを次のように計算され、エクスプローラのファイル:パスの値がどこにあるか

String path = imageData.getData().getPath(); 

しかし、これは、ギャラリーやファイルから画像を選択するために動作しません。例えば、/external/images/media/38である。

だから私は使用して外部から始まるようなパスに変換するために、チェックを入れて:

if (path.startsWith("/external")) { 
    path = getFilePathFromUri(imageData.getData()); 
} 

private String getFilePathFromUri(Uri uri) { 
    Cursor cursor = managedQuery(uri, 
           new String[] { MediaStore.Images.Media.DATA }, 
           null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 

    return cursor.getString(column_index); 
} 

これは/mnt/sdcard/dcim/Camera/2011-11-13_15-33-24_304.jpgに上記のパスに変換して、今、これはBitmapFactory.decodeFile(path)のために働くの。

私は、このようなチェック(/外部)をハードコードするのは良い考えではないことを理解していますが、インテントで返されるURIのフォーマットを解決するために、

+0

意向画像データを、 – Tanager4

答えて

8

私は、このようなチェック(/外部)をハードコーディングするのは良い考えではないことを理解していますが、インテントで返されたURIのフォーマットを解決するために、

imageData.getData()は、Uriを返します。パスがfile://(これはほとんどのファイルマネージャが返すものです)で始まる場合、uriはファイルを表します。もう1つのオプションは、uriがコンテンツアイテム(これはGalleryが返すもの)を表します。この場合、パスはcontent://で始まり、ContentProviderを実際のイメージファイルパス(サンプル内と同じ)に呼び出す必要があります。だから私は、あなたがこのような何かを行くことができると思う:

Uri uri = imageData.getData(); 
String scheme = uri.getScheme(); 
if ("file".equals(scheme)) { 
    // process as a uri that points to a file 
} else if ("content".equals(scheme)) { 
    // process as a uri that points to a content item 
} 
0

あなたがウリからあなたのビットマップを作成するために、メディアストアを依頼することができます=意図

Bitmap bmp = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), uri); 
関連する問題