1. 程式人生 > >菜鳥筆記2、Android6.0版本,關於呼叫系統相機的使用和圖片儲存

菜鳥筆記2、Android6.0版本,關於呼叫系統相機的使用和圖片儲存

這兩天寫了一下相機的使用,看了網上很多文章,不是很全的,在我自己弄出來之後,做了一個整理歸納。我用的是Android6.0真機測試,華為手機。

1、Android6.0以上,在呼叫相機許可權時,必須要動態註冊。 驗證許可權+重寫許可權

//相機許可權標記,camera_permission為標記,根據你自己的標記喜好設定
private static final int camera_permission = 4;
/*
* 驗證相機許可權*
*/
public static boolean cameraPermissions(Activity activity){
if (Build.VERSION
.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); } }
2、呼叫系統相機照相  
//圖片的一個輸出路徑
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>