2016-04-07 15 views
1

Bisher, was ich erreicht habe, ist, dass ich Bild von der Kamera in einen neuen Ordner geklickt speichern kannShop ein Bild aus der Galerie in einem anderen Ordner

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     f = new File(Utils.getPath(), new Date().getTime() + ".jpg"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
     startActivityForResult(intent, TAKE_PHOTO); 

Aber ich weiß nicht, wie ein Bild aus der Galerie ausgewählt speichern in den gleichen Ordner, den ich erstellt habe. Bitte hilf mir. Vielen Dank im Voraus.

+3

Sie erstellen Ordner Ihres Projektnamens und Sie kopieren das Capture-Bild einfach in Ihren Projektnamenordner ???? Willst du zuerst klarstellen .. –

+0

Dieses Thema kann Ihnen helfen: http://stackoverflow.com/questions/11846108/android-saving-bitmap-to-sd-card –

+0

Die Utils.getPath() gibt den Speicherort, wo ich einen neuen Ordner zum Speichern erstellen möchte das Bild. Ruhe wird durch Absicht behandelt. Aber MediaStore.EXTRA_OUTPUT funktioniert nicht, wenn Sie ein Bild aus der Galerie auswählen. Wie kann ich das aus der Galerie ausgewählte Bild in einem anderen Ordner speichern? – AmeyaG

Antwort

4

Zuerst erhalten Sie einen echten Pfad von der URI, die Sie von der Galerie erhalten haben.

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    startManagingCursor(cursor); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

jetzt kopieren Bild an einen anderen Ort,

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



    File destFile = new File("Dest path"); 

    copyFile(new File(getPath(data.getData())), destFile); 

Check-out Urls, um weitere Informationen,

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

  2. Android copy image from gallery folder onto SD Card alternative folder

+0

Das funktioniert perfekt – AmeyaG

0

Die Lösung oben für mich funktioniert, aber mit geringfügigen Änderungen:

Das Bild von der Kamera angeklickt wird durch die ACTION_IMAGE_CAPTURE Absicht gespeichert. Während wir ein Bild aus der Galerie für unsere eigene App auswählen müssen, müssen wir das Image speichern, das von ACTION_PICK stammt. Speichern in diesem Fall ist im Grunde kopieren Bild aus der Galerie in Ihren eigenen App-Ordner nach dem Anzeigen in Ihrem ImageView.

Zuerst müssen Sie die Zieldatei haben: So die folgende Methode rufen Sie das Verzeichnis Ihrer App zu erhalten, die in Android ist> Daten> IHRE APP-Ordner> Dateien> Bilder:

private File mPhotoFile; 
mPhotoFile=PhotoLab.get(getActivity()).getPhotoFile(mPhoto); 

Hier ist die getPhotoFile() Funktion

public File getPhotoFile(Photo photo){ 
    File externalFilesDir=mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);//getExternalStorageDirectory().toString()); 

    if(externalFilesDir==null){ 
     return null; 
    } 
    return new File(externalFilesDir, photo.getPhotoFilename()); 
} 

Jetzt haben Sie die Datei, in der Sie das Bild durch Bild Intent gepflückt speichern möchten. Rufen Sie jetzt die ACTION_PICK-Absicht auf.

private static final int PICK_IMAGE_REQUEST=2; 
Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); //Trying intent to pick image from gallery 
        pickIntent.setType("image/*"); 
        Uri uriImagePath = Uri.fromFile(mPhotoFile); 
        pickIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriImagePath); 
        startActivityForResult(pickIntent, PICK_IMAGE_REQUEST); 

Nachdem das Ergebnis in onActivityResult Empfang meinen Code Es folgt:

if(requestCode==PICK_IMAGE_REQUEST){ 
     Picasso.with(getActivity()).load(data.getData()).fit().into(mPhotoView); 
     File file=getBitmapFile(data); 


     try { 
      copyFile(file, mPhotoFile); 
     }catch(IOException e){ 
      Toast.makeText(getActivity(),"Cannot use Gallery, Try Camera!",Toast.LENGTH_SHORT).show(); 
      e.printStackTrace(); 
     } 
    } 

Nach Abrufen der Daten, ich ging sie auf die nächste Methode Intent.ACTION_PICK den absoluten Pfad des aufgenommenen Bildes zu finden . Es folgt die Definition der Methode:

public File getBitmapFile(Intent data){ 
    Uri selectedImage=data.getData(); 
    Cursor cursor=getContext().getContentResolver().query(selectedImage, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null); 
    cursor.moveToFirst(); 

    int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    String selectedImagePath=cursor.getString(idx); 
    cursor.close(); 

    return new File(selectedImagePath); 

} 

Nach dem Abrufen des absoluten Pfads des ausgewählten Bildes. Ich habe die Funktion copyFile() aufgerufen. Was ist wie folgt. Denken Sie daran, dass ich bereits meinen neuen Dateipfad erstellt habe.

public File getBitmapFile(Intent data){ 
    Uri selectedImage=data.getData(); 
    Cursor cursor=getContext().getContentResolver().query(selectedImage, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null); 
    cursor.moveToFirst(); 

    int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    String selectedImagePath=cursor.getString(idx); 
    cursor.close(); 

    return new File(selectedImagePath); 

} 

Das Ziel für mich war mPhotoFile. Das haben wir zuerst generiert. Dieser gesamte Code funktioniert, wenn Sie ein Bild aus der Galerie auswählen und es speichern möchten, um es bei jedem Öffnen im imageView Ihrer App anzuzeigen.

Verwandte Themen