我们再做项目的时候,很多地方,都遇到过需要打开手机相册进行拍照,然后将照片上传到服务器。那么下面我就把我项目中打开相机拍照的功能和大家分享一下。
方法一:
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;
我们可以通过以上两种方法来获取到拍照后,照片的路径。