如何在Android中以编程方式将图像文件从图库复制到另一个文件夹

时间:2011-12-29 05:49:00

标签: android android-intent android-gallery android-contentprovider android-file

我想从Gallery中选择图像并将其复制到SDCard中的其他文件夹。

从图库中选择图片的代码

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

我在onActivityResult上获得content://media/external/images/media/681此URI。

我想复制图片,

表格path ="content://media/external/images/media/681

在Android中向path = "file:///mnt/sdcard/sharedresources/此SD卡路径发送。

怎么做?

5 个答案:

答案 0 :(得分:34)

感谢所有......工作代码就在这里..

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

答案 1 :(得分:13)

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

希望它能帮助你

答案 2 :(得分:4)

一个解决方案可以是,

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

  
    

我得到了“content:// media / external / images / media / 681”这个URI onActivityResult。     您可以通过查询这个Uri来获取文件名。获取它的inputStream。将其读入byte []。

  

这里你去/

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)在sdcard上创建一个文件,并在第一步中使用byte []进行写入。

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

作为查询方法中已有的fileName,请在此处使用。

答案 3 :(得分:0)

正在阅读this link,这里他们谈到了用Java复制文件的四种方法, 这对Android也很重要。

虽然作者得出结论,使用' channel'在@ Prashant的回答中使用的是最好的方式,你甚至可以探索其他方式。

(我已经尝过前两个,他们两个都找不到了)

答案 4 :(得分:0)

尽管我已经通过@AAnkit赞成了答案,但我借用并继续修改了一些项目。他提到使用<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <div data-bind="with: vm1"> <h4>vm1</h4> <p data-bind="text: myObs"></p> <button data-bind="click: setObs"> flip </button> </div> <div data-bind="with: vm2"> <h4>vm2</h4> <p data-bind="text: myObs"></p> <button data-bind="click: setObs"> flip </button> </div> <div data-bind="with: vm3"> <h4>vm3</h4> <p data-bind="text: myObs"></p> <button data-bind="click: setObs"> flip </button> </div>,但如果没有适当的说明,它可能会让新手感到困惑。

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

Cursor