Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用於修改頭像等)
阿新 • • 發佈:2019-01-11
這個功能借鑑了多個大神的,然後整合起來。
Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用 於修改頭像等)
第一步:
private int CAPTURE_CODE = 0; private int IMAGE_CODE = 2;
public void onClick(View v) { switch (v.getId()) { case R.id.btn_photo_album: //開啟相簿 Intent intent_photo = newIntent(Intent.ACTION_GET_CONTENT); intent_photo.setType("image/*"); startActivityForResult(intent_photo, IMAGE_CODE); break; case R.id.btn_carmen: //開啟相機 //用當前時間給取得的圖片命名 Intent intent_carmen = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent_carmen.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 判斷儲存卡是否可以用,可用進行儲存 SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA); //根據當前時間生成圖片的名稱 PHOTO_FILE_NAME = "/" + formatter.format(new Date()) + ".jpg"; //判斷sd是否存在 if (SDCardUtils.isSDCardEnable()) { intent_carmen.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment .getExternalStorageDirectory(), PHOTO_FILE_NAME))); } startActivityForResult(intent_carmen, CAPTURE_CODE); break; default: break; } }
第二步:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { /** * 相簿和相機result */ int PHOTO_REQUEST_CUT = 3; if (requestCode == IMAGE_CODE) {//相簿 PHOTO_REQUEST_GALLERY if (data != null) { // 得到圖片的全路徑 Uri uri = data.getData(); //將獲取的圖片uri轉為filePath String filePath = GetPathUtil.getPath(this, uri); try { //壓縮圖片 Bitmap bitmap = BitmapUtils.compressBySize(filePath); //儲存圖片 FileUtil.saveFile(bitmap, SAVE_FILE_PATH); } catch (Exception e) { e.printStackTrace(); } //開始上傳(SAVE_FILE_PATH,這個地址就可以直接用了,是壓縮後的圖片地址) } } else if (requestCode == CAPTURE_CODE) {//相機 PHOTO_REQUEST_CAMERA if (SDCardUtils.isSDCardEnable()) { File tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME); try { //壓縮圖片 Bitmap bitmap = BitmapUtils.compressBySize(tempFile.getAbsolutePath()); //儲存圖片 FileUtil.saveFile(bitmap, SAVE_FILE_PATH); } catch (Exception e) { e.printStackTrace(); } //開始上傳(SAVE_FILE_PATH,這個地址就可以直接用了,是壓縮後的圖片地址) } else { showToast("未找到儲存卡,無法儲存照片!"); } } else if (requestCode == PHOTO_REQUEST_CUT) { //圖片剪裁完成 } super.onActivityResult(requestCode, resultCode, data); }
第三步(將uri轉為圖片地址,壓縮圖片,儲存壓縮後的圖片到sd卡的方法):
1.將uri轉為圖片地址的方法:
public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final 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; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{ split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; }
2.壓縮圖片的方法:
//壓縮圖片尺寸 public static Bitmap compressBySize(String pathName) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;// 不去真的解析圖片,只是獲取圖片的頭部資訊,包含寬高等; Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts); // 得到圖片的寬度、高度; float imgWidth = opts.outWidth; float imgHeight = opts.outHeight; // 分別計算圖片寬度、高度與目標寬度、高度的比例;取大於等於該比例的最小整數; int widthRatio = (int) Math.ceil(imgWidth / (float) 300); int heightRatio = (int) Math.ceil(imgHeight / (float) 300); opts.inSampleSize = 1; if (widthRatio > 1 || widthRatio > 1) { if (widthRatio > heightRatio) { opts.inSampleSize = widthRatio; } else { opts.inSampleSize = heightRatio; } } //設定好縮放比例後,載入圖片進內容; opts.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(pathName, opts); return bitmap; }
3.儲存壓縮後的圖片到sd卡的方法:
//儲存進SD卡 public static void saveFile(Bitmap bm, String fileName) throws Exception { // File dirFile = new File(fileName); // //檢測圖片是否存在 // if (dirFile.exists()) { // dirFile.delete(); //刪除原圖片 // } File myCaptureFile = new File(fileName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); //100表示不進行壓縮,70表示壓縮率為30% bm.compress(Bitmap.CompressFormat.JPEG, 100, bos); bos.flush(); bos.close(); }