Android8.0以上打开相机并裁剪图片
生活随笔
收集整理的這篇文章主要介紹了
Android8.0以上打开相机并裁剪图片
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Android7.0以上打開相機(jī)的權(quán)限更加嚴(yán)格了,有很多博客也是講這些具體操作的,如果想更深入了解,請自行搜索,這里我只是列出使用的方法,第一行代碼第二版的內(nèi)容,打開相機(jī)的權(quán)限是基于android7.0,如果完整的按照書上內(nèi)容寫個demo,是可以實(shí)現(xiàn)的。這里面我綜合了書上的內(nèi)容,在加上從幾篇博客上的總結(jié),寫了一個測試的Demo,運(yùn)行在真機(jī)上是沒問題(android8.0)。
下面說一下步驟
1、在AndroidManifest.xml文件下的《application》標(biāo)簽中定義一個《provider》內(nèi)容提供者。
2、在res文件目錄下創(chuàng)建一個xml文件夾,里面生成一個provider_paths.xml文件
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!--"."表示所有路徑--><external-path name="名字隨便填" path="."/></paths>3、打開相機(jī)`
private void openCamera() {//創(chuàng)建一個保存圖片的路徑File outputImage = new File(getExternalCacheDir(), "output_image.jpg");try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}//如果android7.0以上的系統(tǒng),需要做個判斷if (Build.VERSION.SDK_INT >= 24) {ImageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.myapplication.provider", outputImage);//7.0} else {ImageUri = Uri.fromFile(outputImage); //7.0以下}//利用隱式Intent 打開系統(tǒng)相機(jī)Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);startActivityForResult(intent, TAKE_PHOTO);//這里的TAKE_PHOTO是定義的一個靜態(tài)常數(shù)變量 }4、由于是startActivityForResult啟動的系統(tǒng)相機(jī),所以照完的照片可以用onActivityResult方法接受。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {//截取相機(jī)拍照后的圖片case TAKE_PHOTO:startPhotoZoom(ImageUri);//這里調(diào)用了截取圖片的方法break;//返回截取后的結(jié)果case RESULT_REQUEST_CODE:if (resultCode == RESULT_OK) {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));imageButton.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;4.1、截取圖片的方法startPhotoZoom
private void startPhotoZoom(Uri uri) {File CropPhoto = new File(getExternalCacheDir(), "Crop.jpg");//這個是創(chuàng)建一個截取后的圖片路徑和名稱。try {if (CropPhoto.exists()) {CropPhoto.delete();}CropPhoto.createNewFile();} catch (IOException e) {e.printStackTrace();}ImageUri = Uri.fromFile(CropPhoto);Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加這一句表示對目標(biāo)應(yīng)用臨時授權(quán)該Uri所代表的文件}intent.putExtra("crop", "true");intent.putExtra("scale", true);intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);//輸出的寬高intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, RESULT_REQUEST_CODE);//這里的RESULT_REQUEST_CODE是在startActivityForResult里使用的返回值。}總結(jié)
以上是生活随笔為你收集整理的Android8.0以上打开相机并裁剪图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个基于爬虫的项目: Kiwix Ar
- 下一篇: 【Codeforces 924C】Riv