1、使用相机拍照默认情况下调用相机的方式:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_REQUEST_CODE);//CAMERA_REQUEST_CODE=1一个int表示请求码
在onActivityResult中获取返回的图片:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i("test=suc", "onActivityResult");
if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap bitmap = (Bitmap) bundle.get("data");
if (bitmap != null) {
mImageView.setImageBitmap(bitmap);
//保存Bitmap图片到图库,文件的保存函数我就不写了
}
}
}
}
你会发现无论是mImageView显示出来的图片,还是自己保存到指定文件夹的图片都横小。那是因为这种方式默认压缩了图片,像素大概188*256大小。
于是我们换一个思路,默认是先从data中获取bitmap(被压缩了),再保存bitmap到本地。我们改为改为先保存到本地(没有压缩),然后从本地读取图片显示,就能显示大图了。
从两种方法的比较看,可以找到被压缩的原因,如果直接返回bitmap,图片太大会影响程序效率,默认就压缩了。如果保存到本地,本地有足够存储空间,系统就没压缩图片。
2、调用相机时候指定保存地址:
private void takePhoto() {
//获取权限
getPermission();
//获取保存位置
createFile();
mImageName = "" + System.currentTimeMillis() + ".jpg";
Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mImagePath + mImageName)));
startActivityForResult(it, REQUEST_TAKEPHOTO_CODE2);
}
其中getPermission(); 是为了动态获取相机权限,android6.0以上需要动态获取,函数代码继续往下看,
createFile();是为了为保存的图片指定保存位置,函数代码在后面,
mImagePath, mImageName, 分别表示文件路径和名字,为String类型的全局变量
REQUEST_TAKEPHOTO_CODE2, 是一个int类型的请求标识。
函数代码如下:com.zhengyuan.learningtakephoto是自己项目的包名
private void getPermission() {
PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.CAMERA", "com.zhengyuan.learningtakephoto"));
if (!permission) {
//没有权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, 15);
}
}
permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_EXTERNAL_STORAGE", "com.zhengyuan.learningtakephoto"));
if (!permission) {
//没有权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 15);
}
}
permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.zhengyuan.learningtakephoto"));
if (!permission) {
//没有权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 15);
}
}
}
/**
* 创建保存图片的文件夹
*/
public void createFile() {
mImagePath = Environment.getExternalStorageDirectory() + "/mypp/";//指定保存路径
File f = new File(mImagePath);
if (!f.exists()) {
f.mkdir();
}
}
拍照完成后再onActivityResult显示保存到本地的图片:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
else if (requestCode == REQUEST_TAKEPHOTO_CODE2&& data != null) {
try {
Bitmap bm = BitmapFactory.decodeFile(mImagePath + mImageName);
Bitmap take = ResizeBitmap(bm, 640);
mImageView2.setImageBitmap(take);
bm.recycle();//太大记得回收
//处理完记得回收take
//take.recycle();
} catch (Exception e) {
}
}
}
上面变量中有两个bitmap,bm是直接从本地读取的,太大,为了适应手机显示,压缩成take显示。压缩函数如下:
public static Bitmap ResizeBitmap(Bitmap bitmap, int newWidth) {//拍照的图片太大,设置格式大小
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float temp = ((float) height) / ((float) width);
int newHeight = (int) ((newWidth) * temp);
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// matrix.postRotate(45);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
bitmap.recycle();
return resizedBitmap;
}