第一次写这个也,也不知道怎么写,希望可以帮助到一些人吧 。下边我就直接上代码了
先加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/>
调用相机
private void onCamera() { Intent intent = new Intent(); File file = getOutputMediaFile(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //针对Android7.0,需要通过FileProvider封装过的路径,提供给外部调用 imageUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file);//通过FileProvider创建一个content类型的Uri,进行封装 } else { //7.0以下,如果直接拿到相机返回的intent值,拿到的则是拍照的原图大小,很容易发生OOM,所以我们同样将返回的地址,保存到指定路径,返回到Activity时,去指定路径获取,压缩图片 imageUri = Uri.fromFile(file); } intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI startActivityForResult(intent, 100);//启动拍照 }
创建个图片文件
private File getOutputMediaFile() { File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/" + getApplicationContext().getPackageName() + "/Files"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } File mediaFile; String mImageName = "cut.png"; mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); return mediaFile; }
调用相册
private void onPhoto() { Intent gallery_Intent = new Intent(Intent.ACTION_PICK, null); gallery_Intent.setType("image/*"); startActivityForResult(gallery_Intent, 200); }
系统截图
//裁剪图片 private void performCrop(Uri uri) { try { 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.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 2); intent.putExtra("aspectY", 3); intent.putExtra("outputX", 500); intent.putExtra("outputY", 750); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); //裁剪之后,保存在裁剪文件中,关键 // intent.putExtra("return-data", true); imageUri = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); startActivityForResult(intent, 300); } catch (ActivityNotFoundException anfe) { String errorMessage = "你的设备不支持裁剪行为!"; Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); toast.show(); } }
写到这儿差不多就快完了 接下来是个回传值
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 100: try { if (null != imageUri) { performCrop(imageUri); } } catch (Exception e) { e.printStackTrace(); } break; case 200: try { if (data.getData() != null) { performCrop(data.getData()); } } catch (Exception e) { e.printStackTrace(); } break; case 300: Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } break; } }
下边在给大家说一下7.0的 解决问题
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.youranning.cutimage.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
file_paths
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <root-path path="." name="camera_photos" /> <external-path path="." name="files_root" /> </paths>
到这儿就结束了,希望可以帮助大家,不喜勿喷