[JAVA] * Android * Enregistrement / chargement d'images sur un stockage externe

introduction

Bonjour. Dans la continuité de Dernière fois, je vais vous expliquer le fonctionnement de stockage d'Android. Cette fois, le contenu est de sauvegarder / charger des images sur le stockage externe, mais je vais essayer de le réaliser de manière aussi proche que possible de la sauvegarde / lecture précédente des fichiers sur le stockage externe.

Comme je l'ai mentionné à chaque fois, le contenu de chaque article sur les commentaires Android est légèrement différent, et je pense que certaines personnes peuvent se perdre, alors j'essaie d'écrire une méthode standard.

supposition

L'environnement de développement est le suivant. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x

Enregistrer / charger des images sur un stockage externe

L'histoire de la sauvegarde sur le stockage externe précédente a été décrite en détail, je vais donc l'omettre. Cette fois également, nous traiterons de la lecture et de l'écriture dans la zone spécifique à l'application du stockage externe.

Enregistrement des fichiers image sur un stockage externe

L'explication est basée sur l'hypothèse qu'un dossier d'actifs est créé sous le répertoire principal d'Android et que picture.jpg est placé. Le dossier d'actifs est créé en cliquant avec le bouton droit de la souris sur ** [main] → [Nouveau] → [Dossier] → [Dossier d'actifs] **.

Maintenant, récupérez le chemin du dossier que vous souhaitez enregistrer dans le stockage externe et créez le chemin avec le nom du fichier.

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

En conséquence, la chaîne de caractères "/ sdcard / Android / data / nom du package / files / PICTURES / picture.jpg " est affectée à la variable de fichier.

Ensuite, chargez le fichier image à partir du dossier Asset.

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

Enregistrez le fichier image lu dans le stockage externe. Le tableau d'octets du fichier image est acquis par ```inputStream.read (buffer) `` `. Le tableau d'octets est écrit dans un fichier qui enregistre 1024 octets dans le stockage externe.

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();

Lecture de fichiers image à partir d'un stockage externe

Pour charger une image, ouvrez le flux avec le type InputStream. Ensuite, utilisez BitmapFactory.decodeStream () '' pour obtenir l'image en tant que type Bitmap ''. Après cela, réglez-le sur imageView avec `setImageBitmap ()`.

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

Exemple de code

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++){
            //La première fois, c'est PERMISSION_Retours REFUSÉS
            if (checkSelfPermission(PERMISSIONS[i]) != PackageManager.PERMISSION_GRANTED) {
                //Renvoie true si la demande est rejetée une fois. Renvoie false pour la première fois ou lorsque "Ne plus afficher" est sélectionné.
                if (shouldShowRequestPermissionRationale(PERMISSIONS[i])) {
                    Toast.makeText(this, "Autorisation requise pour exécuter l'application", 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 * Enregistrement / chargement d'images sur un stockage externe
* Android * Sauvegarde / chargement de fichiers sur le stockage interne
POST des images d'Android vers PHP en utilisant Retrofit
Comment lier des images à l'aide de FactoryBot Active Storage
[Android] Téléchargement d'images du terminal vers le serveur
Application Android qui sélectionne et affiche des images de la galerie
Compressez et téléchargez plusieurs fichiers sur Firebase Storage sur Android.