[JAVA] * Android * Speichern / Laden von Bildern in einen externen Speicher

Einführung

Hallo. In Fortsetzung von Letztes Mal werde ich den Speichervorgang von Android erläutern. Dieses Mal besteht der Inhalt darin, Bilder im externen Speicher zu speichern / zu laden, aber ich werde versuchen, dies so nahe wie möglich am vorherigen Speichern / Lesen von Dateien im externen Speicher zu realisieren.

Wie ich jedes Mal erwähnte, ist der Inhalt jedes Artikels über Android-Kommentare etwas anders, und ich denke, dass einige Leute verloren gehen können, deshalb versuche ich, eine Standardmethode zu schreiben.

Annahme

Die Entwicklungsumgebung ist wie folgt. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x

Speichern / Laden von Bildern in einen externen Speicher

Die Geschichte des Speicherns auf externem Speicher vorher wurde ausführlich beschrieben, daher werde ich sie weglassen. Auch diesmal beschäftigen wir uns mit Lesen und Schreiben in den anwendungsspezifischen Bereich des externen Speichers.

Speichern von Bilddateien in einem externen Speicher

Die Erklärung basiert auf der Annahme, dass ein Asset-Ordner unter dem Hauptverzeichnis von Android erstellt und picture.jpg platziert wird. Der Asset-Ordner wird durch Klicken mit der rechten Maustaste auf ** [Haupt] → [Neu] → [Ordner] → [Assets-Ordner] ** erstellt.

Rufen Sie nun den Pfad zu dem Ordner ab, den Sie im externen Speicher speichern möchten, und erstellen Sie den Pfad einschließlich des Dateinamens.

this.imgName = "picture.jpg ";
this.path = getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString();
this.file = this.path + "/" + this.fileName;

Infolgedessen wird der Dateivariablen die Zeichenfolge "/ sdcard / Android / data / Paketname / files / PICTURES / picture.jpg " zugewiesen.

Laden Sie als Nächstes die Bilddatei aus dem Asset-Ordner.

AssetManager assetManager = getResources().getAssets();
InputStream inputStream = assetManager.open(imgName);

Speichern Sie die gelesene Bilddatei im externen Speicher. Das Byte-Array der Bilddatei wird von `inputStream.read (buffer)` erfasst. Das Byte-Array wird in eine Datei geschrieben, die 1024 Bytes im externen Speicher speichert.

FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
while (true){
    int len = inputStream.read(buffer);
    if (len < 0){
        break;
    }
    fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();

Lesen von Bilddateien aus einem externen Speicher

Um ein Bild zu laden, öffnen Sie den Stream mit dem Typ "InputStream". Verwenden Sie dann `BitmapFactory.decodeStream ()`, um das Bild als `Bitmap``` Typ zu erhalten. Danach setzen Sie es mit setImageBitmap () auf `imageView```.

InputStream inputStream = new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);

Beispielcode

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.keita.myapplication">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:text="Save File"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="Read File"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button1" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitCenter"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.2"/>

</android.support.constraint.ConstraintLayout>

MainActivity.java


package com.example.keita.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {
    private String file;
    private String path;
    public String state;
    private String imgName = "picture.jpg ";
    private Button button1;
    private Button button2;
    public ImageView imageView;
    private final String[] PERMISSIONS = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    private final int REQUEST_PERMISSION = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.button1 = findViewById(R.id.button1);
        this.button2 = findViewById(R.id.button2);
        this.imageView = findViewById(R.id.imageView);
        this.path = getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString();
        this.file = this.path + "/" + this.imgName;

        checkPermission();
    }

    private void checkPermission(){
        if (isGranted()){
            setEvent();
        }
        else {
            requestPermissions(PERMISSIONS, REQUEST_PERMISSION);
        }
    }


    private boolean isGranted(){
        for (int i = 0; i < PERMISSIONS.length; i++){
            //Das erste Mal ist die ERLAUBNIS_VERWEIGERT kehrt zurück
            if (checkSelfPermission(PERMISSIONS[i]) != PackageManager.PERMISSION_GRANTED) {
                //Gibt true zurück, wenn die Anforderung einmal abgelehnt wird. Gibt zum ersten Mal false zurück oder wenn "Nicht mehr anzeigen" ausgewählt ist.
                if (shouldShowRequestPermissionRationale(PERMISSIONS[i])) {
                    Toast.makeText(this, "Zum Ausführen der App ist eine Berechtigung erforderlich", Toast.LENGTH_LONG).show();
                }
                return false;
            }
        }
        return true;
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSION){
            checkPermission();
        }
    }


    private void setEvent(){
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                state = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(state)){
                    saveFile(file);
                }
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                state = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(state)){
                    readFile(file);
                }
            }
        });
    }


    private void saveFile(String file){
        try {
            AssetManager assetManager = getResources().getAssets();
            InputStream inputStream = assetManager.open(imgName);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            while (true){
                int len = inputStream.read(buffer);
                if (len < 0){
                    break;
                }
                fileOutputStream.write(buffer, 0, len);
            }
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void readFile(String file){
        try {
            InputStream inputStream = new FileInputStream(file);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Recommended Posts

* Android * Speichern / Laden von Bildern in einen externen Speicher
* Android * Speichern / Laden von Dateien in den internen Speicher
POST-Bilder von Android auf PHP mit Retrofit
So verknüpfen Sie Bilder mit FactoryBot Active Storage
[Android] Hochladen von Bildern vom Terminal auf den Server
Android App, die Bilder aus der Galerie auswählt und anzeigt
Komprimieren Sie mehrere Dateien und laden Sie sie auf Android in Firebase Storage hoch.