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();
}
}
}
}
}
浙公网安备 33010602011771号