相关文章推荐
道上混的上铺  ·  Qt中void ...·  5 月前    · 
强悍的苹果  ·  sequential quadratic ...·  1 年前    · 

如何在安卓系统中以编程方式将图片文件从图库复制到另一个文件夹?

22 人关注

我想从图片库中挑选图片并将其复制到SDCard的其他文件夹中。

从图库中挑选图片的代码

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_PICTURE_FROM_GALLARY);

我得到content://media/external/images/media/681这个URI onActivityResult。

我想复制该图像。

Form path ="content://media/external/images/media/681

path = "file:///mnt/sdcard/sharedresources/Android中SD卡的这个路径。

How to do this?

android
android-intent
android-gallery
android-contentprovider
android-file
Prashant Kadam
Prashant Kadam
发布于 2011-12-29
5 个回答
Prashant Kadam
Prashant Kadam
发布于 2016-11-20
已采纳
0 人赞同

谢谢大家...工作代码在这里...

     private OnClickListener photoAlbumListener = new OnClickListener(){
          @Override
          public void onClick(View arg0) {
            Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
            imagepath = Environment.getExternalStorageDirectory()+"/sharedresources/"+HelperFunctions.getDateTimeForFileName()+".png";
            uriImagePath = Uri.fromFile(new File(imagepath));
            photoPickerIntent.setType("image/*");
            photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT,uriImagePath);
            photoPickerIntent.putExtra("outputFormat",Bitmap.CompressFormat.PNG.name());
            photoPickerIntent.putExtra("return-data", true);
            startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_PICTURE_FROM_GALLARY);
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           if (resultCode == RESULT_OK) {
                switch(requestCode){
                 case 22:
                        Log.d("onActivityResult","uriImagePath Gallary :"+data.getData().toString());
                        Intent intentGallary = new Intent(mContext, ShareInfoActivity.class);
                        intentGallary.putExtra(IMAGE_DATA, uriImagePath);
                        intentGallary.putExtra(TYPE, "photo");
                        File f = new File(imagepath);
                        if (!f.exists())
                            try {
                                f.createNewFile();
                                copyFile(new File(getRealPathFromURI(data.getData())), f);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        startActivity(intentGallary);
                        finish();
                 break;
   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();
    private String getRealPathFromURI(Uri contentUri) {
       String[] proj = { MediaStore.Video.Media.DATA };
       Cursor cursor = managedQuery(contentUri, proj, null, null, null);
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       cursor.moveToFirst();
       return cursor.getString(column_index);
    
什么是Shareinfoactivity?
你好,你能发表一下上述代码中HelperFunctions.getDateTimeForFileName()的意义是什么?
Richa
Richa
发布于 2016-11-20
0 人赞同
OutputStream out;
            String root = Environment.getExternalStorageDirectory().getAbsolutePath()+"/";
            File createDir = new File(root+"Folder Name"+File.separator);
            if(!createDir.exists()) {
                createDir.mkdir();
            File file = new File(root + "Folder Name" + File.separator +"Name of File");
            file.createNewFile();
            out = new FileOutputStream(file);                       
        out.write(data);
        out.close();

Hope it will help u

out.write(data); 什么是 "数据"?
data将是图像的字节[],你必须从图像中转换。
这是推荐的方式还是最好的方式?
AAnkit
AAnkit
发布于 2016-11-20
0 人赞同

一个解决方案可以是。

1) 从所选文件的inputStream中读取字节。

我得到 "content://media/external/images/media/681 "这个URI onActivityResult。 你可以通过查询你得到的这个URI来获得文件名。

here you go/

Uri u = Uri.Parse("content://media/external/images/media/681")。

Cursor cursor = contentResolver.query(u, null, null, null, null); 有一个名为"_data "的列,它将返回你的文件名,从文件名你可以创建输入流。

你现在可以读取这个输入流

         byte data=new byte[fis.available()];
          fis.read(data);

所以你有数据(字节数组)和图像的字节

2) 在SD卡上创建一个文件,用第一步中的byte[]写入。

       File file=new File(fileOnSD.getAbsolutePath() +"your foldername", fileName);
        FileOutputStream fout=new FileOutputStream(file, false);
        fout.write(data);

如同你已经从查询方法中得到的fileName,在这里使用同样的方法。

URi.Parse是非常有用的。所以你可以直接把URi保存为一个字符串,然后在你需要的时候把它解析成URi。
Darpan
Darpan
发布于 2016-11-20
0 人赞同

正在阅读 this link 在这里,他们谈到了在Java中复制文件的四种方法。 所以对安卓也有意义。

虽然作者总结说使用@Prashant的答案中的 "渠道 "是最好的方法,但你甚至可以探索其他方法。

(我已经试过前两个,都能找到。)

Kennedy Nyaga
Kennedy Nyaga
发布于 2016-11-20
0 人赞同

尽管我对@AAnkit的答案投了赞成票,但我还是借用并继续修改了一些项目。他提到要使用 Cursor ,但如果没有适当的说明,就会让新手感到困惑。

我认为这比投票最多的答案更简单。

String mCurrentPhotoPath = "";
private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
                   /*Then I proceed to select from gallery and when its done selecting it calls back the onActivityResult where I do some magic*/
private void snapOrSelectPicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(Intent.createChooser(takePictureIntent, "SELECT FILE"), 1001);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        try {
            /*data.getDataString() contains your path="content://media/external/images/media/681 */
            Uri u = Uri.parse(data.getDataString());
            Cursor cursor = getContentResolver().query(u, null, null, null, null);
            cursor.moveToFirst();
            File doc = new File(cursor.getString(cursor.getColumnIndex("_data")));
            File dnote = new File(mCurrentPhotoPath);
            FileOutputStream fout = new FileOutputStream(dnote, false);
            fout.write(Files.toByteArray(doc));
        } catch (Exception e) {
            e.printStackTrace();