安卓下调用系统拍照,系统相册功能实现
来源:互联网 发布:淘宝店铺收入该怎么算 编辑:程序博客网 时间:2024/04/29 21:35
首先,由于要调用系统的dialog,所以我们定义一个字符串数组用以显示item:
public static final String[] items = {"相机拍摄","手机相册","取消"};
然后,调用下面这段代码来处理拍照及选择照片:
public static void SelectPhoto(String UserID) { AppActivity.fileName = UserID+".png"; if(cpGame!=null) { cpGame.runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder( cpGame); builder.setTitle("选择头像"); builder.setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String select_item = items[which].toString(); if(which == 0) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 拍照上传 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(AppActivity.tempFile)); //在onActivityResult中接收 cpGame.startActivityForResult(intent, CAMERA_REQUEST_CODE); } else if(which == 1) { // 相册上传 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); cpGame.startActivityForResult(intent, PICTURE_REQUEST_CODE); } } }); builder.show(); } }); } }
其中的AppActivity.fileName是要保存的文件名,cpGame是从AppActivity传过来的this指针:
Activity cpGame = AppActivity.this;
public static final int CAMERA_REQUEST_CODE = 222;//调用相机code
public static final int PICTURE_REQUEST_CODE = 444;//调用相册code
public static final int PHOTO_REQUEST_CUT = 666;//照片裁剪code
public static File tempFile = new File(Environment.getExternalStorageDirectory(),getPhotoFileName());//拍照保存的文件路径
// 使用系统当前日期加以调整作为照片的名称 private static String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat( "'IMG'_yyyyMMdd_HHmmss"); return dateFormat.format(date) + ".jpg"; }
然后,在AppActivity的onActivityResult()函数中接收并处理所取到的照片数据,这个函数会在acticity切换的时候回调:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {//拍照回调switch (requestCode) { case MyPlatform.CAMERA_REQUEST_CODE:// 当选择拍照时调用 startPhotoZoom(Uri.fromFile(tempFile)); break; case MyPlatform.PICTURE_REQUEST_CODE:// 当选择从本地获取图片时 // 做非空判断,当我们觉得不满意想重新剪裁的时候便不会报异常,下同 if (data != null) startPhotoZoom(data.getData()); break; case MyPlatform.PHOTO_REQUEST_CUT:// 返回的结果 if (data != null) { Bundle bundle = data.getExtras(); if (bundle != null) { Bitmap photo = bundle.getParcelable("data"); if (photo!=null) { MyPlatform.saveMyBitmap(photo); } } } break; } super.onActivityResult(requestCode, resultCode, data); }这里如果是拍照返回,则直接从所保存的路径tempFile中取到数据,如果是相册返回,则直接用data.getData()取数据,取到数据之后我们开始对照片进行缩放剪裁:
private void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", mWH); intent.putExtra("outputY", mWH); intent.putExtra("return-data", true); intent.putExtra("noFaceDetection", true); startActivityForResult(intent, MyPlatform.PHOTO_REQUEST_CUT); }这里的mWH = 300,此时剪裁之后的图片不会过于失真,然后,这里剪裁之后,又会调用onActivityResult()函数来处理结果,也就是上面代码中的
case MyPlatform.PHOTO_REQUEST_CUT
在这里我们基本已经做完了对照片的所有处理,那么下一步我们就开始保存图片:
//保存照片到本地img_interim文件夹下,便于上传@SuppressLint("SdCardPath")public static void saveMyBitmap(Bitmap bit) {bm = bit;if(cpGame!=null) { cpGame.runOnUiThread(new Runnable() { @Override public void run() { File dir = new File(AppActivity.path+"/img_interim/"); if (!dir.exists()) { dir.mkdir(); } saveFile = new File(AppActivity.path+"/img_interim/" + AppActivity.fileName); try { saveFile.createNewFile(); FileOutputStream fOut = null; fOut = new FileOutputStream(saveFile); bm.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); fOut.close(); //这里的saveFile就是最终取到的照片路径 } catch (IOException e1) { // TODO Auto-generated catch block saveFile = null; e1.printStackTrace(); } } }); }}
这里的一些参数的初始值:
public static String path = Environment.getExternalStorageDirectory().getPath();
public static Bitmap bm=null;
AppActivity.fileName就是最开始我们所说的要保存的文件名字
0 0
- 安卓下调用系统拍照,系统相册功能实现
- android 调用系统相册和系统拍照功能的Demo
- 调用系统拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- 调用系统照相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- 调用系统相册和系统相机拍照
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- Android 调用相册 拍照 实现系统控件缩放 切割图片 .
- Android 调用相册 拍照 实现系统控件缩放 切割图片 .
- Struts框架的数据验证可分为几种类型?
- 今天教大家PDF文件怎么批量去除页眉页脚
- 浅谈web网站架构演变过程
- hihocoder #1300 : 展胜地的鲤鱼旗 dp
- 三级缓存的使用框架
- 安卓下调用系统拍照,系统相册功能实现
- Android 多CPU架构支持所需要了解的知识
- HTTP的时延
- mac修改mysql端口
- AndroidStudio 关于Log打印问题的总结
- Pangolin 安装及其使用
- 【面试】简述Form Bean的表单验证流程
- oj刷题 Problem C: 五位以内的对称素数
- jquery