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