【问题标题】:Android- How to get the uri of a photo takenAndroid-如何获取所拍照片的uri
【发布时间】:2017-04-18 17:57:07
【问题描述】:

我正在尝试获取用手机拍摄的照片的 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.
    }

}

更新活动结果

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

【问题讨论】:

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


    【解决方案1】:

    从图像中获取 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); 
    }
    

    希望这能解决您的问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你好 greenapps。我正在查找这个并遇到了 putExtra EXTRA_OUTPUT。我相信这只是将照片的 Uri 添加到发送到 onActivityResult 的意图中,这将解决问题。但是,我不知道如何使用 putExtra 添加 Uri,您介意展示一下如何操作吗?
      • 只是谷歌的例子。这个网站上有数百个。不,uri 不能用作 onActivity 结果的参数。您应该“记住”使用过的 uri。
      • 我有,但我仍在努力使这些示例适应我的代码。我不需要实际文件来将 Uri 添加到 Intent 中吗?
      • 没有。您只需要文件的完整文件路径。该文件不必存在。在许多示例中,您可以看到他们在调用意图之前创建了一个空文件,但这不是必需的,而且是错误的。
      • 但我确实需要刚刚拍摄的照片文件的 Uri,以便将其添加到意图中?当文件不存在时,我看不到如何添加文件的 Uri。
      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 2012-12-18
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多