FileをUriに変換する方法

FileUriに変換するという事はあまりないかもしれませんが、例えばIntentsetDataする際にはUriが渡されます。

その場合、画像などのファイルを渡そうとすると一旦それをUriに変換しなくてはいけません。

ここではファイルをUriに変換する方法について紹介します。。

変換方法

ここではどんなファイルでもいいのですが、とりあえずBitmapを一時ファイルとして保存してそれをUriに変えてみたいと思います。

それを実現するのが次のメソッドです。

/** Bitmapを一時ファイルとして保存してUriを返す。 */
public Uri getUriFromBitmap(Bitmap bitmap)
{
    File tmpFile = new File(getExternalCacheDir(), 
            String.valueOf(System.currentTimeMillis()) + ".png");

    FileOutputStream fos = null;
    try {
        tmpFile.createNewFile();
        fos = new FileOutputStream(tmpFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
    
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    try {
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Images.Media.TITLE, tmpFile.getName()); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
       values.put(MediaStore.Images.Media.DATA, 
                tmpFile.getAbsolutePath());
    Uri uri = getContentResolver().insert( 
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
    return uri;
}

まず渡されたBitmapを適当な場所に画像ファイルとして保存して言います。

その後、ContentResolverを使ってそのファイルをデータベースに登録すればOKです。

使用例

では、このメソッドの使用例を最後に紹介します。

例えば次のような画像の切り抜きをする場面です。

Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
                
Intent intent = new Intent(
                    "com.android.camera.action.CROP");
intent.setData(getUriFromBitmap(bitmap));
intent.putExtra("outputX", 144); 
intent.putExtra("outputY", 144);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", false);
intent.putExtra("return-data", true);
startActivityForResult(intent, 12345);

getUriFromBitmapBitmapを渡すだけでUriが得られます。

少し荒業のような気もしますが、Intentを使わずに取得した画像などを切り抜きしたいといった場合などは大変役に立つと思います。

ここでは画像ファイルに限定して話をしましたが、どんなファイルでもUriに変換できると思います。では、また。

関連項目
プライバシーポリシー