Android呼叫系統相機,相容7.0系統

weixin_34302798發表於2017-09-26

在開始之前,先做好準備工作,也就是許可權問題,6.0、7.0的許可權系統可以參考我的一篇部落格:

傳送門:https://my.oschina.net/u/1462828/blog/865749

 

系統相機好像是5.0之後有一個大修過,7.0又有一個大修過,具體是不是這樣也不太記得了是具體哪個版本了,只是記得以前是直接呼叫相機,然後拿返回的圖片值,再然後一個版本是設定好圖片的存放路徑才開始呼叫,現在最新的版本也是這樣。原始的版本就不相容了,現在是以24作為分界線,話不多說,上程式碼:

private File sdcardTempFile = null;//用於臨時存放照片的地址

    /**
     * 啟動相機
     */
    public void openCamera() {
        int systemVersion = android.os.Build.VERSION.SDK_INT;
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        sdcardTempFile = new File(<你設定的臨時目錄> + ".jpg");
        Uri imageUri;
        if (systemVersion < 24) {
            imageUri = Uri.fromFile(sdcardTempFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        } else {
            //相容android7.0 使用共享檔案的形式
            ContentValues contentValues = new ContentValues(1);
            contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());
            imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        }
        startActivityForResult(intent, CameraHelper.CAMERA_OPEN_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CameraHelper.CAMERA_OPEN_CODE && resultCode == RESULT_OK) {
            blackPhoto(sdcardTempFile.getPath());//拍照完成之後,這個sdcardTempFile.getPath()就是圖片的地址
        }
    }

 

呼叫的話這麼就算呼叫成功了,我個人的話,並不是很喜歡在onActivityResult中處理圖片和接值,所以我更傾向於是新建一個Activity,然後建立一個靜態介面,啟動這個Activity的時候也將回撥介面傳過去,然後自動呼叫相機或者相簿,等選中圖片或者拍照之後,由這個Activity的onActivityResult方法中負責接收處理,然後再通過回撥介面將值傳回去。並且將照相機的許可權請求操作放到這個Activity裡面,那麼使用的時候,就比較方便了。

因為我這裡是自己寫的相簿+拍照,所以程式碼全部貼出來的話也不太合適,所以還是隻貼部分關鍵程式碼出來吧:


    /**
     * 回撥介面
     */
    private static OnStringListener onStringListener;

   /**
     * 啟動本頁面
     * @param activity
     * @param listener 圖片回撥
     */
    public static void startActivity(Activity activity, OnStringListener listener) {
        onStringListener = listener;
        activity.startActivity(new Intent(activity, AlbumActivity.class));
    }

    //呼叫步驟,1、onCreate方法  2、自動請求許可權  3、請求許可權通過之後,呼叫下面的openCamera開啟系統相機 4、通過onStringListener介面將圖片地址回撥回去

    private File sdcardTempFile = null;//用於臨時存放照片的地址

    /**
     * 啟動相機
     */
    public void openCamera() {
        int systemVersion = android.os.Build.VERSION.SDK_INT;
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        sdcardTempFile = new File(ConfigCache.getCacheImagePath() + ".jpg");
        Uri imageUri;
        if (systemVersion < 24) {
            imageUri = Uri.fromFile(sdcardTempFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        } else {
            //相容android7.0 使用共享檔案的形式
            ContentValues contentValues = new ContentValues(1);
            contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());
            imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        }
        startActivityForResult(intent, CameraHelper.CAMERA_OPEN_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CameraHelper.CAMERA_OPEN_CODE && resultCode == RESULT_OK) {
            blackPhoto(sdcardTempFile.getPath());//拍照完成之後,這個sdcardTempFile.getPath()就是圖片的地址
        }
    }


    /**
     * 照片選好之後回撥
     *
     * @param path
     */
    public void blackPhoto(String path) {
        if (onStringListener != null) {
            onStringListener.onClick(path);
        }
        super.finish();
    }

    /**
     * 非選中圖片的關閉Activity操作,都是取消
     */
    public void finish() {
        onStringListener.onClick(null);
        super.finish();
    }

    /**
 * 回撥一個字串
 * Created by 她叫我小渝 on 2016/11/1.
 */

public interface OnStringListener {
    void onClick(String str);
}

最後看一下呼叫的程式碼,就很簡單了:

AlbumActivity.startActivity(getActivity(), new OnStringListener() {
                    @Override
                    public void onClick(String str) {
                        if(str!=null){
                            //選好圖片
                            sceneCreateActivity.onAlbumSuccess(str);
                        }else{
                            //取消選擇
                        }
                    }
                });

 

轉載於:https://my.oschina.net/u/1462828/blog/1543532

相關文章