Voraussetzung: Rufen Sie die Telefonkamera auf, indem Sie auf die Kamerataste klicken, und zeigen Sie sie nach dem Aufnehmen eines Fotos auf dem Bildschirm an
1. Gestaltung der Layoutdatei
Platzieren Sie eine Schaltfläche und ein ImageView-Steuerelement in der XML-Datei (das Bild wird hier platziert).
PS: Ich persönlich empfehle, Komponenten direkt mit dem Constraint-Layout zu ziehen
Code wie folgt anzeigen:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
<Button
android:id="@+id/take_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.109" />
<ImageView
android:id="@+id/picture"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.461"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2"
tools:srcCompat="@drawable/baseline_child_care_24" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. Berechtigungen erteilen
Da die von uns implementierte Funktion darin besteht, Daten im öffentlichen Speicher zu lesen und zu schreiben, müssen wir die Berechtigung „WRITE_EXTERNAL_STORAGE“ verwenden und „android:maxSdkVersion="18"“ entfernen.
Autorisieren Sie in der Manifestdatei
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
3. Verwenden Sie die FIleProvider-Klasse
Da wir Daten (z. B. aufgenommene Fotos) zwischen unserer aktuellen Anwendung und der Kamera austauschen müssen, müssen wir die FileProvider-Klasse verwenden
Konfigurationsprozess:
Zunächst müssen Sie
AndroidManifest.xml
über Tags in der Datei deklarieren<provider>
und benutzerdefinierteandroid:authorities
Attribute konfigurieren. Der Code lautet wie folgt:
<manifest>
<application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="my.itgungnir.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
</provider>
</application>
</manifest>
Wenn Ihre Emulatorversion niedriger als Android10 ist, verwenden Sie android.support.v4.content.FileProvider
Damit andere Anwendungen auf die Dateien unter der aktuellen Anwendung zugreifen können, müssen wir auch konfigurieren, auf welche Ordner zugegriffen werden kann. Dieser Schritt wird auch XML
in der Datei konfiguriert. Wir müssen eine Pfadkonfigurationsdatei unter dem Projektordner erstellen /res/xml
, sie benennen file_paths.xml
(der Dateiname kann angepasst werden) und der Stammknoten in dieser Datei <paths>
den Ordner unter diesem Knoten konfigurieren. Eine Beispielkonfiguration sieht wie folgt aus:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="/"/>
</paths>
Der Pfadpfad ist auf „/“ gesetzt, was bedeutet, dass auf alle Ordner zugegriffen werden kann
Nachdem wir jeden Ordner konfiguriert haben, müssen wir diese Konfiguration auch im Etikett AndroidManifest.xml
in der Datei referenzieren <provider>
, damit die Konfiguration wirksam werden kann. Verwenden Sie <meta-data>
Tags, um auf die Konfiguration zu verweisen. Der Code lautet wie folgt:
<provider
android:authorities="Tom_LZK"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<meta-data>
Die Attribute in den Tags android:name
sind feste Werte android.support.FILE_PROVIDER_PATHS
und android:resource
die Attribute sind Verweise auf die oben genannten Konfigurationsdateien.
Hängen Sie den Code von MainActivity an:
package com.example.arbitrary;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
public static final int TAKE_PHOTO = 1;
private ImageView picture;
private Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button takePhoto = findViewById(R.id.take_photo);
picture = findViewById(R.id.picture);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建File对象,用来存储拍照后的照片
//getExternalCacheDir()获取此应用缓存数据的位置,在这个位置保存图片
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
if (outputImage.exists()) {//如果图片已经存在就删除再重新创建
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = FileProvider.getUriForFile(MainActivity.this,
"Tom_LZK", outputImage);
//启动相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TAKE_PHOTO && resultCode == RESULT_OK) {
//显示拍出来的照片
Bitmap bitmap = BitmapFactory.decodeFile(getExternalCacheDir()+"//output_image.jpg");
picture.setImageBitmap(bitmap);
}
}
}
Beenden.
Hinweis: Die Berechtigungsvariable in der getUriForFile-Methode sollte mit den Berechtigungen im Anbieter übereinstimmen