/** * take pic */ private void toTakePic() { /**android 6.0 权限申请**/ if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_FOR_WRITE_PERMISSION); //判断是否需要 向用户解释,为什么要申请该权限 ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); } else { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); //判断是否需要 向用户解释,为什么要申请该权限 ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS); } else { if (Build.VERSION.SDK_INT == 23) { // Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); // this.sendBroadcast(i); // long dateTaken = System.currentTimeMillis(); // String name = dateTaken + ".jpg"; // String fileName = name; // ContentValues values = new ContentValues(); // values.put(MediaStore.Images.Media.TITLE, fileName); // values.put("data", fileName); // values.put(MediaStore.Images.Media.PICASA_ID, fileName); // values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); // values.put(MediaStore.Images.Media.DESCRIPTION, fileName); // values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName); // Uri photoUri = getContentResolver().insert( // MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png"; File tempFile = new File(mUploadPhotoPath); Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); inttPhoto.setAction(MediaStore.ACTION_IMAGE_CAPTURE); inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile)); inttPhoto.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(inttPhoto, REQUEST_TAKE_PICTURE); } else if (Build.VERSION.SDK_INT < 23) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // 指定输出地址 mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png"; File tempFile = new File(mUploadPhotoPath); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile)); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(intent, REQUEST_TAKE_PICTURE); // 通过StartActivityForResult } } else if (Build.VERSION.SDK_INT == 24) { mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png"; File tempFile = new File(mUploadPhotoPath); Uri imageUri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", tempFile);//通过FileProvider创建一个content类型的Uri Intent intent = new Intent(); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI startActivityForResult(intent, REQUEST_TAKE_PICTURE); } else { Toast.makeText(FabuLuxianActivity.this, "未找到存储卡", Toast.LENGTH_SHORT).show(); } } } } /** * android 4.4以后的图片选择 */ @TargetApi(Build.VERSION_CODES.KITKAT) private void selectImageUriAfterKikat() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_SELECET_PICTURE_AFTER_KIKAT); } /** * android 4.4以下版本的图片选择 */ private void cropImageUri() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("return-data", true); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); intent.putExtra("noFaceDetection", true); // no face detection startActivityForResult(intent, REQUEST_SELECT_PICTURE); }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_CANCELED) { switch (requestCode) { case REQUEST_TAKE_PICTURE:// 相机返回 if (data != null) { if (data.getData() != null) { if (Build.VERSION.SDK_INT == 24) { String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this); Uri uri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", new File(filepath)); crop(uri); } else { String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this); Uri uri = Uri.fromFile(new File(filepath)); crop(uri); } // Uri uri = data.getData(); // Bitmap bm = null; // bm = BitmapUtil.decodeUriAsBitmap(this, uri); // uploadPic(bm); } else { Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 bitmap = BitmapFactory.decodeStream(BitmapUtil.Bitmap2InputStream(bitmap, 80)); uploadPic(bitmap); } } else { if (Build.VERSION.SDK_INT == 24) { String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this); Uri uri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", new File(filepath)); crop(uri); } else { String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this); Uri uri = Uri.fromFile(new File(filepath)); crop(uri); } // Uri uri = Uri.fromFile(new File(mUploadPhotoPath)); // Bitmap bm = null; // bm = BitmapUtil.decodeUriAsBitmap(this, uri); // uploadPic(bm); } break; case REQUEST_SELECT_PICTURE:// 相册返回,android4.4以下 if (data != null) { Uri uri = data.getData(); crop(uri); // mUploadPhotoPath = StringUtils.getAbsoluteImagePath(this, uri); // Bitmap bitmap = BitmapUtil.decodeFileAsBitmap(this, mUploadPhotoPath); // uploadPic(bitmap); } break; case REQUEST_SELECET_PICTURE_AFTER_KIKAT:// 相册返回,android4.4以上 if (data != null) { Uri uri = data.getData(); crop(uri); } break; case PHOTO_REQUEST_CUT: if (data != null) { Bitmap bitmap = data.getParcelableExtra("data"); uploadPic(bitmap); } break; default: break; } }
/** * 剪切图片 */ private void crop(Uri uri) { // 裁剪图片意图 Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // 裁剪框的比例,1:1 intent.putExtra("aspectX", 4); intent.putExtra("aspectY", 3); // 裁剪后输出图片的尺寸大小 intent.putExtra("outputX", 400); intent.putExtra("outputY", 300); intent.putExtra("scale", true); intent.putExtra("outputFormat", "JPEG");// 图片格式 intent.putExtra("noFaceDetection", true);// 取消人脸识别 intent.putExtra("return-data", true); // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT startActivityForResult(intent, PHOTO_REQUEST_CUT); }7.0 清单中
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.bugull.cameratakedemo.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path path="." name="camera_photos" /> </paths