使用环境:
跳转相册选择图片的时候,对于不同类型的图片有不同该类型的返回值:
这里说的就是vivo手机跳转相册返回的地址:
1 小米正常返回地址: file:///storage/emulated/0/Tencent/QQ_Images/null2e313c5d73f3b0d5.jpg
2 vivo手机的返回地址: content://media/external/images/media/607657
这时候需要将content开头的图片转换成图片后缀名为jpg的图片绝对地址!
(此方法在onActivityForResult中接收到返回图片地址以后使用)
String u = uri + ""; if ((uri + "").contains("content")) { Log.e(" content转换之前"+ u); u = ImageUtils.getRealPathFromURI(RecallActivity.this,uri); Log.e(" content转换之后"+ u); }
处理vivo手机返回地址的问题:
/** * vivo手机的图片选择问题 * 返会的是:content://media/external/images/media/607657 * 而正常返: file:///storage/emulated/0/Tencent/QQ_Images/null2e313c5d73f3b0d5.jpg */ public static String getRealPathFromURI(Context context, Uri contentUri) { //传入图片uri地址 String[] proj = { MediaStore.Images.Media.DATA }; CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null); Cursor cursor = loader.loadInBackground(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); }
因为本片设计代码量比较小,所以没写demo ,如果需要直接赋值一下代码即可:
前提:
1 判断是否有照相权限,读写内存的权限,7.0以后对于隐私保护更严谨了点。
2 开启照相功能
private Uri uri; public void toPhoto() { uri = ImageUtils.createImagePathUri(ConfirmWorkActivity.this); RxPermissionsUtils.requestCamera(this, new onRequestPermissionsListener() { @Override public void onRequestBefore() { } @Override public void onRequestLater() {//准确的说也就下面这个跳转是有用的 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 0); } }); }
预设置Uri的方法:
public static Uri createImagePathUri(final Context context) { final Uri[] imageFilePath = {null}; if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); imageFilePath[0] = Uri.parse(""); } else { String status = Environment.getExternalStorageState(); SimpleDateFormat timeFormatter = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA); long time = System.currentTimeMillis(); String imageName = timeFormatter.format(new Date(time)); ContentValues values = new ContentValues(3); values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName); values.put(MediaStore.Images.Media.DATE_TAKEN, time); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); if (status.equals(Environment.MEDIA_MOUNTED)) { imageFilePath[0] = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { imageFilePath[0] = context.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values); } } return imageFilePath[0]; }至于为什么,sorry,不知道。
3 重写onActivityResult接收返回数据,并将返回数据转化成可以正常使用的图片地址
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == 0) { capath = uri + ""; if ((capath + "").contains("content")) { capath = ImageUtils.getRealPathFromURI(ConfirmWorkActivity.this, uri); } else if (capath.contains("file:///")) { capath = capath.substring(7, capath.length()); } }}}
4 最后得到的capath 就可以直接显示。
当然,图片挺大的需要压缩,至于如何压缩目前常用并且最合适的是LuBan压缩,不懂的可以去百度。
*****跳转相册选择照片*****
1 跳转图片选择界面:
Intent intent = new Intent("android.intent.action.PICK"); intent.setType("image/*"); startActivityForResult(intent, 3);
2 onActivityResult接收返回数据,就不再提示了,如果有任何报错可参考上面转换方式。
请原谅写的这么碎,因为代码是测试很多此得出的结果,所以不停的该改改,当然,有任何疑问均可联系小弟:
QQ 532245792
另外写的怎么样,请评论一下,最近感觉狠空寂冷。