android调用系统相机的方法,并且解决三星手机遇到的问题
2014-10-16 20:27
621 查看
整理android调用系统相机的方法及遇到的问题
在项目中遇到需要调用系统相机的功能点,整理方法如下1.拍照完成之后直接存图片
[java] view
plaincopy
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面.
intent.putExtra("aspectX", 5); // 这两项为裁剪框的比例.
intent.putExtra("aspectY", 4);
intent.putExtra("output", Uri.fromFile(new File("SDCard/1.jpg")));//输出地址
intent.putExtra("outputFormat", "JPEG");//返回格式
startActivityForResult(intent, REQUEST_CAMERA);
获取图片直接在onActivityForResult中
[java] view
plaincopy
BitmapFactory.decodeFile(fileName, opts);
2.拍照完成后读取intent中的数据,在onActivityForResult中
[java] view
plaincopy
Uri uri = data.getData();
ContentResolver cr = this.getContentResolver();
try {
bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
但是这种方法在测试过程中,海信手机会报空指针异常,也许是相机处理机制的问题,我没有深究
3.最后一种是当前项目正用到的方法 目前在各种手机上使用正常
[java] view
plaincopy
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
LogUtils.i("TestFile",
"SD card is not avaiable/writeable right now.");
return;
}
String name = new DateFormat().format(
"yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA))
+ ".jpg";
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");//
LogUtils.d(CommitCommentActivity.this,
bitmap == null ? "bitmap is null"
: "bitmap is not null");
FileOutputStream fos = null;
File file = new File(IMAGE_PATH);
file.mkdirs();// 创建文件夹
final String fileName = IMAGE_PATH + name;
LogUtils.i("fangdd", "Onresult path:" + fileName);
try {
fos = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (!bitmap.isRecycled()) {
bitmap.recycle();
System.gc();
}
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这种方式是将图片资源取出之后存入文件,并不在activity中直接保存bitmap 仅在用到时加载 避免内存溢出
下面记录一下开发中遇到的问题,说道这里不得不吐槽一下三星的相机,调用之后系统会调用ondestroy导致activity被销毁重建,原因是系统调用了一次横竖屏切换,解决方法如下
方法一:刚开始调用了onSaveInstanceState(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)这个方法来实现,虽然方法比较笨,但是可以通过在onSaveInstanceState中保存一些你需要的变量,在onCreate()方法中判断savedInstanceState是否为null,不为null则调用onRestoreInstanceState()方法取出之前存的变量来使用,这相当于重新加载了一边当前activity。
方法二:上面的方法可行,但并不是解决问题的根本办法,后来通过查看发现在调用相机时,activity从竖屏切换到了横屏,在横竖屏切换导致了activity重新装载,找到根本原因后,在activity中通过android:configChanges="orientation|keyboardHidden" 这个属性,可以约束调用相机时,保持当前activity竖屏状态不变,从而解决了activity重新加载的问题。
另外关于图片压缩的代码也一并贴在这里以便以后查看
[java] view
plaincopy
private Bitmap getDiskBitmap(String pathString) {
Bitmap bitmap = null;
Bitmap bMapRotate = null;
try {
File file = new File(pathString);
if (file.exists()) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inTempStorage = new byte[1024 * 1024 * 10];
long length = file.length();
LogUtils.d(this, "file.length() = " + length);
if (length / (1024 * 1024) > 4) {
opt.inSampleSize = 16;
LogUtils.d(this, "opt.inSampleSize = 16;");
} else if (length / (1024 * 1024) >= 1) {
opt.inSampleSize = 8;
LogUtils.d(this, "opt.inSampleSize = 8;");
} else if (length / (1024 * 512) >= 1) {
opt.inSampleSize = 4;
LogUtils.d(this, "opt.inSampleSize = 4;");
} else if (length / (1024 * 256) >= 1) {
opt.inSampleSize = 2;
LogUtils.d(this, "opt.inSampleSize = 2;");
} else {
opt.inSampleSize = 1;
LogUtils.d(this, "opt.inSampleSize = 1;");
}
bitmap = BitmapFactory.decodeFile(pathString, opt);
LogUtils.i("fangdd", "图片旋转度数:" + readPictureDegree(pathString));
// ///////////
// if(pathString.contains("floor/imgs")){
// YLog.i("fangdd", "处理旋转:"+isGetImage);
int orientation = readPictureDegree(pathString);
/*
* if(bitmap.getHeight() < bitmap.getWidth()){ orientation = 90;
* } else { orientation = 0; }
*/
if (orientation != 0) {
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
bMapRotate = Bitmap
.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
} else {
bMapRotate = Bitmap.createScaledBitmap(bitmap,
bitmap.getWidth(), bitmap.getHeight(), true);
}
// }
// //////////////
}
} catch (Exception e) {
e.printStackTrace();
}
if (bMapRotate != null) {
return bMapRotate;
}
return bitmap;
}
/**
* 读取图片属性:旋转的角度
*
* @param path
* 图片绝对路径
* @return degree旋转的角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
相关文章推荐
- android调用系统相机的方法,并且解决三星手机遇到的问题,图片旋转、压缩
- Android 调用系统相机拍照并且显示在相册中,以及中间可能会遇到的一些问题的解决
- 整理android调用系统相机的方法及遇到的问题
- 整理android调用系统相机的方法及遇到的问题
- 整理android调用系统相机的方法及遇到的问题
- android 调用系统相机方法,解决CPU兼容问题
- android 调用系统相机或者系统相册功能时,onActivityResult方法不执行问题的解决过程
- 解决Android7.0系统 调用系统相机、系统播放器播放视频、切图兼容问题,报异常android.os.FileUriExposedException
- Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法
- android 调用系统相机,预置路径,解决小米等机型uri返回为null的问题
- android 调用系统相机,预置路径,解决小米等机型uri返回为null的问题
- android调用系统相机和相册进行拍照裁剪处理,解决不同安卓版本存在无法加载相册的问题,处理了是否有sd卡的存在的情况
- 解决Android7.0系统 调用系统相机、系统播放器播放视频、切图兼容问题,报异常android.os.FileUriExposedException
- android调用系统相机(通用,完美解决4.0以后版本以及机型的问题)
- 解决android调用系统相机拍照保存时onActivityResult中data为null的问题
- android apk包在android 2.3以下系统上安装时遇到的INSTALL_FAILED_DEXOPT和LinearAlloc exceeded capacity问题解决方法
- Android调用Camera API拍照遇到的问题和解决方法
- Android中调用系统摄像并且保存到指定位置的一些问题&Uri转文件路径方法
- Android环境下接收系统灭屏广播遇到延时问题的一个解决方法
- Android NFS文件系统挂载遇到的问题解决方法