安卓开发-自定义照相机界面
此项目是总结了其他三位大佬的代码后写出来的,在此首先感谢三位大佬:
自定义照相机编写方法:https://blog.csdn.net/shan286/article/details/53189034
解决照相机拍的照片像素低的方法:https://blog.csdn.net/w6718189/article/details/104501618?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
浏览图片放大缩小方法:https://blog.csdn.net/lpcrazyboy/article/details/80777112
话不多说,先上图片
1.主界面
2.点击系统组件拍照按钮后跳转的界面
3.点击拍照按钮后的界面
4.点击确定按钮后(我的设备里确定按钮就是那个√),返回首页并展示选择拍摄图片的界面
5.点击自定义组件拍照按钮后的界面
6.点击中间的拍照按钮后进入的照片预览界面
7.点击使用图片后返回主页面并展示图片
下面开始贴代码:
MainAcitivity:
package com.mobile.takephotodemo;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private Button btn_takephoto_amn, btn_takephotocam_amn;
private ImageView iv_photo_ato;
private int REQUEST_CODE = 1;
public static final int REQUEST_CODE_READ = 3;
public static final int REQUEST_CODE_WRITE = 2;
private String mFilePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();//代码初始化
setClick();//设置点击方法
getInfo();//获取其他界面传递过来的信息
}
/**
* 获取其他界面传递过来的信息
*/
private void getInfo() {
try {
String path = getIntent().getStringExtra("picpath");//通过值"picpath"得到照片路径
FileInputStream fis = new FileInputStream(path);//通过path把照片读到文件输入流中
Bitmap bitmap = BitmapFactory.decodeStream(fis);//将输入流解码为bitmap
Matrix matrix = new Matrix();//新建一个矩阵对象
matrix.setRotate(90);//矩阵旋转操作让照片可以正对着你。但是还存在一个左右对称的问题
//新建位图,第2个参数至第5个参数表示位图的大小,matrix中是旋转后的位图信息,并使bitmap变量指向新的位图对象
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
iv_photo_ato.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置点击方法
*/
private void setClick() {
btn_takephoto_amn.setOnClickListener(new MainActivityClick());
btn_takephotocam_amn.setOnClickListener(new MainActivityClick());
}
/**
* 代码初始化
*/
private void initView() {
iv_photo_ato = findViewById(R.id.iv_photo_ato);//展示拍照图片的控件
btn_takephoto_amn = findViewById(R.id.btn_takephoto_amn);//调用系统组件拍照
btn_takephotocam_amn = findViewById(R.id.btn_takephotocam_amn);//调用自定义组件拍照
}
/**
* 设置点击方法
*/
private class MainActivityClick implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_takephoto_amn://拍照按钮的点击方法
// Toast.makeText(MainActivity.this, "拍照按钮", Toast.LENGTH_SHORT).show();
checkPermissions();//获取用户权限
break;
case R.id.btn_takephotocam_amn://进入自定义拍照界面
checkotherPermissions();//获取用户权限
break;
default:
break;
}
}
}
/**
* 自定义拍照界面获取权限
*/
private void checkotherPermissions() {
boolean canWrite = isWriteStoragePermissionGranted();//获取写的权限
// Log.d(TAG, " canWrite :" + canWrite);
if (canWrite) {
boolean canRead = isReadStoragePermissionGranted();//获取读的权限
// Log.d(TAG, " canRead :" + canRead);
if (canRead) {
// Log.d(TAG, " Now you are ready to access camera :");
startActivity(new Intent(MainActivity.this, Customcamera.class));
}
}
}
/**
* 获取用户权限
*/
private void checkPermissions() {
boolean canWrite = isWriteStoragePermissionGranted();//获取写的权限
// Log.d(TAG, " canWrite :" + canWrite);
if (canWrite) {
boolean canRead = isReadStoragePermissionGranted();//获取读的权限
// Log.d(TAG, " canRead :" + canRead);
if (canRead) {
// Log.d(TAG, " Now you are ready to access camera :");
callCamera();
}
}
}
/**
* 打开照相机
*/
private void callCamera() {
mFilePath = Environment.getExternalStorageDirectory().getPath();
// 保存图片的文件名
SimpleD