android之跳转相册选择图片/照相

时间:2024-03-28 19:32:03

                                android之跳转相册选择图片/照相

使用环境:

跳转相册选择图片的时候,对于不同类型的图片有不同该类型的返回值:

这里说的就是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

        另外写的怎么样,请评论一下,最近感觉狠空寂冷。