Android-如何获取照片的照片

时间:2017-04-18 17:57:08

标签: android uri android-bitmap onactivityresult android-image-capture

我正在尝试使用手机拍摄照片的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);
}

2 个答案:

答案 0 :(得分:0)

从Image获取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获取Absolute Path,请使用此方法

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); 
}

希望这能解决你的问题。

答案 1 :(得分:0)

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

告诉相机应用程序,意图存储要拍摄的图像。使用putExtra for EXTRA_OUTPUT。