将图片从图库存储到其他文件夹

时间:2016-04-07 06:05:49

标签: android file android-gallery

到目前为止,我所取得的成就是我可以将从相机点击的图像存储到新文件夹

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        f = new File(Utils.getPath(), new Date().getTime() + ".jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        startActivityForResult(intent, TAKE_PHOTO);

但我不知道如何将从图库中选择的图像存储到我创建的同一文件夹中。请帮我。 提前谢谢。

2 个答案:

答案 0 :(得分:4)

首先,从画廊获得的URI获取真实路径。

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    startManagingCursor(cursor);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

现在将图像复制到另一个位置,

 private void copyFile(File sourceFile, File destFile) throws IOException {
            if (!sourceFile.exists()) {
                return;
            }

            FileChannel source = null;
                FileChannel destination = null;
                source = new FileInputStream(sourceFile).getChannel();
                destination = new FileOutputStream(destFile).getChannel();
                if (destination != null && source != null) {
                    destination.transferFrom(source, 0, source.size());
                }
                if (source != null) {
                    source.close();
                }
                if (destination != null) {
                    destination.close();
                }  
    }



  File destFile = new File("Dest path");

  copyFile(new File(getPath(data.getData())), destFile);

查看网址了解更多详情,

  1. How to Copy Image File from Gallery to another folder programmatically in Android

  2. Android copy image from gallery folder onto SD Card alternative folder

答案 1 :(得分:0)

上述解决方案对我有用,但稍作修改:

相机点击的图像由ACTION_IMAGE_CAPTURE意图保存。然而,为了从我们自己的应用程序的库中选择图像,我们需要保存来自ACTION_PICK意图的图像。在这种情况下保存基本上是在将图像显示在ImageView中之后将图像从图库复制到您自己的应用程序文件夹。

首先,您需要拥有目标文件:因此,请调用以下方法获取您的应用目录,该目录位于Android>数据>您的APP文件夹>文件>图片:

private File mPhotoFile;
mPhotoFile=PhotoLab.get(getActivity()).getPhotoFile(mPhoto);

这是getPhotoFile()函数

public File getPhotoFile(Photo photo){
    File externalFilesDir=mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);//getExternalStorageDirectory().toString());

    if(externalFilesDir==null){
        return null;
    }
    return  new File(externalFilesDir, photo.getPhotoFilename());
}

现在您有了要保存Image Intent选取的图像的文件。现在调用ACTION_PICK意图。

private static final int PICK_IMAGE_REQUEST=2;
Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  //Trying intent to pick image from gallery
                    pickIntent.setType("image/*");
                    Uri uriImagePath = Uri.fromFile(mPhotoFile);
                    pickIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriImagePath);
                    startActivityForResult(pickIntent, PICK_IMAGE_REQUEST);

在onActivityResult中收到结果后面是我的代码:

   if(requestCode==PICK_IMAGE_REQUEST){
        Picasso.with(getActivity()).load(data.getData()).fit().into(mPhotoView);
        File file=getBitmapFile(data);


        try {
           copyFile(file, mPhotoFile);
        }catch(IOException e){
          Toast.makeText(getActivity(),"Cannot use Gallery, Try Camera!",Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }

获取数据后,我将其传递给下一个方法,以通过Intent.ACTION_PICK查找所选图像的绝对路径。以下是方法定义:

public File getBitmapFile(Intent data){
    Uri selectedImage=data.getData();
    Cursor cursor=getContext().getContentResolver().query(selectedImage, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
    cursor.moveToFirst();

    int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    String selectedImagePath=cursor.getString(idx);
    cursor.close();

    return new File(selectedImagePath);

}

获取所选图像的绝对路径后。我调用了copyFile()函数。具体如下。请记住,我已经生成了新的文件路径。

public File getBitmapFile(Intent data){
    Uri selectedImage=data.getData();
    Cursor cursor=getContext().getContentResolver().query(selectedImage, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
    cursor.moveToFirst();

    int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    String selectedImagePath=cursor.getString(idx);
    cursor.close();

    return new File(selectedImagePath);

}

我的目的地是mPhotoFile。我们先生成了。 如果您想从图库中选择图像并将其存储在每次打开时在应用程序的imageView中进一步显示,则整个代码都可以使用。