0

我正在尝试获取用手机拍摄的照片的 URI。我正在尝试将传递给“onActivityResult”的数据转换为 URI,然后将此 URI 转换为字符串以存储在我的数据库中。这种方法确实适用于视频,那么如何用照片来实现呢?尝试将数据转换为 URI 时出现空指针异常。我应该使用不同的函数将照片数据转换为 URI 吗?我的代码如下:

按钮意图启动录像机:

recordVideoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent startVideoFunction = new Intent();
            startVideoFunction.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
            startActivityForResult(startVideoFunction, REQUEST_CODE_VIDEO);
        }
    });

按钮意图开始照片捕捉:

takePhotosButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent startPhotoFunction = new Intent();
            startPhotoFunction.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(startPhotoFunction, REQUEST_CODE_PHOTO);
        }
    });

onActivityResult 方法:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        switch (requestCode) {
            case REQUEST_CODE_VIDEO:

                videoUri = data.getData();

                String videoPath = videoUri.toString();
                videoDB.addVideoRow(videoPath);

                //displayVideo.setVideoURI(videoUri);
                //displayVideo.start();
                break;

        case  REQUEST_CODE_PHOTO:

            photoUri = data.getData();

            String photoPath = photoUri.toString();
            videoDB.addPhotoRow(photoPath);
            break;
        }
    }catch (NullPointerException e){
    //prevent crash when returning with Null data to mainactivity.
    }

}

更新 onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
 data) {
   // try {
        switch (requestCode) {
            case REQUEST_CODE_VIDEO:

                videoUri = data.getData();

                String videoPath = videoUri.toString();
                videoDB.addVideoRow(videoPath);

                //displayVideo.setVideoURI(videoUri);
                //displayVideo.start();
                break;

        case  REQUEST_CODE_PHOTO:

            Bitmap photo = (Bitmap) data.getExtras().get("data");
            Uri tempUri = getImageUri(getApplicationContext(), photo);

            File finalFile = new File(getRealPathFromURI(tempUri));

            String photoPath = finalFile.toString();


            videoDB.addPhotoRow(photoPath);

            break;
        }
    //}catch (NullPointerException e){
    //prevent crash when returning with Null data to mainactivity.
    //}

}


public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}
4

2 回答 2

0

从图像中获取 Uri:使用下面提到的代码将位图转换为 Uri。您始终可以将位图压缩格式更改为 PNG,但随后避免使用 .compress 行,因为它没有用。PNG不会被压缩。

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); // Used for compression rate of the Image : 100 means no compression
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "xyz", null);
    return Uri.parse(path);
}

要从 Uri 获取绝对路径,请使用此方法

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int id_uri = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(id_uri); 
}

希望这能解决您的问题。

于 2017-04-18T18:04:27.113 回答
0

你走错路了。现在您将只保存所拍摄图像的缩略图并将其保存到文件中。虽然原始完整图像已经在文件系统上的文件中。

告诉相机应用程序将要拍摄的图像存储在哪里。对 EXTRA_OUTPUT 使用 putExtra。

于 2017-04-18T19:06:42.577 回答