android 拍照或者图库选择 压缩后 图片 上传
16lz
2021-01-26
通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程
一:创建个临时文件夹用于保存压缩后需要上传的图片
/** * path:存放图片目录路径 */private String path = Environment.getExternalStorageDirectory().getPath() + "/XXX/";/** * saveCatalog:保存文件目录 */private File saveCatalog;/** * saveFile:保存的文件 */private File saveFile; public String createOrGetFilePath(String fileName, Context mContext) {saveCatalog = new File(path);if (!saveCatalog.exists()) {saveCatalog.mkdirs();}saveFile = new File(saveCatalog, fileName);try {saveFile.createNewFile();} catch (IOException e) {Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();e.printStackTrace();}return saveFile.getAbsolutePath();}
二:通过对话框选择获得图片方式(拍照或者相册)<string-array name="get_image_way">
<item >拍照</item> <item >相册</item> </string-array>
private String[] image;image = getResources().getStringArray(R.array.get_image_way);/** * TODO 通过拍照或者图册获得照片 * * @author {author wangxiaohong} */private void selectImage() {// TODO Auto-generated method stubString state = Environment.getExternalStorageState();if (!state.equals(Environment.MEDIA_MOUNTED)) {Util.showToast(this, getResources().getString(R.string.check_sd)); //检查SD卡是否可用return;}AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(R.string.pick_image).setItems(image,new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {if (image[which].equals(getString(R.string.my_data_image_way_photo))) {getImageByPhoto();} else {getImageByGallery();}}});builder.create().show();}
private void getImageByGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setType("image/*");startActivityForResult(intent, IMAGE_RESULT);}
public String getPath(String carId, String fileName, Context mContext) {File saveCatalog = new File(Constant.CACHE, carId);// saveCatalog = new File(path);if (!saveCatalog.exists()) {saveCatalog.mkdirs();}saveFile = new File(saveCatalog, fileName);try {saveFile.createNewFile();} catch (IOException e) {Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();e.printStackTrace();}return saveFile.getAbsolutePath();}
private void getImageByPhoto() {
public static final String CACHE = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/pinchebang/";
path = util.getPath(user.getCar().getCarId() + "", mPhotoName, PersonalInfoActivity.this);imageUri = Uri.fromFile(new File(path));Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, CAMERA_RESULT);}
三:在onActivityResult中得到的图片做压缩处理
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK) return;Bitmap bitmap = null;if (requestCode == CAMERA_RESULT) {bitmap = util.getSmallBitmap(PersonalInfoActivity.this, path);boolean flag = util.save(PersonalInfoActivity.this, path, bitmap);} else if (requestCode == IMAGE_RESULT) {Uri selectedImage = data.getData();path = util.getImagePath(PersonalInfoActivity.this, selectedImage);bitmap = util.getSmallBitmap(PersonalInfoActivity.this, path);String pcbPathString = util.getPath(user.getCar().getCarId() + "", mPhotoName,PersonalInfoActivity.this);;util.save(PersonalInfoActivity.this, pcbPathString, bitmap);path = pcbPathString;}if (null != bitmap) {mypicture.setImageBitmap(bitmap);HttpUtil.uploadFile(PersonalInfoActivity.this, path, "userImg",Constant.URL_VERIFY_DRIVER);// MemoryCache memoryCache = new MemoryCache();// memoryCache.put(url, bitmap);}}
上面对应的压缩方法
/** * TODO filePath:图片路径 * * @author {author wangxiaohong} */public Bitmap getSmallBitmap(Context mContext, String filePath) {DisplayMetrics dm;dm = new DisplayMetrics();((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(filePath, options);// Calculate inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, dm.widthPixels, dm.heightPixels);// Decode bitmap with inSampleSize setoptions.inJustDecodeBounds = false;return BitmapFactory.decodeFile(filePath, options);}public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {// Raw height and width of imagefinal int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;if (height > reqHeight || width > reqWidth) {// Calculate ratios of height and width to requested height and// widthfinal int heightRatio = Math.round((float) height / (float) reqHeight);final int widthRatio = Math.round((float) width / (float) reqWidth);// Choose the smallest ratio as inSampleSize value, this will// guarantee// a final image with both dimensions larger than or equal to the// requested height and width.inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;}return inSampleSize;}/** * TODO 保存并压缩图片 将bitmap 保存 到 path 路径的文件里 * * @author {author wangxiaohong} */public boolean save(Context mContext, String path, Bitmap bitmap) {DisplayMetrics dm;dm = new DisplayMetrics();((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);if (path != null) {try {// FileCache fileCache = new FileCache(mContext);// File f = fileCache.getFile(url);File f = new File(path);FileOutputStream fos = new FileOutputStream(f);bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);saveMyBitmap(bitmap);return true;} catch (Exception e) {return false;}} else {return false;}}private void saveMyBitmap(Bitmap bm) {FileOutputStream fOut = null;try {fOut = new FileOutputStream(saveFile);} catch (FileNotFoundException e) {e.printStackTrace();}bm.compress(Bitmap.CompressFormat.JPEG, 70, fOut);try {fOut.flush();} catch (IOException e) {e.printStackTrace();}try {fOut.close();} catch (IOException e) {e.printStackTrace();}}public String getPath(String carId, String fileName, Context mContext) {File saveCatalog = new File(Constant.CACHE, carId);// saveCatalog = new File(path);if (!saveCatalog.exists()) {saveCatalog.mkdirs();}saveFile = new File(saveCatalog, fileName);try {saveFile.createNewFile();} catch (IOException e) {Toast.makeText(mContext, "创建文件失败,请检查SD是否有足够空间", Toast.LENGTH_SHORT).show();e.printStackTrace();}return saveFile.getAbsolutePath();}/** * TODO 获得相册选择图片的图片路径 * * @author {author wangxiaohong} */public String getImagePath(Context mContext, Uri contentUri) {String[] proj = { MediaStore.Images.Media.DATA };Cursor cursor = mContext.getContentResolver().query(contentUri, proj, null, null, null);int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();String ImagePath = cursor.getString(column_index);cursor.close();return ImagePath;}
四:上传
public static void uploadFile(Context mContext, String path, String modelValue, String url) {new PhotoUploadAsyncTask(mContext).execute(path, modelValue, url);}class PhotoUploadAsyncTask extends AsyncTask<String, Integer, String> {// private String url = "http://192.168.83.213/receive_file.php";private Context context;public PhotoUploadAsyncTask(Context context) {this.context = context;}@Overrideprotected void onPreExecute() {}@SuppressWarnings("deprecation")@Overrideprotected String doInBackground(String... params) {// 保存需上传文件信息MultipartEntityBuilder entitys = MultipartEntityBuilder.create();entitys.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);entitys.setCharset(Charset.forName(HTTP.UTF_8));File file = new File(params[0]);entitys.addPart("image", new FileBody(file));entitys.addTextBody("model", params[1]);HttpEntity httpEntity = entitys.build();return HttpUtil.uploadFileWithpost(params[2], context, httpEntity);}@Overrideprotected void onProgressUpdate(Integer... progress) {}@Overrideprotected void onPostExecute(String result) {Toast.makeText(context, result, Toast.LENGTH_SHORT).show();}}/** * 用于文件上传 * * @param url * @param mContext * @param entity * @return */@SuppressWarnings("deprecation")public static String uploadFileWithpost(String url, Context mContext, HttpEntity entity) {Util.printLog("开始上传");try {setTimeout();httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);// 设置连接超时时间// httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,// 5000);HttpPost upPost = new HttpPost(url);upPost.setEntity(entity);HttpResponse httpResponse = httpClient.execute(upPost, httpContext);if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {return mContext.getString(R.string.upload_success);}} catch (Exception e) {Util.printLog("上传报错");e.printStackTrace();}// finally {// if (httpClient != null && httpClient.getConnectionManager() != null)// {// httpClient.getConnectionManager().shutdown();// }// }Util.printLog("上传成功");return mContext.getString(R.string.upload_fail);}
更多相关文章
- android 9.png 图片制作
- android 解压缩zip包
- Android(安卓)获取视频(本地、网络)的第一关键帧
- Android(安卓)图片转动效果(一)
- Android(安卓)中 Base64 转换成 图片
- ps图片黑白调整算法——Android实现及性能优化
- android 保存Bitmap到本地图片
- Android中WebView图片实现自适应的方法
- andrioid——checkbox勾选按钮自定义样式