相機於裁剪在現在安卓app裏很常用的 比如說頭像採集 選擇拍照的話 就需要調用自帶的本機相機
但是由於從Android7.0開始,Android對訪問文件的權限收回,所以如果我們要在應用件共享文件,應該發送一項content://URI,並對這個URI授予臨時訪問的權限。而對這個URI授權最簡單的方式就是使用FileProvider類。
我們有兩種解決辦法 我用的是其中一種
第一步 先寫一個
Application 在船建一個oncreate()方法 在裏面寫
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); 並在配置文件裏找到他
這樣解決了高版本無法使用系統相機的缺陷 在Mainivity裏要寫
private ImageView imageView; private String path = Environment.getExternalStorageDirectory()+"/tengteng.png"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.images); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //1.MediaStore.ACTION_IMAGE_CAPTURE 調取系統相機的Action Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //將當前拍好的圖片存入Sdcard MediaStore.EXTRA_OUTPUT 寫 it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path))); //啓動 startActivityForResult(it, 1000); } }); } //重新回到Activity中 回調的放法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); //2.當點擊拍完照的OK時 回調onActivityResult 打開裁剪 if(requestCode == 1000 && resultCode == RESULT_OK){ //裁剪 com.android.camera.action.CROP 裁剪的Action Intent intent = new Intent("com.android.camera.action.CROP"); //將圖片交給裁剪 intent.setDataAndType(Uri.fromFile(new File(path)), "image/*"); //設置裁剪的功能 //是否支持裁剪 intent.putExtra("CROP", true); //設置比例 intent.putExtra("aspactX", 1); intent.putExtra("aspactY", 1); //設置圖片輸出的大小 intent.putExtra("outputX", 250); intent.putExtra("outputY", 250); //是否支持人臉識別 intent.putExtra("onFaceDetection", false); //將圖片返回 intent.putExtra("return-data", true); startActivityForResult(intent, 2000); } //設置圖片 if(requestCode == 2000 && resultCode == RESULT_OK){ Bitmap bitmap = data.getParcelableExtra("data"); imageView.setImageBitmap(bitmap); } }
這樣就可以使用了