android打開手機相機拍照 並獲取圖片真實路徑

       我們再做項目的時候,很多地方,都遇到過需要打開手機相冊進行拍照,然後將照片上傳到服務器。那麼下面我就把我項目中打開相機拍照的功能和大家分享一下。

方法一:

1:打開相機

/**
 * 調用相機拍照
 */
private void openCamera() {
    /**拍照申請權限**/
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Constant.APPLYFOR_CAMERA_JURISDICTION);
    } else {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        /** 啓動相機*/
        startActivityForResult(intent, Constant.REQUEST_THUMBNAIL);

    }
}

2:在onActivityResult 方法中,獲取到data。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case Constant.REQUEST_THUMBNAIL:
                /**
                 * 通過這種方法取出的拍攝會默認壓縮,因爲如果相機的像素比較高拍攝出來的圖會比較高清,
                 * 如果圖太大會造成內存溢出(OOM),因此此種方法會默認給圖片盡心壓縮
                 */
            String takePhotoPath = Utils.getTakePhotoPath(data);
                break;
        }
}

3:獲取到真實路徑

/***
 * 獲取拍照後的路徑
 * @param data
 * @return
 */
public static String getTakePhotoPath(Intent data) {
    Bitmap photo = null;
    Uri uri = data.getData();
    if (uri != null) {
        photo = BitmapFactory.decodeFile(uri.getPath());
    }
    if (photo == null) {
        Bundle bundle = data.getExtras();
        if (bundle != null) {
            photo = (Bitmap) bundle.get("data");
        } else {

            return "";
        }
    }

    FileOutputStream fileOutputStream = null;
    try {
        // 獲取 SD 卡根目錄
        String saveDir = Environment.getExternalStorageDirectory() + "/fiberstore_photos";
        // 新建目錄
        File dir = new File(saveDir);
        if (!dir.exists()) dir.mkdir();
        // 生成文件名
        SimpleDateFormat t = new SimpleDateFormat("xiebin");
        String filename = "MT" + (t.format(new Date())) + ".jpg";
        /**新建文件*/
        File file = new File(saveDir, filename);
        /***打開文件輸出流*/
        fileOutputStream = new FileOutputStream(file);
        // 生成圖片文件
        /**
         * 對應Bitmap的compress(Bitmap.CompressFormat format, int quality, OutputStream stream)方法中第一個參數。
         * CompressFormat類是個枚舉,有三個取值:JPEG、PNG和WEBP。其中,
         * PNG是無損格式(忽略質量設置),會導致方法中的第二個參數壓縮質量失效,
         * JPEG不解釋,
         * 而WEBP格式是Google新推出的,據官方資料稱“在質量相同的情況下,WEBP格式圖像的體積要比JPEG格式圖像小40%。
         */
        photo.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        /***相片的完整路徑*/
        return file.getPath();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileOutputStream != null) {
            try {
                fileOutputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return "";
}

 

方法二:

1:打開相機

private void openCamera() {
    /**拍照申請權限**/
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Constant.APPLYFOR_CAMERA_JURISDICTION);
    } else {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        File file = new File(Environment.getExternalStorageDirectory() + "/Images");
        if (!file.exists()) {
            file.getParentFile().mkdirs();
        }
        savePath = Environment.getExternalStorageDirectory() + "/Images/" + "fiberStore" +      String.valueOf(System.currentTimeMillis()) + ".jpg";
        Uri mUri = FileProvider.getUriForFile( this, getPackageName() + ".fileprovider",new File(savePath));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
        /** 啓動相機*/
        startActivityForResult(intent, Constant.REQUEST_THUMBNAIL);
    }
}

 

2:在onActivity

case Constant.REQUEST_THUMBNAIL:
    try {
        //圖片壓縮 不然會很大
        File file1 = new File(savePath);
        File file = new Compressor(this).compressToFile(file1);
        //圖片真實路徑
        String path = file.getPath();
    } catch (IOException e) {
        e.printStackTrace();
    }
    break;

 

我們可以通過以上兩種方法來獲取到拍照後,照片的路徑。

1:先拍照,然後再onActivityResult 方法中,通過data獲取到url,然後再將圖片保存到SD卡中,然後獲取到真實路徑。

2:在打卡相機的時候,創建一個文件,來存放圖片,拍照後,在onActivityResult中獲取到圖片圖片的真實路徑。

需要注意的就是,第一種方法,data不是空的。第二種方法data是空的哦。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章