最近在Android上作了拍照功能的开发。android
业务场景是:点击界面(HTML5)上的拍照按钮会调用拍照的JS API,获取其返回照片文件的存储路径、扩展名以及照片文件的Base64字符串,而后在界面上显示图片。安全
开发时一些要点记录以下:ide
一、关于存储:虽然如今大部分手机的存储都是有的,安全起见,须要判断一下存储的状态。post
String SDState = Environment.getExternalStorageState();
if (SDState.equals(Environment.MEDIA_MOUNTED)) {
//TODO...
} else {
error("该终端没有存储设备,不能使用拍照功能...");
}
二、如何将拍摄到的照片保存到存储中,而不仅是生成一份缩略图数据返回。this
须要在Intent中预先指定照片文件的存储Uri。.net
private static final int ACTION_TAKE_PHOTO = 1;
private Uri photoUri;
/***
* 须要说明一下,如下操做使用照相机拍照,拍照后的图片会存放在相册中的
* 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图
* 若是不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰
*/
ContentValues values = new ContentValues();
photoUri = this.context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, ACTION_TAKE_PHOTO);
三、如何获取图片的存储路径,以字符串的形式返回:code
private Uri photoUri;
private String photoPath;
String[] pojo = {MediaStore.Images.Media.DATA};
cursor = this.context.managedQuery(photoUri, pojo, null, null,null);
if (null != cursor) {
int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
cursor.moveToFirst();
photoPath = cursor.getString(columnIndex);
}
路径获取到了,扩展名固然不在话下了。orm
四、如何从Uri获取到图片的Bitmap对象:对象
private Uri photoUri;
byte[] photoContent = readStream(this.context.getContentResolver().openInputStream(Uri.parse(photoUri.toString())));
Bitmap photoBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
五、如何对Bitmap进行压缩,例如压缩到原有大小的四分之一:图片
/**
* 缩小返回图片的尺寸
* @param bitmap
* @return
*/
private Bitmap resizeBitmap(Bitmap bitmap) {
Bitmap bitmapOrigin = bitmap;
int widthOrigin = bitmapOrigin.getWidth();
int heightOrigin = bitmapOrigin.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(0.25f, 0.25f);
Bitmap bitmapResized = Bitmap.createBitmap(bitmapOrigin, 0, 0, widthOrigin, heightOrigin, matrix, true);
return bitmapResized;
}
六、如何将Bitmap转为Base64字符串:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmapResized.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
baos.close();
return new String(Base64.encodeBase64(data), "utf-8");
七、如何在HTML页面上显示Base64数据格式的图片:
首先界面上要有一个img标记,src属性置为空。
<img src="" id="resultImage" name="resultImage" title="结果图片"/>
而后用js将获取到Base64图片数据放置到img标记的src属性中。
var extension = ...;//图片扩展名
var base64 = ...;//Base64数据
$("#resultImage").attr("src", "data:image/" + extension + ";base64," + base64.toString());
欢迎指正。