android 相机、相册、剪切
来源:互联网 发布:家电遥控器软件 编辑:程序博客网 时间:2024/05/16 14:27
今天研究了大半天才把android 相机、相册、剪切这三大块搞清楚,中间被坑了好几次,其实也是由于自己理解,查看了一些网上写的,结果都没能达到效果,还把自己弄得更乱,错了很多次,终于有了收获,最终把调用系统相机,获取相册,以及剪切的实现搞清楚了;
下面我们先上简单的拍照实现代码:
<span style="font-size:14px;">Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, CAMERA);</span>
<span style="font-size:14px;"> @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA && resultCode == Activity.RESULT_OK && null != data){ Bundle bundle = data.getExtras(); //获取相机返回的数据,并转换为图片格式 Bitmap bitmap = (Bitmap) bundle.get("data"); ByteArrayOutputStream baos = null ; try{ baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); } finally { try { baos.flush(); baos.close(); } catch (IOException e) { e.printStackTrace(); } } imageView.setImageBitmap(bitmap); }</span>
上面照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过data.getExtras()能够得到原始图片位置。最终转为bitmap进行展示;
如果默认系统的没有指定目标uri,data就有数据,如果指定uri,则data就没有返回数据!需要获取相应的uri,
<span style="font-size:14px;">uri = data.getData();</span>
下面我们自定义照片图片存储的路径:
<span style="font-size:14px;">Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".jpg");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));startActivityForResult(intent, 1);</span>
获取相册代码:
<span style="font-size:14px;">Intent picture = new Intent(Intent.ACTION_GET_CONTENT); picture.addCategory(Intent.CATEGORY_OPENABLE); picture.setType("image/*"); startActivityForResult(picture, 2);</span>
回调:
<span style="font-size:14px;">@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && null != data){ switch (requestCode) { case 1: uri = Uri.fromFile(cameraFile); startPhotoZoom(this, uri, 3); break; case 2: if (null != data) {//为了取消选取不报空指针用的 uri = data.getData(); dataUri=uri; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { String path = PhotoClipperUtil.getPath(this, uri); File f = new File(path); dataUri = Uri.fromFile(f); } startPhotoZoom(this, uri, 3); } break; case 3: if(uri==null){ break; } try { cropBitmap = MediaStore.Images.Media.getBitmap(MediaActivity.this.getContentResolver(), uri); } catch (IOException e) { e.printStackTrace(); } if (cropBitmap != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); imageView.setImageBitmap(cropBitmap); } break; default: break; } }</span>
剪切代码:
<span style="font-size:14px;">public void startPhotoZoom(Context context, Uri uri,int REQUE_CODE_CROP) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); intent.putExtra("scale", true);// 去黑边 intent.putExtra("scaleUpIfNeeded", true);// 去黑边 // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1);//输出是X方向的比例 intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 500);//输出X方向的像素 intent.putExtra("outputY", 500);//输出Y方向的像素 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.putExtra("return-data", false);//设置为不返回数据 startActivityForResult(intent, REQUE_CODE_CROP); }</span>
public class PhotoClipperUtil { @SuppressLint("NewApi") public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); }}大家以为上面能实现了吗,运行起来还是会报错:
报错提示你说没有相应的权限,那么就把权限加在androidManifest.xml:
<!-- 截图权限--> <uses-permission android:name="android.permission.READ_FRAMEBUFFER" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 写SD卡权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />
加上上面的权限代码运行期啦,终于成功了;上面是大半天的研究成功希望能帮到大家;
0 0
- android 相机、相册、剪切
- android 调用系统相机、相册剪切功能
- Android 从相册和相机选取图片并剪切
- Android 从相机或相册获取图片并剪切
- Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
- Android调用相机,相册
- android相机和相册
- Android-相机与相册
- Android 打开相机,相册
- 手机相机和相册:基本调用与剪切相片
- android调用系统相册选图或相机拍照后对图片进行剪切无内存溢出支持7.0
- Android中使用封装的OKHttp上传图片,从相机和相册中获取图片并剪切
- android 拍照和选择相册图片剪切
- Android中调到相册剪切图片
- android调用相机和相册
- android调用相机和相册
- android 打开相机和相册
- Android相机、相册获取图片
- 发布期间出现的一些问题及解决方法
- navigationBar相关设置(透明度、去掉下方黑线)
- kafka 0.8.2版本配置选项翻译
- Excel及Word的导入及导出
- 存储分页
- android 相机、相册、剪切
- 页面设计的一些美化
- 恶意代码--dll动态链接库注入目标进程隐藏自身(亲测win7x86和x64有效)
- asp.net连接accessOLDB数据库访问类
- 使用jq弹出提示窗口信息
- 给文本框加上提示效果
- spring 定时任务执行两次
- jq UI中的dialog属性设置
- jquery.validate.js中success或error方法使用