1.这里主要对拍照后的照片处理,拍照后的照片会传到远程服务器存储起来,但原始照片太大
需要缩小一些.首先拍照:
public void openCamera(Activity activity) {
//獲取系統版本
int currentapiVersion = android.os.Build.VERSION.SdK_INT;
// 激活相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyy_MM_dd_HH_mm_ss");
String filename = timeStampFormat.format(new Date());
tempFile = new File(Environment.getExternalStorageDirectory(),
filename ".jpg");
if (currentapiVersion < 24) {
// 从文件中创建uri
imageUri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
} else {
//兼容android7.0 使用共享文件的形式
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
//检查是否有存储权限,以免崩溃
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
Toast.makeText(this,"请开启存储权限",Toast.LENGTH_SHORT).show();
return;
}
imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
}
}
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
}
2.以上是拍照代码,用到的中间代码
/*
* 判断sdcard是否被挂载
*/
public static boolean hasSdcard() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
3.然后拍照以后,对获取到的bitmap照片进行缩放:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PHOTO_REQUEST_CAREMA:
if (resultCode == RESULT_OK) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
try {
//1.这里获取bitmap,相机拍摄的照片
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageUri));
Matrix matrix = new Matrix();
//2.然后这里判断系统的版本,这里如果是29,说明是android10,那么就用0.2的压缩比,原始大小
//30m,能压缩到200k左右
Integer sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);
if(sdkVersion.equals(29)){ //android10 的时候用 0.2 压缩到200k左右
matrix.setScale(0.20f, 0.20f);
}else if(sdkVersion.equals(30)){//android11的时候用0.8
//3.如果是android11,那么原始大小1m,压缩比0.9能压缩到200k左右
matrix.setScale(0.90f, 0.90f);
}else{//其余版本用这个
//4.其余的android版本,用0.8的压缩比,能压缩到100多k,这样基本是可以满足,人脸识别等应用了.
matrix.setScale(0.80f, 0.80f);
}
//5.压缩后的照片
Bitmap bitScaleMap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
//6.压缩后的照片可以打印大小看看.
Log.i("wechat", "压缩后图片的大小" (bitmap.getByteCount() / 1024 / 1024)
"M宽度为" bitmap.getWidth() "高度为" bitmap.getHeight());
//7.压缩后的bitmap可以保存,这里会有另一个博文说保存这块.
tempzmFile = BitmapBaiDuUtils.saveImageReturnAndFile(bitScaleMap,getApplicationContext());
//tempzmFile = BitmapBaiDuUtils.saveImageReturnFile(bitmap);
picture.setImageBitmap(bitScaleMap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
,