Speichern und Lesen von Bitmaps / Bildern aus dem internen Speicher in Android


161

Ich möchte ein Bild im internen Speicher des Telefons speichern (nicht auf der SD-Karte) .

Wie kann ich es tun?

Ich habe das Bild direkt von der Kamera in die Bildansicht in meiner App bekommen, es funktioniert alles einwandfrei.

Jetzt möchte ich dieses Bild aus der Bildansicht im internen Speicher meines Android-Geräts speichern und bei Bedarf auch darauf zugreifen.

Kann mir bitte jemand zeigen, wie das geht?

Ich bin ein wenig neu in Android, also bitte, ich würde mich freuen, wenn ich ein detailliertes Verfahren haben kann.


Hallo, wo befindet /data/data/yourapp/app_data/imageDirsich genau? stackoverflow.com/questions/40323126/…
Khalil Khalaf

Antworten:


344

Verwenden Sie den folgenden Code, um das Bild im internen Verzeichnis zu speichern.

private String saveToInternalStorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
         // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"profile.jpg");

        FileOutputStream fos = null;
        try {           
            fos = new FileOutputStream(mypath);
       // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (Exception e) {
              e.printStackTrace();
        } finally {
            try {
              fos.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
        } 
        return directory.getAbsolutePath();
    }

Erklärung:

1.Das Verzeichnis wird mit dem angegebenen Namen erstellt. Javadocs soll angeben, wo genau das Verzeichnis erstellt wird.

2. Sie müssen den Bildnamen angeben, unter dem Sie ihn speichern möchten.

So lesen Sie die Datei aus dem internen Speicher. Verwenden Sie den folgenden Code

