第一次写博客,就是把这几天项目中遇到的问题记录一下(写的不好 请多指教)
下面就是调用相机的代码:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("照片获取方式");
String[] choices = {"拍照", "相册"};
builder.setSingleChoiceItems(choices, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {//选择的是拍照
System.out.println("选择的是拍照");
//这里调用相机的时候 我指定了相机拍照后的路径 防止某些手机找不到路径
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
//根据当前时间生成图片的名称
String timestamp = "/" + formatter.format(new Date()) + ".jpg";
File imageFile = new File(mImageFilePath, timestamp);// 通过路径创建保存文件
mImagePath = imageFile.getAbsolutePath();
Uri imageFileUri = Uri.fromFile(imageFile);// 获取文件的Uri
Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);
// 启动相机
startActivityForResult(intent1, REQUEST_THUMBNAIL);
} else {
System.out.println("选择的是相册");
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_PIC);
}
dialog.dismiss();
}
});
builder.show();
///onActivityResult 中获取结果
@Override public void onActivityResult(int requestCode, int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); //获取相册图片 if (requestCode == REQUEST_PIC && resultCode == Activity.RESULT_OK && data != null) { new Thread(new Runnable() { @Override public void run() { try { Uri selectedImage = data.getData(); String[] filePathColumns = {MediaStore.Images.Media.DATA}; Cursor c = context.getContentResolver().query(selectedImage, filePathColumns, null, null, null); c.moveToFirst(); int columnIndex = c.getColumnIndex(filePathColumns[0]); mImagePath = c.getString(columnIndex); setimg(); c.close(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } else if (requestCode == REQUEST_THUMBNAIL && resultCode == Activity.RESULT_OK) { //获取拍照 /** * 通过这种方法取出的拍摄会默认压缩,因为如果相机的像素比较高拍摄出来的图会比较高清, * 如果图太大会造成内存溢出(OOM),因此此种方法会默认给图片尽心压缩 */ new Thread(new Runnable() { @Override public void run() { try { setimg(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } /** * 设置图片 bitmap转换。。。等等 * @throws IOException */ private void setimg() throws IOException { System.out.println("图片地址:" + mImagePath); // //加载一个图片到内存 显示到imageview的控件上. // BitmapFactory.Options opts = new BitmapFactory.Options();//创建一个选项条件 // opts.inSampleSize = 40;//设置采样率,宽高分别是原图的1/4,总像素个数就变成原图的1/16 // mBm = BitmapFactory.decodeFile(mImagePath);
//将图片压缩到内存bitmap mBm=compressImageFromFile(mImagePath); // File file = new File(mImagePath); //将压缩后的bitmap转file (文件压缩) String path = mImageFilePath+"/"+ PrefUtils.getString(context,"parkingLotId",null)+"/"; File dirFile = new File(path); if(!dirFile.exists()){ dirFile.mkdir(); } final File myCaptureFile = new File(path +mString+".jpg"); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); mBm.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close();
//这段代码可以不看 我项目中用到的 CommonUtils.runOnUIThread(new Runnable() { @Override public void run() { saveimg(mType,myCaptureFile); } }); } /** * 对Bitmap形式的图片进行压缩, 也就是通过设置采样率, * 减少Bitmap的像素, 从而减少了它所占用的内存 * @param srcPath * @return */ private Bitmap compressImageFromFile(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = true;//只读边,不读内容 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; float hh = 800f;// float ww = 480f;// int be = 1; if (w > h && w > ww) { be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) { be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;//设置采样率 newOpts.inPreferredConfig = Bitmap.Config.ARGB_8888;//该模式是默认的,可不设 newOpts.inPurgeable = true;// 同时设置才会有效 newOpts.inInputShareable = true;//。当系统内存不够时候图片自动被回收 bitmap = BitmapFactory.decodeFile(srcPath, newOpts); // return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩 //其实是无效的,大家尽管尝试 return bitmap; }