1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ContentProvider => Drawable in Device-Gallery speichern

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von padde83, 22.07.2010.

  1. padde83, 22.07.2010 #1
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    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 = (ImageViewswitcher.getCurrentView();
                
    Bitmap bmp = ((BitmapDrawableimage.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: 22.07.2010
  2. padde83, 22.07.2010 #2
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Folgender Weg funktioniert leider auch nicht.
    :mad:
    PHP:
    ImageView image = (ImageViewswitcher.getCurrentView();
                
    Bitmap bmp = ((BitmapDrawableimage.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_URIvalues);
                    
    OutputStream os getContentResolver().openOutputStream(uri);
                    
    bmp.compress(Bitmap.CompressFormat.JPEG100os);
                    
    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
     
  3. Zonnex, 23.07.2010 #3
    Zonnex

    Zonnex Fortgeschrittenes Mitglied

    Beiträge:
    431
    Erhaltene Danke:
    49
    Registriert seit:
    12.09.2009
    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: 23.07.2010
    padde83 bedankt sich.
  4. padde83, 23.07.2010 #4
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Danke Zonnex für die Antwort.

    Werde mich gleich mal damit beschäftigen. :D

    Gruß
    padde83
     
  5. padde83, 26.07.2010 #5
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    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.JPEGqualityos);
                }
                else if (
    type.equals(COMPRESS_FORMAT_PNG))
                {
                    
    bmp.compress(Bitmap.CompressFormat.PNGqualityos);
                }
                
    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
     
  6. Zonnex, 26.07.2010 #6
    Zonnex

    Zonnex Fortgeschrittenes Mitglied

    Beiträge:
    431
    Erhaltene Danke:
    49
    Registriert seit:
    12.09.2009
    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
     
  7. padde83, 26.07.2010 #7
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    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
     

Diese Seite empfehlen