wake-up-neo.com

android - Bild in Galerie speichern

ich habe eine App mit einer Galerie von Bildern und ich möchte, dass der Benutzer es in seiner eigenen Galerie speichern kann. Ich habe ein Optionsmenü mit einer einzigen Stimme "Speichern" erstellt, um dies zu ermöglichen, aber das Problem ist ... wie kann ich das Bild in der Galerie speichern?

das ist mein Code:

@Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle item selection
            switch (item.getItemId()) {
            case R.id.menuFinale:

                imgView.setDrawingCacheEnabled(true);
                Bitmap bitmap = imgView.getDrawingCache();
                File root = Environment.getExternalStorageDirectory();
                File file = new File(root.getAbsolutePath()+"/DCIM/Camera/img.jpg");
                try 
                {
                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(CompressFormat.JPEG, 100, ostream);
                    ostream.close();
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }



                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }

ich bin mir nicht sicher über diesen Teil des Codes:

File root = Environment.getExternalStorageDirectory();
                File file = new File(root.getAbsolutePath()+"/DCIM/Camera/img.jpg");

ist es richtig, in der Galerie zu speichern? leider funktioniert der code nicht :(

78
MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription);

Der vorherige Code fügt das Bild am Ende der Galerie hinzu. Wenn Sie das Datum so ändern möchten, dass es am Anfang oder an anderen Metadaten angezeigt wird, lesen Sie den folgenden Code (Cortesy von S-K, samkirton ):

https://Gist.github.com/samkirton/0242ba81d7ca00b475b9

/**
 * Android internals have been modified to store images in the media folder with 
 * the correct date meta data
 * @author samuelkirton
 */
public class CapturePhotoUtils {

    /**
     * A copy of the Android internals  insertImage method, this method populates the 
     * meta data with DATE_ADDED and DATE_TAKEN. This fixes a common problem where media 
     * that is inserted manually gets saved at the end of the gallery (because date is not populated).
     * @see Android.provider.MediaStore.Images.Media#insertImage(ContentResolver, Bitmap, String, String)
     */
    public static final String insertImage(ContentResolver cr, 
            Bitmap source, 
            String title, 
            String description) {

        ContentValues values = new ContentValues();
        values.put(Images.Media.TITLE, title);
        values.put(Images.Media.DISPLAY_NAME, title);
        values.put(Images.Media.DESCRIPTION, description);
        values.put(Images.Media.MIME_TYPE, "image/jpeg");
        // Add the date meta data to ensure the image is added at the front of the gallery
        values.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());

        Uri url = null;
        String stringUrl = null;    /* value to be returned */

        try {
            url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            if (source != null) {
                OutputStream imageOut = cr.openOutputStream(url);
                try {
                    source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
                } finally {
                    imageOut.close();
                }

                long id = ContentUris.parseId(url);
                // Wait until MINI_KIND thumbnail is generated.
                Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null);
                // This is for backward compatibility.
                storeThumbnail(cr, miniThumb, id, 50F, 50F,Images.Thumbnails.MICRO_KIND);
            } else {
                cr.delete(url, null, null);
                url = null;
            }
        } catch (Exception e) {
            if (url != null) {
                cr.delete(url, null, null);
                url = null;
            }
        }

        if (url != null) {
            stringUrl = url.toString();
        }

        return stringUrl;
    }

    /**
     * A copy of the Android internals StoreThumbnail method, it used with the insertImage to
     * populate the Android.provider.MediaStore.Images.Media#insertImage with all the correct
     * meta data. The StoreThumbnail method is private so it must be duplicated here.
     * @see Android.provider.MediaStore.Images.Media (StoreThumbnail private method)
     */
    private static final Bitmap storeThumbnail(
            ContentResolver cr,
            Bitmap source,
            long id,
            float width, 
            float height,
            int kind) {

        // create the matrix to scale it
        Matrix matrix = new Matrix();

        float scaleX = width / source.getWidth();
        float scaleY = height / source.getHeight();

        matrix.setScale(scaleX, scaleY);

        Bitmap thumb = Bitmap.createBitmap(source, 0, 0,
            source.getWidth(),
            source.getHeight(), matrix,
            true
        );

        ContentValues values = new ContentValues(4);
        values.put(Images.Thumbnails.KIND,kind);
        values.put(Images.Thumbnails.IMAGE_ID,(int)id);
        values.put(Images.Thumbnails.HEIGHT,thumb.getHeight());
        values.put(Images.Thumbnails.WIDTH,thumb.getWidth());

        Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);

        try {
            OutputStream thumbOut = cr.openOutputStream(url);
            thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
            thumbOut.close();
            return thumb;
        } catch (FileNotFoundException ex) {
            return null;
        } catch (IOException ex) {
            return null;
        }
    }
}
159
sfratini

