2

次のように、カメラが写真を撮るためのインテントを起動しています。

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Uri myPhoto = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
    "the_photo.jpg"));

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, myPhoto);
startActivityForResult(cameraIntent, INTENT_GET_PICTURE_FROM_CAMERA);

次に、この写真のサムネイルを表示したいと思います。「myPhoto」Uriを保存すると、ファイルシステム上でファイルを正確に確認できます。ただし、Media Store APIを使用するには、ContentUriフォームにUriが必要です。カメラが返す意図からこれを取得する方法はありますか?そうでない場合は、ファイルシステムのURIをAndroidコンテンツのURIに変換するにはどうすればよいですか?

注:ビットマップを取得してデコードし、ダウンサンプリングするだけでよいことはわかっています。これは私が望むものではありません。すべてのサムネイルを照会でき、それが存在することがわかったので、システムから取得したいと思います。

ありがとう

4

2 に答える 2

2

アイテムに対してメディアスキャンを実行することで解決しました。そこからコンテンツUriを取得できます(以下のコードのハンドラーの余分な複雑さは、ビューを操作するときにUIスレッドで結果を処理する必要があるためです):

private Uri mCameraFilePath;
private Context mContext;
...

private void handlePictureFromCamera(Intent data) {

    MyMediaScannerClient client = new MyMediaScannerClient(
            mCameraFilePath.getPath(), new Handler(), new OnMediaScanned() {

        @Override
        public void mediaScanned(Uri contentUri) {
            //Here I have the content uri as its now in the media store
        }
    });
    MediaScannerConnection connection = new MediaScannerConnection(mContext, client);
    client.mConnection = connection;
    connection.connect();
}

private interface OnMediaScanned {
    public void mediaScanned(Uri contentUri);
}

/**
 * This is used to scan a given file (image in this case) to ensure it is added
 * to the media store thus making its content uri available. It returns the
 * content form Uri by means of a callback on the supplied handler's thread.
 */
private class MyMediaScannerClient implements MediaScannerConnectionClient {

    private final String mPath;
    private MediaScannerConnection mConnection;
    private final OnMediaScanned mFileScannedCallback;
    private final Handler mHandler;

    public MyMediaScannerClient(String path, Handler handler, OnMediaScanned fileScannedCallback) {
        mPath = path;
        mFileScannedCallback = fileScannedCallback;
        mHandler = handler;
    }

    @Override
    public void onMediaScannerConnected() {
        mConnection.scanFile(mPath, null);
    }

    @Override
    public void onScanCompleted(String path, final Uri uri) {

        mConnection.disconnect();
        mHandler.post(new Runnable() {

            @Override
            public void run() {
                mFileScannedCallback.mediaScanned(uri);
            }
        });
    }
}
于 2012-04-11T09:01:39.413 に答える
0

私がコメントしたように、私は( "content:// media / external / images / xxx" uri形式を取得するために)似たようなものが必要でした、そしてあなたの解決策はかなりうまくいきました。ありがとうございます!しかし、私はそれを行うためのより短い方法を見つけました(多分それはあなたのためにうまくいかないかもしれませんが、他の誰かのために)。

あなた(最初の投稿)と同じインテント定式化を使用しますが、「CAMERA_REQUEST」を使用します

onActivityResult内

    getContentResolver().notifyChange(mCapturedImageURI, null);
    ContentResolver cr = getContentResolver();
    Uri uriContent = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null));

「uriContent」を「content:// media / external / images/xxx」形式で取得します。

于 2012-12-03T13:05:09.573 に答える