前段时间在项目一个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();