1. 程式人生 > >Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用於修改頭像等)

Android中相機拍攝照片,以及相簿選擇圖片壓縮上傳(壓縮後儲存進SD中)(可用於修改頭像等)

           這個功能借鑑了多個大神的,然後整合起來。        

           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 = new 
Intent(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卡的方法:

 //儲存進SDpublic 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();
}