android: 用相机拍照并保存到相册

一,代码:

添加在AndroidManifest.xml中的FileProvider

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.okdemo1.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public"></meta-data>
        </provider>

java

package com.example.okdemo1.activity;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.okdemo1.R;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.engine.impl.GlideEngine;
import com.zhihu.matisse.internal.entity.CaptureStrategy;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PermissionActivity extends AppCompatActivity {

    private static final int CAMERA_PERMISSION_REQUEST_CODE = 101;    //相机权限代码
    private static final int STORAGE_PERMISSION_CODE = 102;        //存储权限代码
    private ActivityResultLauncher<Intent> mCameraLauncher;        //调起相机的launcher
    private Uri imageUri;               //保存照片的uri
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_permission);

        // 需要事先注册
        mCameraLauncher = registerForActivityResult(
                // 回调函数的参数将是一个ActivityResult
                new ActivityResultContracts.StartActivityForResult(),
                // 回调函数
                this::handleCameraResult);

        //给按钮增加点击事件
        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                askCameraPermission();
            }
        });

    }

    //请求相机权限,如果已有权限则打开相机
    private void askCameraPermission(){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 如果没有获得相机权限,就请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
        } else {
            // 已经获得相机权限,检查存储权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
            } else {
                // 已经获得相机和存储权限,直接打开相机
                openCamera();
            }
        }
    }


    //请求权限的回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同意相机权限,可以打开相机
                askCameraPermission();
            } else {
                // 用户拒绝相机权限,可以给出提示或者关闭相关功能
                Toast.makeText(this, "请授予相机权限", Toast.LENGTH_SHORT).show();
            }
        }

        if (requestCode == STORAGE_PERMISSION_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同意存储权限,可以打开相机
                askCameraPermission();
            } else {
                // 用户拒绝相机权限,可以给出提示或者关闭相关功能
                Toast.makeText(this, "请授予存储权限", Toast.LENGTH_SHORT).show();
            }
        }

    }

    //创建照片文件
    private File createImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(imageFileName, ".jpg", storageDir);
        return image;
    }

    //打开相机拍照
    private void openCamera() {
        if (mCameraLauncher != null) {
            // launch的输入参数是泛型,对应ActivityResultLauncher<Intent>
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 确保有相机应用可用
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {


                File photoFile = null;
                try {
                    photoFile = createImageFile();
                } catch (IOException ex) {
                    // Error occurred while creating the File
                }
                if (photoFile != null) {
                    imageUri = FileProvider.getUriForFile(this, "com.example.okdemo1.fileprovider", photoFile);
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    //startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                    mCameraLauncher.launch(takePictureIntent);
                }
            }
        }
    }

    //处理拍照的结果
    private void handleCameraResult(ActivityResult result) {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();

            if (data != null) {
                //MediaScannerConnection.scanFile(this, new String[]{imageUri.getPath()}, null, null);
                try {
                InputStream inputStream = getContentResolver().openInputStream(imageUri);
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                //保存到相册
                String savedImageURL = MediaStore.Images.Media.insertImage(
                        getContentResolver(),
                        bitmap,
                        "Image_" + System.currentTimeMillis(),
                        "Image saved from the app"
                );

                    if (savedImageURL != null) {
                        Toast.makeText(this, "保存到相册成功!", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(this, "保存到相册失败!", Toast.LENGTH_SHORT).show();
                    }

            } catch (Exception e) {
                e.printStackTrace();
            }

            }
        }
    }


}

 

posted @ 2025-06-07 10:50  刘宏缔的架构森林  阅读(71)  评论(0)    收藏  举报