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,我需要 Content Uri 表单上的 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));

并以 'content://media/external/images/xxx' 格式获取 'uriContent'。

于 2012-12-03T13:05:09.573 回答