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

前端 未结 5 1034
北荒
北荒 2020-12-08 08:50

I want to pick image from gallery and copy it in to other folder in SDCard.

Code to Pick Image from Gallery

Intent photoPickerIntent = new Intent(Int         


        
相关标签:
5条回答
  • 2020-12-08 08:56

    Thanks to all ... Working Code is Here..

         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);
        }
    
    0 讨论(0)
  • 2020-12-08 09:07

    Even though I have upvoted the answer by @AAnkit, I borrowed and went ahead to modify some items. He mentions to use Cursor but without proper illustration it can be confusing to newbies.

    I think this is simpler than the most voted answer.

    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();
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-08 09:08

    one solution can be,

    1) read bytes from inputStream of the picked file.

    i get "content://media/external/images/media/681" this URI onActivityResult. You can get the file name by querying this Uri u got. get inputStream of it. read it into byte[].

    here you go/

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

    Cursor cursor = contentResolver.query(u, null, null, null, null); there is a column name "_data" which will return you the filename, from filename you can create inputstream,

    you can now read this input stream

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

    So you have data(byte array) with images byte

    2) create a file on to sdcard, and write with byte[] taken in step one.

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

    as fileName you already have from the query method, use same here.

    0 讨论(0)
  • 2020-12-08 09:10

    Was reading this link, here they are talking about four ways to copy files in Java, so relevant for android as well.

    Though author concludes that using 'channel' as used in @Prashant's answer are the best way, you may even explore other ways.

    (I have tried first two, and both of them work find)

    0 讨论(0)
  • 2020-12-08 09:18
    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

    0 讨论(0)
提交回复
热议问题