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.
Die Entwicklungsumgebung ist wie folgt. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x
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.
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();
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);
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