wake-up-neo.com

So kopieren Sie eine Bilddatei in Android programmgesteuert aus der Galerie in einen anderen Ordner

ich möchte ein Bild aus der Galerie auswählen und in einen anderen Ordner in der SD-Karte kopieren.

Code zum Auswählen eines Bildes aus der Galerie

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

ich bekomme content://media/external/images/media/681 diesen URI onActivityResult.

Ich möchte das Bild kopieren,

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

path = "file:///mnt/sdcard/sharedresources/ diesen Pfad der SD-Karte in Android.

wie macht man das?

19
Prashant Kadam
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();

Hoffe es wird dir helfen

13
Richa

Vielen Dank an alle ... Working Code ist hier .. 

     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);
    }
34
Prashant Kadam

eine Lösung kann sein,

1) Lesen von Bytes aus inputStream der ausgewählten Datei.

ich bekomme "content: // media/external/images/media/681" diese URI onActivityResult. Sie können den Dateinamen erhalten, indem Sie diese Uri abfragen. InputStream davon bekommen. Lesen Sie es in Byte [].

bitte schön/

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

Cursor Cursor = contentResolver.query (u, null, null, null, null); Es gibt einen Spaltennamen "_data", der Ihnen den Dateinamen zurückgibt.

sie können diesen Eingabestrom jetzt lesen 

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

Sie haben also Daten (Byte-Array) mit Images-Byte

2) Erstellen Sie eine Datei auf die SD-Karte und schreiben Sie mit dem in Schritt 1 aufgenommenen Byte [].

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

als Dateiname, den Sie bereits von der Abfragemethode haben, verwenden Sie diesen hier.

4
AAnkit

Auch wenn ich die Antwort von @AAnkit bestätigt habe, habe ich mir geliehen und einige Änderungen vorgenommen. Er erwähnt die Verwendung von Cursor, aber ohne richtige Darstellung kann dies für Neulinge verwirrend sein. 

Ich denke, das ist einfacher als die am meisten gewählte Antwort.

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
Kennedy Nyaga

Lesen Sie diesen Link , hier handelt es sich um vier Möglichkeiten, Dateien in Java zu kopieren, so relevant für Android. 

Obwohl der Autor zu dem Schluss kommt, dass die Verwendung von 'channel', wie in @ Prashants Antwort verwendet, der beste Weg ist, können Sie sogar andere Wege erkunden.

(Ich habe die ersten beiden ausprobiert und beide arbeiten finden)

0
Darpan