android 7.0 相机拍照和裁剪适配:
Android7.0(Android N)适配教程,心得
Android 7.0 适配 FileProvider相机 相册 裁剪的使用
Android7.0适配心得
大神的案例源码android7.0拍照或相册选择照片并裁剪
h核心代码:
private void takePhotoForCamera() {
String[] permissions={Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestRuntimePermission(permissions, new MilkActivity.PermissionListener() {
@Override
public void onGranted() {
openCamera();
}
@Override
public void onDenied(List deniedPermission) {
//有权限被拒绝,什么也不做好了,看你心情
}
});
}
private void openCamera() {
File dir =new File(Environment.getExternalStorageDirectory()+"/"+localTempImgDir);
if (!dir.exists())
dir.mkdirs();
cameraFile =new File(dir,"HyLifeImg"+(new SimpleDateFormat("yyyy_MM_dd_HHmmss").format(new Date()))+".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
imageUri = Uri.fromFile(cameraFile);
} else {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageUri = FileProvider.getUriForFile(MilkActivity.this, "包名.fileprovider", cameraFile);
}
// 启动相机程序
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_CANCELED) {
return;
}
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {
try {
// 将拍摄的照片显示出来
startPhotoZoom(cameraFile,350);
MediaStore.Images.Media.insertImage(MilkActivity.this.getContentResolver(),
file.getAbsolutePath(), null, null);
MediaScannerConnection.scanFile(MilkActivity.this, new String[]{file.getAbsolutePath()}, null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
case CROP_PHOTO:
try {
if (resultCode==RESULT_OK){
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.fromFile(new File(cachPath))));
AppContentApplication.bitmap=bitmap;
if (CameraFragment.State_a){
Intent intent = new Intent(MilkActivity.this, CollectActivity.class);
startActivity(intent);
}else {
Intent intent = new Intent(MilkActivity.this, AnalysisActivity.class);
startActivity(intent);
}
}
}catch (Exception e){
e.printStackTrace();
}
break;
}
}
private File getCacheFile(File parent, String child) {
// 创建File对象,用于存储拍照后的图片
file = new File(parent, child);
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
/**
* 剪裁图片
*/
private void startPhotoZoom(File file, int size) {
Log.i("TAG",getImageContentUri(this,file)+"裁剪照片的真实地址");
try {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(getImageContentUri(this,file), "image/*");//自己使用Content Uri替换File Uri
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 9999);
intent.putExtra("aspectY", 9998);
intent.putExtra("outputX", 230);
intent.putExtra("outputY", 200);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cacheFile));//定义输出的File Uri
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, CROP_PHOTO);
} catch (ActivityNotFoundException e) {
String errorMessage = "Your device doesn't support the crop action!";
Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
//andrpoid 6.0 需要写运行时权限
public void requestRuntimePermission(String[] permissions, MilkActivity.PermissionListener listener) {
mListener = listener;
List permissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(MilkActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
if (!permissionList.isEmpty()) {
ActivityCompat.requestPermissions(MilkActivity.this, permissionList.toArray(new String[permissionList.size()]), 1);
} else {
mListener.onGranted();
}
}
@TargetApi(23)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
List deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String permission = permissions[i];
if (grantResult != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permission);
}
}
if (deniedPermissions.isEmpty()) {
mListener.onGranted();
} else {
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
public interface PermissionListener {
/**
* 成功获取权限
*/
void onGranted();
/**
* 为获取权限
* @param deniedPermission
*/
void onDenied(List deniedPermission);
}
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
provider>
res/xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="" />
paths>