Как программно скопировать файл изображения из галереи в другую папку в Android - PullRequest
19 голосов
/ 29 декабря 2011

Я хочу выбрать изображение из галереи и скопировать его в другую папку на 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 на ActiveResult.

Я хочу скопировать изображение,

Форма path ="content://media/external/images/media/681

К path = "file:///mnt/sdcard/sharedresources/ этот путь SDCard в Android.

Как это сделать?

Ответы [ 5 ]

34 голосов
/ 30 декабря 2011

Спасибо всем ... Рабочий код здесь ..

     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);
    }
13 голосов
/ 29 декабря 2011
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();

Надеюсь, это поможет вам

4 голосов
/ 29 декабря 2011

одно решение может быть,

1) чтение байтов из inputStream выбранного файла.

я получаю «content: // media / external / images / media / 681» по этому URI onActivityResult. Вы можете получить имя файла, запросив этот Uri у вас. получить inputStream этого. прочитайте это в байт [].

вот, пожалуйста, /

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

Курсор курсора = contentResolver.query (и, ноль, ноль, ноль, ноль); есть имя столбца "_data", которое вернет вам имя файла, из имени файла вы можете создать inputtream,

теперь вы можете читать этот поток ввода

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

Итак, у вас есть данные (байтовый массив) с байтами изображений

2) создайте файл на SDCard и запишите с помощью байта [], сделанного на первом шаге.

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

как имя файла, которое вы уже используете в методе запроса, используйте то же самое здесь.

0 голосов
/ 20 ноября 2016

Несмотря на то, что я проголосовал за ответ @Ankit, я позаимствовал и продолжил модифицировать некоторые пункты.Он упоминает использовать 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();
        }

    }
}
0 голосов
/ 13 июля 2015

Читал эту ссылку , здесь речь идет о четырех способах копирования файлов на Java, что также актуально для Android.

Хотя автор приходит к выводу, что использование «канала» в ответе @ Prashant - лучший способ, вы можете даже изучить другие способы.

(я пробовал первые два, и оба они работаютнайти)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...