菜鳥筆記2、Android6.0版本,關於呼叫系統相機的使用和圖片儲存
阿新 • • 發佈:2019-02-17
這兩天寫了一下相機的使用,看了網上很多文章,不是很全的,在我自己弄出來之後,做了一個整理歸納。我用的是Android6.0真機測試,華為手機。
1、Android6.0以上,在呼叫相機許可權時,必須要動態註冊。 驗證許可權+重寫許可權
//相機許可權標記,camera_permission為標記,根據你自己的標記喜好設定 private static final int camera_permission = 4; /* * 驗證相機許可權* */ public static boolean cameraPermissions(Activity activity){ if (Build.VERSION2、呼叫系統相機照相.SDK_INT < 23){ return true; } int permission = ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA); //if (permission != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},camera_permission); return false; }else { return true; } } //重寫相機許可權 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { //標記 case camera_permission: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 許可 } else { // 許可權被拒絕 Toast.makeText(CameraActivity.this, "你禁用了相機許可權", Toast.LENGTH_SHORT).show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
//圖片的一個輸出路徑 private Uri imageUri; //圖片地址 private File outputImage; //圖片存放的資料夾地址 private File file;
//照相 private void photoGraph() { //建一個資料夾,儲存圖片的路徑 file = new File(Environment.getExternalStorageDirectory(),"/DCIM/"); if (!file.exists()){ file.mkdir(); } /** * 這裡將時間作為不同照片的名稱 */ outputImage=new File(file,System.currentTimeMillis()+".PNG"); /** * 如果該檔案已經存在,則刪除它,否則建立一個 */ try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (Exception e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24) { imageUri = FileProvider.getUriForFile(this,"com.android.ted.gank.fileprovider", outputImage); } else { imageUri = Uri.fromFile(outputImage); } //呼叫系統相機 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.addCategory(Intent.CATEGORY_DEFAULT); //設定圖片輸出地址 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //作一個標記,在重寫onActivityResult()方法中呼叫 startActivityForResult(intent, CAMERA_REQUEST_CODE); }3、選擇手機中的照片
// 相簿選擇標記 private static final int PHOTO_REQUEST_GALLERY = 3;
//選擇手機中的照片 private void selectPicture(){ //開啟資源庫 Intent intentSel = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intentSel, PHOTO_REQUEST_GALLERY); //PHOT_REQUEST_GALLERY標記,重寫onActivityResult()呼叫 }4、圖片剪下
//圖片剪下標記 private static final int PHOTO_REQUEST_CUT = 2;
//圖片剪下 private void setCrop(Uri imageUri){ //裁剪介面 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // 設定裁剪 intent.putExtra("crop", "true"); // aspectX , aspectY :寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // 裁剪後輸出圖片的尺寸大小 intent.putExtra("outputImageX", 80); intent.putExtra("outputImageY", 80); // intent.putExtra("outputImageFormat", "JPEG");// 圖片格式 // intent.putExtra("noFaceDetection", true);// 取消人臉識別 intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); // 圖片剪下標記,重寫onActivityResult()中呼叫,PHOTO_REQUEST_CUT值根據自己喜好設定startActivityForResult(intent, PHOTO_REQUEST_CUT); }5、重寫onActivityResult()方法
//注意:在使用時,一定要判斷data資料是否為空,否則會出現各種找不到或者無法選取圖片錯誤。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAMERA_REQUEST_CODE: //照相標記,並剪下圖片 //此處如果不作判斷,將會出現如果不點選照相,直接返回時,會生成一個空檔案。 if (resultCode == Activity.RESULT_OK){ //通過intent,將照片儲存到手機中 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(imageUri); this.sendBroadcast(intent); setCrop(imageUri); } break; case PHOTO_REQUEST_CUT: //圖片剪下標記,並顯示圖片 if (data != null){ showPicture(imageUri); } break; case PHOTO_REQUEST_GALLERY: //相簿獲取標記,並剪下圖片 if (data != null){ imageUri = data.getData(); setCrop(imageUri); } break; } super.onActivityResult(requestCode, resultCode, data); }
6、佈局初始化和點選事件
private ImageView heardImage; private Button system_picture; private Button take_photo;@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.camera_activity); init(); } private void init(){ cameraPermissions(this); heardImage= findViewById(R.id.heardImage); system_picture = findViewById(R.id.system_picture); system_picture.setOnClickListener(this); take_photo = findViewById(R.id.take_photo); take_photo.setOnClickListener(this); }
@Override public void onClick(View view) { switch (view.getId()){ case R.id.take_photo: photoGraph(); break; case R.id.system_picture: selectPicture(); break; } }7、佈局介面
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/heardImage" android:src="@mipmap/ic_launcher" android:layout_centerInParent="true" android:layout_width="200px" android:layout_height="200px" /> <Button android:id="@+id/system_picture" android:text="系統照片" android:layout_width="100dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:id="@+id/take_photo" android:text="點選照相" android:layout_width="100dp" android:layout_height="50dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> </RelativeLayout>