这两天写了一下相机的使用,看了网上很多文章,不是很全的,在我自己弄出来之后,做了一个整理归纳。我用的是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>