Android图片处理-相机、相处简单调用
安卓开发中,常常需要使用到手机相机拍照、或者相册上传头像等等。通过使用Intent,我们很方便地获得相机、相册里面的图片:
1、相机调用,通过设置File文件路径和文件名,可以将拍照得到的图片保存下来。
1 //判断本地内存卡是否可用 2 String store = Environment.getExternalStorageState(); 3 if(store.equals(Environment.MEDIA_MOUNTED)) { 4 picName = FileUtil.createFileName(20, "jpg"); 5 file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName); 6 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 7 intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file)); 8 startActivityForResult(intent, Camera_Data); 9 }
2、相册调用
1 Intent intent = new Intent(); 2 intent.setType("image/*"); 3 intent.setAction(Intent.ACTION_GET_CONTENT); 4 startActivityForResult(intent, Album_Data);
3、对Intent获得的数据进行处理:
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 4 if(resultCode != RESULT_CANCELED) { 5 switch (requestCode) { 6 case Camera_Data: 7 if(file.exists()) { 8 Log.i("MyApplication","获取拍照文件:"+file.getPath()); 9 startPhotoZoom(Uri.fromFile(file)); 10 } 11 break; 12 case Album_Data: 13 //获取相册选取的图片 14 if(data != null) { 15 startPhotoZoom(data.getData()); 16 } 17 break; 18 case ZoomPhoto: 19 Bundle bundle = data.getExtras(); 20 bitmap = bundle.getParcelable("data"); 21 picName = FileUtil.createFileName(20, "jpg"); 22 file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName); 23 //输出最后图片到该文件夹 24 FileOutputStream out = null; 25 try { 26 out = new FileOutputStream(file); 27 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 28 } catch (FileNotFoundException e) { 29 e.printStackTrace(); 30 } finally { 31 try { 32 out.flush(); 33 out.close(); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 38 } 39 // //广播通知有图片更新 (最好用绝对路径) 40 // Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 41 // intent.setData(Uri.fromFile(file)); 42 // this.sendBroadcast(intent); 43 44 Map<String,Object> param = new HashMap<String, Object>(); 45 param.put("post_name", ConfigureUtils.getCurrentUser(UserSettingUploadIcoActivity.this)); 46 Map<String, File> fileParams = new HashMap<String, File>(); 47 fileParams.put("file", file); 48 uploadPic(ConfigureUtils.changeIco, param, fileParams, handler); 49 50 break; 51 default: 52 break; 53 } 54 55 } 56 super.onActivityResult(requestCode, resultCode, data); 57 }
4、头像上传往往需要调用本地相册,也就是将Intent返回的data(Uri)再一次在相册中打开,裁剪处理后再通过Bundle获取到最后裁剪的小图。
1 private void startPhotoZoom(Uri uri) { 2 Intent intent = new Intent("com.android.camera.action.CROP"); 3 intent.setDataAndType(uri, "image/*"); 4 // 设置裁剪 5 intent.putExtra("crop", "true"); 6 // aspectX aspectY 是宽高的比例 7 intent.putExtra("aspectX", 1); 8 intent.putExtra("aspectY", 1); 9 // outputX outputY 是裁剪图片宽高 10 intent.putExtra("outputX", ConfigureUtils.IcoWidth); 11 intent.putExtra("outputY", ConfigureUtils.IcoWidth); 12 intent.putExtra("return-data", true); 13 startActivityForResult(intent, ZoomPhoto); 14 }
5、另外,在上面的一些处理中,用到FileUtil工具类(自己定义的),也贴出来。
1 public class FileUtil { 2 /** 3 * 生成时间和随机数结合的文件名 4 * @param length 随机数长度 5 * @param end 文件名后缀,如jpg png 6 * @return 7 */ 8 public static String createFileName(int length,String end) { 9 String filename = null; 10 String ranStr = RandomNumberUtils.randomString(length); 11 filename = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) +ranStr+"."+ end; 12 return filename; 13 } 14 15 /** 16 * 创建、获取文件夹 17 * 默认sd卡根目录+filePath,如/myPicture/ 18 * @return 19 */ 20 public static File createFileDir(String filePath) { 21 String sdStatus = Environment.getExternalStorageState(); 22 if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 23 Log.i("MyApplication", 24 "SD card is not avaiable/writeable right now."); 25 return null; 26 } 27 File file = new File(Environment.getExternalStorageDirectory().getPath()+filePath); 28 if(!file.exists()) { 29 file.mkdirs(); //可以创建多级目录 30 } 31 return file; 32 } 33 }
下一篇,我们再来说说一些图片的压缩处理。