1. 程式人生 > >【拍照截圖】Android 系統拍照和截圖

【拍照截圖】Android 系統拍照和截圖

tjstudy:寫在前面:
android 6.0 許可權未處理,這裡只是對拍照和截圖的過程進行了知識的清理總結。
android6.0 許可權處理,可跳轉到:
大力哥的,http://download.csdn.net/detail/qq137722697/9602707
執行時,請求所有需要的6.0的許可權,檔案中直接有使用方法。

1、呼叫系統拍照

這裡寫圖片描述

        //1、圖片儲存路徑
        String path = Environment.getExternalStorageDirectory().getPath();
        file = new File(path, "/temp.jpg"
); imageUri = Uri.fromFile(file); //.....2、在點選事件中開啟拍照意圖 //呼叫系統相機進行拍照 用系統的東西 隱式意圖 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //指定呼叫相機拍照後的照片儲存路徑 //3、onActivityResult()方法裡面進行拍照成功與否的判斷並進行處理 switch
(requestCode) { case CAMERA_OK: if (resultCode == RESULT_OK) { showMess("拍照成功"); //顯示拍照的照片 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); ivGlobal.setImageBitmap(bitmap); } else
{ showMess("拍照失敗"); } break; }

2、呼叫系統截圖

這裡寫圖片描述

        //1、圖片儲存路徑
        String path = Environment.getExternalStorageDirectory().getPath();
        file = new File(path, "/temp.jpg");
        imageUri = Uri.fromFile(file);

        //.....2、在點選事件中開啟截圖意圖
        //呼叫系統功能進行截圖  用系統的東西  隱式意圖
       Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(imageUri, "image/*");
        // 下面這個crop = true是設定在開啟的Intent中設定顯示的VIEW可裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是寬高的比例,這裡設定的是正方形(長寬比為1:1)
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪圖片寬高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", false);//設定之後 onActivityResult 中data 就為null了
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//設定裁剪之後的圖片儲存位置
        startActivityForResult(intent, CUT_OK);

        //3、onActivityResult()方法裡面進行拍照成功與否的判斷並進行處理
         switch (requestCode) {
            case CUT_OK:
                if (resultCode == RESULT_OK) {
                    showMess("裁剪成功");
                    try {
                        //將裁剪好的圖片顯示到介面上
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        ivGlobal.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {
                    showMess("裁剪失敗");
                }
                break;
          }

拍照成功,然後截圖失敗了。。。
測試手機:sonyE6886(6.0許可權已經處理)
測試情況:情況1,拍照成功,但是截圖失敗。情況2,單純的使用已有圖片進行截圖,失敗,並且導致原圖為0byte,不可見。
失敗原因:截圖過程中,源圖Uri和裁剪後的結果圖Uri位置衝突
解決方案:使用不同的Uri

3、個人理解記錄

拍照和截圖,都是通過隱式意圖來開啟系統介面,拍照需要設定圖片的儲存路徑,截圖則需要設定圖片的原始檔和截圖之後圖片的儲存路徑,這裡設定的都是URI。
系統的拍照和截圖是兩個系統功能,拍照之後想要截圖,可以在確定以及能夠拍照成功的基礎上再次呼叫系統的截圖功能(在onActivity裡面進行拍照成功與否的判斷)。

4、呼叫系統拍照並且截圖

在拍照成功的時候,進行截圖。

    //重要程式碼和上面一致
    switch (requestCode) {
            case CAMERA_OK:
                if (resultCode == RESULT_OK) {
                    showMess("拍照成功");
                    clipPhoto();//開啟截圖
                } else {
                    showMess("拍照失敗");
                }
                break;
            case CUT_OK:
                if (resultCode == RESULT_OK) {
                    showMess("裁剪成功");
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        ivGlobal.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {
                    showMess("裁剪失敗");
                }
                break;
        }