从相册取图片得到图片的uri再通过工具类得到图片的绝对路径

前段时间在项目一个Activity里点击一个按钮从本地相册里选一张图片然后回到该Activity,再点击提交,提交给后台服务器.

下面代码来了....


1.首先点击控件调用下面这个方法,开启隐式意图,打开相册界面,从系统的相册中获取一张图片.

ps:这里一定要用startActivityForResult()方法打开相册界面,requestCode请求码自己订,用来在onActivityResult()方法中确认是从哪里回到了该Acitivity.

/**
 * 从系统的相册中获取一张图片
 */
private void pickPictureFromSystemGallery() {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 100);
}

2.在onActivityResult()方法中 从意图data中得到uri值,我之前就是在这里卡壳了,不知道怎么通过内容提供者给的uri值,怎么得到图片的绝对路径, 通过资料找到了这个方法getImageAbsolutePath(Context context,String uri).通过传入上下文和uri,返回绝对路径.请看第三步-->

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case 100://从系统相册返回的
                if (data != null) {
                    Uri uri = data.getData();
                    if (uri != null) {
                        String realFilePath = getImageAbsolutePath(ReceptionApplyActivity.this,
                                uri);
                        String filePath = BitmapUtils.compressImageUpload(realFilePath);
                        mImageFile = new File(filePath);
                        Log.i(TAG, "fileName:" + mImageFile.getName());
                        Log.i(TAG, "filePath:" + filePath);
                        Log.i(TAG, "fileIsExists:" + mImageFile.exists());
                        mReceptUploadPic.setText("已选中:" + mImageFile.getName());
                        mIsPicPicked = true;
                    }
                }
                break;
        }
    }
}

3.uri转绝对路径方法

/**
 * 根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换
 *
 * @param context
 * @param imageUri
 * @date 2014-10-12
 */
@TargetApi(19)
public static String getImageAbsolutePath(Activity context, Uri imageUri) {
    if (context == null || imageUri == null)
        return null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT &&
            DocumentsContract.isDocumentUri(context, imageUri)) {
        if (isExternalStorageDocument(imageUri)) {
            String docId = DocumentsContract.getDocumentId(imageUri);
            String[] split = docId.split(":");
            String type = split[0];
            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        } else if (isDownloadsDocument(imageUri)) {
            String id = DocumentsContract.getDocumentId(imageUri);
            Uri contentUri = ContentUris.withAppendedId(Uri.parse
                    ("content://downloads/public_downloads"), Long.valueOf(id));
            return getDataColumn(context, contentUri, null, null);
        } else if (isMediaDocument(imageUri)) {
            String docId = DocumentsContract.getDocumentId(imageUri);
            String[] split = docId.split(":");
            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;
            }
            String selection = MediaStore.Images.Media._ID + "=?";
            String[] selectionArgs = new String[]{split[1]};
            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    } // MediaStore (and general)
    else if ("content".equalsIgnoreCase(imageUri.getScheme())) {
        // Return the remote address
        if (isGooglePhotosUri(imageUri))
            return imageUri.getLastPathSegment();
        return getDataColumn(context, imageUri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(imageUri.getScheme())) {
        return imageUri.getPath();
    }
    return null;
}
4.包含压缩图片方法的图片工具类 返回压缩后的图片的方法

public class BitmapUtils {
  
    /** 
     * 质量压缩方法 
     *  
     * @param image 
     * @return 
     */  
    private static Bitmap compressImage(Bitmap image) {
  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
        int options = 100;  
        while (baos.toByteArray().length / 1024 > 100) {   
            baos.reset();  
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);  
            options -= 10;  
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
        return bitmap;  
    }  
  
    /** 
     * 图片按比例大小压缩方法(根据路径获取图片并压缩) 
     *  
     * @param srcPath 
     * @return 
     */  
    private static Bitmap getImage(String srcPath) {  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        newOpts.inJustDecodeBounds = true;  
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空  
  
        newOpts.inJustDecodeBounds = false;  
        int w = newOpts.outWidth;  
        int h = newOpts.outHeight;  
        // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
        float hh = 800f;// 这里设置高度为800f  
        float ww = 480f;// 这里设置宽度为480f  
        // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
        int be = 1;// be=1表示不缩放  
        if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放  
            be = (int) (newOpts.outWidth / ww);  
        } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放  
            be = (int) (newOpts.outHeight / hh);  
        }  
        if (be <= 0)  
            be = 1;  
        newOpts.inSampleSize = be;// 设置缩放比例  
        // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
        return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩  
    }  
  
    /** 
     * 将压缩的bitmap保存到SDCard卡临时文件夹,用于上传 
     *  
     * @param filename 
     * @param bit 
     * @return 
     */  
    private static String saveMyBitmap(String filename, Bitmap bit) {  
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/laopai/";
        String filePath = baseDir + filename;  
        File dir = new File(baseDir);
        if (!dir.exists()) {  
            dir.mkdir();  
        }  
  
        File f = new File(filePath);  
        try {  
            f.createNewFile();  
            FileOutputStream fOut = null;
            fOut = new FileOutputStream(f);  
            bit.compress(Bitmap.CompressFormat.PNG, 100, fOut);  
            fOut.flush();  
            fOut.close();  
        } catch (IOException e1) {
            e1.printStackTrace();  
        }  
  
        return filePath;  
    }  
  
    /** 
     * 压缩上传路径 
     * @param path 
     * @return 
     */  
    public static String compressImageUpload(String path) {  
        String filename = path.substring(path.lastIndexOf("/") + 1);  
        Bitmap image = getImage(path);  
        return saveMyBitmap(filename, image);  
    }  
  
  
    /** 
     * 清除缓存文件 
     */  
    public static void deleteCacheFile(){  
        File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/laopai/");  
        RecursionDeleteFile(file);  
    }  
    /** 
     * 递归删除 
     */  
    private static void RecursionDeleteFile(File file){  
        if(file.isFile()){  
            file.delete();  
            return;  
        }  
        if(file.isDirectory()){  
            File[] childFile = file.listFiles();  
            if(childFile == null || childFile.length == 0){  
                file.delete();  
                return;  
            }  
            for(File f : childFile){  
                RecursionDeleteFile(f);  
            }  
            file.delete();  
        }  
    }  
}  

5.得到压缩后的绝对路径了 接着放进File对象里面 如果要发送到后台,我是使用OkHttpUtils的post请求,那就索性贴出来给大家吧~

OkHttpUtils
        .post()
        .url(Constant.API)
        .addParams("xxxx字段名", xxxxx)
        .addFile("xxx字段名", mImageFile.getName(), mImageFile)
        .build().execute();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值