AS2022 realisiert lediglich das Aufrufen der Mobiltelefonkamera, um Bilder aufzunehmen und die Bilder anzuzeigen

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 XMLin 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.xmlin 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:namesind feste Werte android.support.FILE_PROVIDER_PATHSund android:resourcedie 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

Ich denke du magst

Origin blog.csdn.net/weixin_64089259/article/details/129813180
Empfohlen
Rangfolge