【问题标题】:Android Copy Image From Gallery Into New FileAndroid将图像从图库复制到新文件
【发布时间】:2016-12-16 10:24:03
【问题描述】:

我正在尝试为我的应用实现一项功能,该功能允许用户从图库中挑选一张图片以获取一些建议。在应用更改(滤镜、裁剪等)之前,我需要将此图片另存为新图片。

到目前为止,我做到了:

private void pickImageFromGallery(){
    /*Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, GALLERY_SELECT_PICTURE);*/

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, GALLERY_SELECT_PICTURE);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == RESULT_OK){
        if(requestCode == GALLERY_SELECT_PICTURE){
            if(data == null){
                //TODO SHOW ERROR
                return;
            }
            try {
                Bitmap temporaryBitmap = MediaStore.Images.Media.getBitmap(myContext.getContentResolver(), data.getData());

                //Tried using inputStream and got the same result
                //InputStream inputStream = myContext.getContentResolver().openInputStream(data.getData());
                //Bitmap temporaryBitmap = BitmapFactory.decodeStream(inputStream, null, options);

                //Just return a file to save the bitmap into (I use the same code in different activities and it works perfectly)
                capturedImage = FunctionUtil.getOutputMediaFile(ConstUtil.ids.MEDIA_TYPE_IMAGE);

                FileOutputStream outputStream = new FileOutputStream(capturedImage);;
                temporaryBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

                //Just refresh the gallery so my new picture becomes available (I use the same function in different activities and it works fine)
                FunctionUtil.refreshMediaGallery(capturedImage);

             //HERE I CHECK THE PATH/GALLERY AND NOTICE THE FILE ISN'T SAVED 

            } catch (Exception e) {
                e.printStackTrace();
                //TODO SHOW ERROR
            }

        }else if(requestCode == GALLERY_SELECT_VIDEO){

        }
    }
}

获取新文件的代码(FunctionUtil.getOutputMediaFile)、刷新图库的代码(FunctionUtil.refreshMediaGallery)和保存位图的代码(Bitmap.compress)在同一活动的不同部分工作正常,但使用画廊中的图片它只是不保存它们

当我使用相机 API 拍摄一张新照片然后解码为位图时,它可以完美运行,但当我从图库中选择图片并解码为位图时,它就无法正常工作。

【问题讨论】:

    标签: android bitmap android-gallery android-bitmap


    【解决方案1】:

    使用此代码

        if(requestCode == GALLERY_SELECT_PICTURE){
           InputStream inputStream = getContentResolver()
                .openInputStream(data.getData());
           FileOutputStream fileOutputStream = new FileOutputStream(
                                        outputFile);
           copyStream(inputStream, fileOutputStream);
           fileOutputStream.close();
           inputStream.close();
    }
    

    并使用以下方法

    public static void copyStream(InputStream input, OutputStream output)
                throws IOException {
    
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = input.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
        }
    

    或者你也可以使用com.google.api.client.util.IOUtils.copy(InputStream, OutputStream)

    【讨论】:

    • 这是迄今为止最好的答案和方法。解析和尝试操纵生成的 Uri 会让你发疯(并且不确定它是否完全正确)。 IOUtils 现已弃用,您可以使用 inputStream.copyTo(outputStream)
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多