Eigentlich können Sie Ihr Bild an jedem Ort speichern. Wenn Sie in einem öffentlichen Bereich speichern möchten, damit andere Anwendungen darauf zugreifen können, verwenden Sie diesen Code:

storageDir = new File(
    Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES
    ), 
    getAlbumName()
);

Das Bild geht nicht in das Album. Dazu müssen Sie einen Scan aufrufen:

private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

Weitere Informationen finden Sie unter https://developer.Android.com/training/camera/photobasics.html#TaskGallery

45
Sigrist

Ich habe viele Dinge ausprobiert, damit dies bei Marshmallow und Lollipop funktioniert. Schließlich habe ich das gespeicherte Bild in den DCIM-Ordner verschoben (neue Google Photo App scannt Bilder nur, wenn sie sich anscheinend in diesem Ordner befinden)

public static File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
         .format(System.currentTimeInMillis());
    File storageDir = new File(Environment
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera/");
    if (!storageDir.exists())
        storageDir.mkdirs();
    File image = File.createTempFile(
            timeStamp,                   /* prefix */
            ".jpeg",                     /* suffix */
            storageDir                   /* directory */
    );
    return image;
}

Und dann der Standardcode zum Scannen von Dateien, den Sie auch auf der Google Developers-Website finden .

public static void addPicToGallery(Context context, String photoPath) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(photoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    context.sendBroadcast(mediaScanIntent);
}

Bitte denken Sie daran, dass dieser Ordner nicht auf allen Geräten der Welt vorhanden sein kann und dass Sie ab Marshmallow (API 23) die Berechtigung WRITE_EXTERNAL_STORAGE beim Benutzer anfordern müssen.

18
MatPag

Laut dieser Kurs ist der richtige Weg, dies zu tun:

Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES
    )

Dies gibt Ihnen den Root-Pfad für das Galerie-Verzeichnis.

12
Cédric Julien
private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}
11
nitin Sol

Sie können ein Verzeichnis im Kameraordner erstellen und speichern. Und scannen Sie, sobald Sie fertig sind. Es wird sofort Ihr Bild in der Galerie anzeigen. Prost!!

            String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()+ "/Camera/Your_Directory_Name";
            File myDir = new File(root);
            myDir.mkdirs();
            String fname = "Image-" + image_name + ".png";
            File file = new File(myDir, fname);
            System.out.println(file.getAbsolutePath());
            if (file.exists()) file.delete();
            Log.i("LOAD", root + fname);
            try {
                FileOutputStream out = new FileOutputStream(file);
                finalBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            MediaScannerConnection.scanFile(context, new String[]{file.getPath()}, new String[]{"image/jpeg"}, null);
5
javatar

Ich komme mit dem gleichen Zweifel hierher, aber für Xamarin für Android habe ich die Sigrist-Antwort verwendet, um diese Methode nach dem Speichern meiner Datei auszuführen:

private void UpdateGallery()
{
    Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
    Java.IO.File file = new Java.IO.File(_path);
    Android.Net.Uri contentUri = Android.Net.Uri.FromFile(file);
    mediaScanIntent.SetData(contentUri);
    Application.Context.SendBroadcast(mediaScanIntent);
} 

und es hat mein Problem gelöst, Thx Sigrist. Ich habe es hierher gestellt, weil ich keine Antwort für Xamarin gefunden habe und ich hoffe, dass es anderen Menschen helfen kann.

1
Slaters

In meinem Fall haben die oben genannten Lösungen nicht funktioniert. Ich musste Folgendes tun:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(f)));
1
dc10
 String filePath="/storage/emulated/0/DCIM"+app_name;
    File dir=new File(filePath);
    if(!dir.exists()){
        dir.mkdir();
    }

Dieser Code befindet sich in der onCreate-Methode. Dieser Code dient zum Erstellen eines Verzeichnisses von app_name. Auf dieses Verzeichnis kann nun mit der Standard-Dateimanager-App in Android zugegriffen werden. Verwenden Sie diese Zeichenfolge filePath, wenn Sie Ihren Zielordner festlegen möchten. Ich bin sicher, dass diese Methode auch auf Android 7 funktioniert, da ich sie getestet habe. Daher kann sie auch auf anderen Versionen von Android funktionieren.

0
Bhavik Mehta