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