ContentProvider => Drawable in Device-Gallery speichern

P

padde83

Ambitioniertes Mitglied
0
Hallo Zusammen,

wie im Titel schon beschrieben will ich ein Bild bzw. Drawable in der Standard Galerie von Android speichern.
Das Bild bekomme ich von einem Server aus dem Netz geliefert. Die Anzeige auf dem Gerät funktioniert einwandfrei.

Nun stehe ich vor dem Problem: Wie bekomme ich dieses Bild, am elegantesten in die Bildergalerie?

Der erste Anlaufpunkt sollte ja der ContentProvider der Galerie sein.
Dessen URI (nehm ich an)
-> android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI :confused:
Die weiteren Punkte habe ich trotz Recherche im Internet nicht zusammen bekommen.:mad:

Auf dem direkten Weg scheint es halbewegs zu funktionieren:
PHP:
ImageView image = (ImageView) switcher.getCurrentView();
            Bitmap bmp = ((BitmapDrawable) image.getDrawable()).getBitmap();
            MediaStore.Images.Media.insertImage(getContentResolver(), bmp, "test", "hallo Bild");
Aber so wie es aussieht speichert er das Bild auf den externen Speicher. (Im Emulator die virtuelle SD-Card).
Diese Möglichkeit bietet außerdem keine Überprüfung ob die Datei schon vorhanden ist, oder in welchen Ordner die Bilder abgelegt werden.

Der Returnwert der aufgerufenen Funktion(insertImage) ist der Speicherort des Bildes

content://media/external/images/media/1

Gibt es dafür eine elegantere Lösung?

Danke für die Hilfe & Gruß
padde83 :)
 
Zuletzt bearbeitet:
Folgender Weg funktioniert leider auch nicht.
:mad:
PHP:
ImageView image = (ImageView) switcher.getCurrentView();
            Bitmap bmp = ((BitmapDrawable) image.getDrawable()).getBitmap();

            ContentValues values = new ContentValues(3);
            values.put(MediaStore.Images.Media.DISPLAY_NAME, "hallo");
            values.put(MediaStore.Images.Media.DESCRIPTION, "Fotos from server");
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

            try
            {
                Uri uri = getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
                OutputStream os = getContentResolver().openOutputStream(uri);
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, os);
                os.close();
            }
            catch (Exception e)
            {

                throw new RuntimeException(e.getMessage());
            }
Bekomme nur den Fehler:
java.lang.UnsupportedOperationException: Writing to internal storage is not supported.

Ok also nix mit Intern speichern!
Aber wo speichert zb. die Kamera ihre Bilder wenn keine SD-Card vorhanden ist????

Gruß
padde83
 
Naja die Galerie von Android ist nichts weiter als eine App die alle Bilder auf den Speicher zeigt...

Und um der App zu sagen das es neue Bilder gibt musst du wie folgt vorgehen:
1. Drawable als PNG/JPG in einen beliebigen Ordner speichern (z.B. /sdcard/MEINEAPP/BILD1.PNG)
(was du ja schon mit BITMAP.compress(); machst)

2. einen MediaScan-Vorgang starten
(zum Beispiel für FILPATH == "/sdcard/MEINEAPP/BILD1.PNG")
Code:
public void startMediaScan(final String FILEPATH) {
		MediaScannerConnection msc = new MediaScannerConnection(this, new MediaScannerConnection.MediaScannerConnectionClient() { 
            public void onMediaScannerConnected() 
            {
                msc.scanFile(FILEPATH, null); // null = jpg und png also egal was
            } 
            public void onScanCompleted(String path, Uri uri) 
            { 
                if (path.equals(FILEPATH)) 
                { 
                	msc.disconnect(); 
                } 
            } 
        });
        msc.connect();
	}

Mfg
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: padde83
Danke Zonnex für die Antwort.

Werde mich gleich mal damit beschäftigen. :D

Gruß
padde83
 
Servus zusammen,

nach einem erholsamen Wochenende habe ich mich nochmal drangesetzt und siehe da es funktioniert. :D
PHP:
File path = Environment.getExternalStorageDirectory();
        path.mkdir();
        File fFolder = new File(path + "/" + folder);
        if (!fFolder.exists())
        {
            fFolder.mkdir();
        }
        File file = new File(fFolder + "/" + name + "." + type);

        OutputStream os;
        try
        {
            os = new FileOutputStream(file);
            if (type.equals(COMPRESS_FORMAT_JPEG))
            {
                bmp.compress(Bitmap.CompressFormat.JPEG, quality, os);
            }
            else if (type.equals(COMPRESS_FORMAT_PNG))
            {
                bmp.compress(Bitmap.CompressFormat.PNG, quality, os);
            }
            os.close();
            startMediaScan(file.getAbsolutePath());
            return true;
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
    }
Nun hätte ich noch eine frage.
Wäre es noch möglich den MIME-TYPE zu setzten?
Bekomme vom Scanner zwar keinen Fehler aber einen Hinweis.
-> IMediaScannerService.scanFile: mimeType: null

Gruß
padde83
 
Natürlich kannst du den setzen, ich glaub das war:
msc.scanFile(FILEPATH, image/png);
oder halt image/jpeg je nachdem, evtl. in "", die genaue Formatierung hab ich grad nicht im Kopf.

MfG
 
Danke für die schnelle Antwort.

Irgendwie habe ich dann falsch gedacht. Ich will ja den MediaScanner nach allen Typen suchen lassen also ist null schon richtig.

Habe aber vermutet das ich beim anlegen der Datei, die Mime-Type angeben muss, ala ContentValues oder so und das sich darauf die Meldung des MediaScanners bezieht.

Von daher ist ja alles so wie es sein soll :D

Danke & Gruß
padde83
 

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
959
swa00
swa00
B
Antworten
6
Aufrufe
1.051
jogimuc
J
A
Antworten
10
Aufrufe
1.926
swa00
swa00
Zurück
Oben Unten