这两天写了一下相机的使用,看了网上很多文章,不是很全的,在我自己弄出来之后,做了一个整理归纳。我用的是Android6.0真机测试,华为手机。
1、Android6.0以上,在调用相机权限时,必须要动态注册。 验证权限+重写权限
//相机权限标记,camera_permission为标记,根据你自己的标记喜好设置
private static final int camera_permission = 4;
/*
* 验证相机权限
*
*/
public static boolean cameraPermissions(Activity activity){
if (Build.VERSION.SDK_INT < 23){
return true;
}
int permission = ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA);
//
if (permission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},camera_permission);
return false;
}else {
return true;
}
}
//重写相机权限
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
//标记
case camera_permission:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 许可
} else {
// 权限被拒绝
Toast.makeText(CameraActivity.this, "你禁用了相机权限", Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
2、调用系统相机照相
//图片的一个输出路径
private Uri imageUri;
//图片地址
private File outputImage;
//图片存放的文件夹地址
private File file;
//照相
private void photoGraph() {
//建一个文件夹,保存图片的路径
file = new File(Environment.getExternalStorageDirectory(),"/DCIM/");
if (!file.exists()){
file.mkdir();
}
/**
* 这里将时间作为不同照片的名称
*/
outputImage=new File(file,System.currentTimeMillis()+".PNG");
/**
* 如果该文件已经存在,则删除它,否则创建一个
*/
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(this,"com.android.ted.gank.fileprovider", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
//调用系统相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.addCategory(Intent.CATEGORY_DEFAULT);
//设置图片输出地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//作一个标记,在重写onActivityResult()方法中调用
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
3、选择手机中的照片
// 相册选择标记
private static final int PHOTO_REQUEST_GALLERY = 3;
//选择手机中的照片
private void selectPicture(){
//打开资源库
Intent intentSel = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intentSel, PHOTO_REQUEST_GALLERY); //PHOT_REQUEST_GALLERY标记,重写onActivityResult()调用
}
4、图片剪切
//图片剪切标记
private static final int PHOTO_REQUEST_CUT = 2;
//图片剪切
private void setCrop(Uri imageUri){
//裁剪界面
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX , aspectY :宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputImageX", 80);
intent.putExtra("outputImageY", 80);
// intent.putExtra("outputImageFormat", "JPEG");// 图片格式
// intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// 图片剪切标记,重写onActivityResult()中调用,PHOTO_REQUEST_CUT值根据自己喜好设置
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
5、重写onActivityResult()方法
//注意:在使用时,一定要判断data数据是否为空,否则会出现各种找不到或者无法选取图片错误。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CAMERA_REQUEST_CODE: //照相标记,并剪切图片
//此处如果不作判断,将会出现如果不点击照相,直接返回时,会生成一个空文件。
if (resultCode == Activity.RESULT_OK){
//通过intent,将照片保存到手机中
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(imageUri);
this.sendBroadcast(intent);
setCrop(imageUri);
}
break;
case PHOTO_REQUEST_CUT: //图片剪切标记,并显示图片
if (data != null){
showPicture(imageUri);
}
break;
case PHOTO_REQUEST_GALLERY: //相册获取标记,并剪切图片
if (data != null){
imageUri = data.getData();
setCrop(imageUri);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
6、布局初始化和点击事件
private ImageView heardImage;
private Button system_picture;
private Button take_photo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_activity);
init();
}
private void init(){
cameraPermissions(this);
heardImage= findViewById(R.id.heardImage);
system_picture = findViewById(R.id.system_picture);
system_picture.setOnClickListener(this);
take_photo = findViewById(R.id.take_photo);
take_photo.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.take_photo:
photoGraph();
break;
case R.id.system_picture:
selectPicture();
break;
}
}
7、布局界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/heardImage"
android:src="@mipmap/ic_launcher"
android:layout_centerInParent="true"
android:layout_width="200px"
android:layout_height="200px" />
<Button
android:id="@+id/system_picture"
android:text="系统照片"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:id="@+id/take_photo"
android:text="点击照相"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>