跳转Activity,调用系统照相机软件拍照获取照片:
<span > </span>Intent intent_gocamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
<span > </span>/* 使用当前时间作为新拍的照片的文件名 */
<span > </span>Calendar c = Calendar.getInstance();<span > </span>// 获取当前时间状态
<span > </span>String currentDate = c.get(Calendar.YEAR) + ""
<span > </span>+ (c.get(Calendar.MINUTE) + 1) + ""
<span > </span>+ c.get(Calendar.DAY_OF_MONTH) + ""
<span > </span>+ c.get(Calendar.HOUR_OF_DAY) + "" + c.get(Calendar.MINUTE)
<span > </span>+ "" + c.get(Calendar.SECOND);
<span > </span>catchPicName_camera = "WD" + currentDate + ".jpg"; // 拍照保存的图片以.jpg为后缀名
<span > </span>File filedir = new File(SettingsUtilsTools.getSDPath()+catchPicStoreDir);
<span > </span>if(!filedir.exists()) {
<span > </span>filedir.mkdirs();
<span > </span>}
<span > </span>File file_catchPic = new File(getSDPath()+catchPicStoreDir, catchPicName_camera);<span > </span>// 使用<span style="font-family: Arial, Helvetica, sans-serif;">catchPicStoreDir为文件夹名,如“/myimages/”</span>
<span > </span>Uri uri = Uri.fromFile(file_catchPic);
//<span > </span>intent01.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
<span > </span>intent_gocamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);<span > </span>// 通知照相机将拍照所得的照片存储在该 uri中,若不将拍照的结果存储,则在结果中获取到的回事缩略图
<span > </span>
<span > </span>startActivityForResult(intent_gocamera, CASE_CAMERA);
跳转Activity,调用系统的图库浏览器选择图片:
<span > </span>/* 从图库中选择图片 */
Intent intent02 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// ACTION_OPEN_DOCUMENT
startActivityForResult(intent02, SELECT_PIC);<span > </span>// SELECT_PIC的值为启动有返回值的Activity所需的requestCode,可任意自定义数值
在onActivityResult方法中获取返回的图片数据,并将图片传递到另一个Activity中:
<span > </span>Intent intent_godispose = new Intent("com.go.action.PICHANDLE");
<span > </span>
<span > </span>switch (requestCode) {
<span > </span>case SELECT_PIC:
<span > </span>Uri uri_pic_back_photo = data.getData();
<span > </span>try {
<span > </span>Bitmap bitmap01 = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri_pic_back_photo);
<span > </span>
<span > </span>String[] proj = {MediaStore.Images.Media.DATA};
<span > </span>// 好像是android多媒体数据库的封装接口,具体的看Android文档
<span > </span>Cursor cursor = managedQuery(uri_pic_back_photo, proj, null, null, null);
<span > </span>// 按我个人理解 这个是获得用户选择的图片的索引值
<span > </span>int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
<span > </span>// 将光标移至开头 ,这个很重要,不小心很容易引起越界
<span > </span>cursor.moveToFirst();
<span > </span>// 最后根据索引值获取图片路径
<span > </span>String path = cursor.getString(column_index);
<span > </span>String[] pic_ = path.split("/");
<span > </span>String pic_name = pic_[pic_.length-1];
<span > </span>Log.e("==>> TAG <<==", path);
<span > </span>
<span > </span>intent_godispose.putExtra(TAG_PICPATH, path);
<span > </span>startActivity(intent_godispose);
<span > </span>} catch (FileNotFoundException e) {
<span > </span>e.printStackTrace();
<span > </span>} catch (IOException e) {
<span > </span>e.printStackTrace();
<span > </span>}
<span > </span>
<span > </span>break;
<span > </span>case CASE_CAMERA:
<span > </span>// Bitmap bitmap = (Bitmap) data.getExtras().get("data"); // 这样获取到的拍照结果是缩略,所以不用这个
<span > </span>File file_catchPic = new File(SettingsUtilsTools.getSDPath() + catchPicStoreDir, catchPicName_camera);
<span > </span>
<span > </span>String path_camera = file_catchPic.getAbsolutePath();
<span > </span>Log.e("TAG ==>> 拍照结果文件存放路径", path_camera);
//<span > </span>Intent intent11 = new Intent("com.go.action.PICHANDLE");
<span > </span>intent_godispose.putExtra(TAG_PICPATH, path_camera);
<span > </span>startActivity(intent_godispose);
<span > </span>break;
<span > </span>default:
<span > </span>break;
<span > </span>}
<span > </span>
其中工具类BitmapUtilsTools下的bitmap2bytes方法如下:
<span > </span>/**
<span > </span> * Bitmap转字节流
<span > </span> * @param bmp
<span > </span> * @return
<span > </span> */
<span > </span>public static byte[] bitmap2bytes(Bitmap bmp, String pic_name) {
<span > </span>ByteArrayOutputStream baos = new ByteArrayOutputStream();
<span > </span>String[] args = pic_name.split("\\.");<span > </span>// 这里注意不能直接使用 split("."),否则无法正确分割,正确的说是不会分割,应该是因为“.”是特殊字符的原因
<span > </span>
<span > </span>String suffix = args[args.length-1];<span > </span>// 获取后缀名名称
<span > </span>if(suffix.equalsIgnoreCase("JPG")) {
<span > </span>bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);<span > </span>// compress()中第二个参数为0时压缩比例最大,100则不压缩
<span > </span>} else if(suffix.equalsIgnoreCase("PNG")) {
<span > </span>bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
<span > </span>}
<span > </span>return baos.toByteArray();
<span > </span>}
将图片存储到指定的SD卡目录下:
<span > </span>Intent intent_godispose = new Intent("com.go.action.PICHANDLE");
switch (requestCode) {
case SELECT_PIC:
Uri uri_pic_back_photo = data.getData();
try {
Bitmap bitmap01 = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri_pic_back_photo);
String[] proj = {MediaStore.Images.Media.DATA};
// 好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = managedQuery(uri_pic_back_photo, proj, null, null, null);
// 按我个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
// 最后根据索引值获取图片路径
String path = cursor.getString(column_index);
String[] pic_ = path.split("/");
String pic_name = pic_[pic_.length-1];
Log.e("==>> TAG <<==", path);
intent_godispose.putExtra(TAG_PICPATH, path);<span > </span>// 将图片的路径传到另一个Activity
startActivity(intent_godispose);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case CASE_CAMERA:
// Bitmap bitmap = (Bitmap) data.getExtras().get("data"); // 获取拍照后的结果——缩略图
File file_catchPic = new File(SettingsUtilsTools.getSDPath() + catchPicStoreDir, catchPicName_camera);
String path_camera = file_catchPic.getAbsolutePath();
Log.e("TAG ==>> 拍照结果文件存放路径", path_camera);
// Intent intent11 = new Intent("com.go.action.PICHANDLE");
intent_godispose.putExtra(TAG_PICPATH, path_camera);
startActivity(intent_godispose);
break;
default:
break;
}
其中获取SD卡绝对路径的方法getSDPath()如下:
/**
* 获取SD卡在手机上的路径
* @return
*/
public static String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
}
return sdDir.toString();
}