private void loadImageFromStorage(String path)
{

    try {
        File f=new File(path, "profile.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
            ImageView img=(ImageView)findViewById(R.id.imgPicker);
        img.setImageBitmap(b);
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }

}

Ich stelle fest, dass Sie bestimmte Kommentare abgegeben haben. Können Sie mich anleiten, was dies bedeutet? Wie der über den Weg? Muss ich einen Weg angeben oder so?
Usama Zafar

1
Wie kann ich aus dem Speicher auf mein Bild zugreifen?
Usama Zafar

Ich habe die Antwort bearbeitet. Zugriff auf das Bild aus dem Speicher. Wie stellen Sie das Bild auf Ihr Bild ein? Ich glaube, es ist nichts als Bitmap, dieselbe Instanz, die Sie an die Funktion übergeben können.
Brijesh Thakur

Warum nicht. Siehe die Funktion, es gibt den Dateipfad zurück. Hiermit können Sie es abrufen und der Bildansicht anzeigen. Ich habe den Code
eingegeben

4
Sie sollten den Stream wirklich aus einem finally-Block schließen, nicht aus dem try-Block heraus.
Kenn Cal

71
/**
 * Created by Ilya Gazman on 3/6/2016.
 */
public class ImageSaver {

    private String directoryName = "images";
    private String fileName = "image.png";
    private Context context;
    private boolean external;

    public ImageSaver(Context context) {
        this.context = context;
    }

    public ImageSaver setFileName(String fileName) {
        this.fileName = fileName;
        return this;
    }

    public ImageSaver setExternal(boolean external) {
        this.external = external;
        return this;
    }

    public ImageSaver setDirectoryName(String directoryName) {
        this.directoryName = directoryName;
        return this;
    }

    public void save(Bitmap bitmapImage) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(createFile());
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @NonNull
    private File createFile() {
        File directory;
        if(external){
            directory = getAlbumStorageDir(directoryName);
        }
        else {
            directory = context.getDir(directoryName, Context.MODE_PRIVATE);
        }
        if(!directory.exists() && !directory.mkdirs()){
            Log.e("ImageSaver","Error creating directory " + directory);
        }

        return new File(directory, fileName);
    }

    private File getAlbumStorageDir(String albumName) {
        return new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), albumName);
    }

    public static boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state);
    }

    public static boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
    }

    public Bitmap load() {
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(createFile());
            return BitmapFactory.decodeStream(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

Verwendung

  • Speichern:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
    
  • Laden:

    Bitmap bitmap = new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            load();
    

Bearbeiten:

Hinzugefügt ImageSaver.setExternal(boolean), um das Speichern in einem externen Speicher basierend auf dem Google-Beispiel zu unterstützen .


13
Hier ist eine weitere nützliche Methode, um in die Klasse zu setzen:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Micro

Wenn ich das gespeicherte Bild freigeben möchte, wird "Verzeichnis nicht erstellt" zurückgegeben und das Bild stürzt ab. können Sie mir helfen?
A. N

Können Sie eine Erklärung zu der Lizenz hinzufügen, unter der dieser Code verfügbar ist, um die Aufnahme in ein Projekt zu ermöglichen?
Don Park

2
@ DonPark Keine Notwendigkeit, jeder Code auf Stackoverflowis ist unter Stackoverflow-Lizenz, Sie können dies ohne Sorgen verwenden :)
Ilya Gazman

Ich versuche dies zu nutzen, stoße aber auf Probleme. Hilfe zu dieser Frage, die ich gepostet habe? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
Lion789

28

Kam heute über diese Frage und so mache ich es. Rufen Sie einfach diese Funktion mit den erforderlichen Parametern auf

public void saveImage(Context context, Bitmap bitmap, String name, String extension){
    name = name + "." + extension;
    FileOutputStream fileOutputStream;
    try {
        fileOutputStream = context.openFileOutput(name, Context.MODE_PRIVATE);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Verwenden Sie dies ebenfalls, um dasselbe zu lesen

public Bitmap loadImageBitmap(Context context,String name,String extension){
    name = name + "." + extension
    FileInputStream fileInputStream
    Bitmap bitmap = null;
    try{
        fileInputStream = context.openFileInput(name);
        bitmap = BitmapFactory.decodeStream(fileInputStream);
        fileInputStream.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
     return bitmap;
}

Wie übergeben Sie das Argument ban die Funktion saveImage? Ich habe die Bilder auf mein Android-Gerät gestellt, aber ich kann ihren Weg nicht finden. Wenn ich ihren Pfad nicht finden kann, kann ich sie nicht als Argumente an die Funktion übergeben saveImage.
Autonome

Ich habe das Foto auf dem Gerät. Ich kann es sowohl über Datei-Explorer-Apps als auch über die ADB-Shell sehen, aber ich konnte die Adresse nicht programmgesteuert abrufen. Also ließ ich es mit Code schreiben und dann wieder lesen. Lesen ist mein oberstes Ziel, aber ich bekomme es immer, nilwenn ich versuche, dieses Foto zu lesen.
Autonome

1
OK, wenn Sie sagen, dass Sie es erneut schreiben, haben Sie diese Bilddaten vermutlich als Bitmap oder Rohdaten in Form eines Byte-Arrays. Wenn Sie eine Bitmap haben, können Sie die oben genannten Funktionen direkt verwenden. Wenn Sie es in Form eines Byte-Arrays haben, konvertieren Sie es in Bitmap. Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); Oder auch wenn es in einer anderen Form vorliegt, konvertieren Sie es einfach in eine Bitmap und verwenden Sie die oben genannten Funktionen.
Anurag

"Antwort bearbeitet" mit Erweiterung, in meinem Fall wurden Probleme angesprochen, so dass ich schließlich das Problem fand, dass Erweiterung als Parameter hinzugefügt werden sollte.
Naveed Ahmad

Vielen Dank für die Bearbeitung, ich nahm an, dass die Erweiterung Teil des Namens selbst ist.
Anurag

6

Für Kotlin-Benutzer habe ich eine ImageStorageManagerKlasse erstellt, die das Speichern, Abrufen und Löschen von Aktionen für Bilder einfach handhabt:

class ImageStorageManager {
    companion object {
        fun saveToInternalStorage(context: Context, bitmapImage: Bitmap, imageFileName: String): String {
            context.openFileOutput(imageFileName, Context.MODE_PRIVATE).use { fos ->
                bitmapImage.compress(Bitmap.CompressFormat.PNG, 25, fos)
            }
            return context.filesDir.absolutePath
        }

        fun getImageFromInternalStorage(context: Context, imageFileName: String): Bitmap? {
            val directory = context.filesDir
            val file = File(directory, imageFileName)
            return BitmapFactory.decodeStream(FileInputStream(file))
        }

        fun deleteImageFromInternalStorage(context: Context, imageFileName: String): Boolean {
            val dir = context.filesDir
            val file = File(dir, imageFileName)
            return file.delete()
        }
    }
}

Lesen Sie hier mehr


Müssen Sie den absoluten Pfad verwenden, der von saveToInternalStorage () empfangen wurde, um ihn mit getImageFromInternalStorage () oder nur mit dem Dateinamen abzurufen?
Leo Droidcoder

1
Nur imageFileNamegenug, um es abzurufen
Amiraslan

Mann, ich habe 10 Stunden dafür verschwendet
Pb Studies

0
    public static String saveImage(String folderName, String imageName, RelativeLayout layoutCollage) {
        String selectedOutputPath = "";
        if (isSDCARDMounted()) {
            File mediaStorageDir = new File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), folderName);
            // Create a storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d("PhotoEditorSDK", "Failed to create directory");
                }
            }
            // Create a media file name
            selectedOutputPath = mediaStorageDir.getPath() + File.separator + imageName;
            Log.d("PhotoEditorSDK", "selected camera path " + selectedOutputPath);
            File file = new File(selectedOutputPath);
            try {
                FileOutputStream out = new FileOutputStream(file);
                if (layoutCollage != null) {
                    layoutCollage.setDrawingCacheEnabled(true);
                    layoutCollage.getDrawingCache().compress(Bitmap.CompressFormat.JPEG, 80, out);
                }
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return selectedOutputPath;
    }



private static boolean isSDCARDMounted() {
        String status = Environment.getExternalStorageState();
        return status.equals(Environment.MEDIA_MOUNTED);
    }

Frage ist über den internen Speicher.
Denny Kurniawan

0

// mehrere Bilder abrufen

 File folPath = new File(getIntent().getStringExtra("folder_path"));
 File[] imagep = folPath.listFiles();

 for (int i = 0; i < imagep.length ; i++) {
     imageModelList.add(new ImageModel(imagep[i].getAbsolutePath(), Uri.parse(imagep[i].getAbsolutePath())));
 }
 imagesAdapter.notifyDataSetChanged();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.