獲取本地圖片或拍照,進行頭像圖片的上傳的工具類

Dewey-W發表於2017-11-10

1. 圖片的獲取,裁剪,壓縮類(可以作為主功能程式碼在Activity中)

    protected static final int CHOOSE_PICTURE = 0;
    protected static final int TAKE_PICTURE = 1;
    private static final int CROP_SMALL_PICTURE = 2;
    protected static Uri tempUri;

/**
 * 顯示修改頭像的對話方塊
 */
public void showChoosePicDialog(View v) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("設定頭像");
    String[] items = { "選擇本地照片", "拍照" };
    builder.setNegativeButton("取消", null);
    builder.setItems(items, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case CHOOSE_PICTURE: // 選擇本地照片
                    Intent openAlbumIntent = new Intent(
                            Intent.ACTION_GET_CONTENT);
                    openAlbumIntent.setType("image/*");
                    startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
                    break;
                case TAKE_PICTURE: // 拍照
                    takePicture();
                    break;
            }
        }
    });
    builder.create().show();
}

private void takePicture() {
    String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
    if (Build.VERSION.SDK_INT >= 23) {
        // 需要申請動態許可權
        int check = ContextCompat.checkSelfPermission(this, permissions[0]);
        // 許可權是否已經 授權 GRANTED---授權  DINIED---拒絕
        if (check != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }
    Intent openCameraIntent = new Intent(
            MediaStore.ACTION_IMAGE_CAPTURE);
    File file = new File(Environment
            .getExternalStorageDirectory(), "image.jpg");
    //判斷是否是AndroidN以及更高的版本
    if (Build.VERSION.SDK_INT >= 24) {
        openCameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        tempUri = FileProvider.getUriForFile(PersonInfoActivity.this, "com.lt.uploadpicdemo.fileProvider", file);
    } else {
        tempUri = Uri.fromFile(new File(Environment
                .getExternalStorageDirectory(), "image.jpg"));
    }
    // 指定照片儲存路徑(SD卡),image.jpg為一個臨時檔案,每次拍照後這個圖片都會被替換
    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
    startActivityForResult(openCameraIntent, TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) { // 如果返回碼是可以用的
        switch (requestCode) {
            case TAKE_PICTURE:
                startPhotoZoom(tempUri); // 開始對圖片進行裁剪處理
                break;
            case CHOOSE_PICTURE:
                startPhotoZoom(data.getData()); // 開始對圖片進行裁剪處理
                break;
            case CROP_SMALL_PICTURE:
                if (data != null) {
                    setImageToView(data); // 讓剛才選擇裁剪得到的圖片顯示在介面上
                }
                break;
        }
    }
}

/**
 * 裁剪圖片方法實現
 *
 * @param uri
 */
protected void startPhotoZoom(Uri uri) {
    if (uri == null) {
        Log.i("tag", "The uri is not exist.");
    }
    tempUri = uri;
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    // 設定裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是寬高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪圖片寬高
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_SMALL_PICTURE);
}

/**
 * 儲存裁剪之後的圖片資料
 *
 * @param
 */
protected void setImageToView(Intent data) {
    Bundle extras = data.getExtras();
    if (extras != null) {
        Bitmap photo = extras.getParcelable("data");

        photo = ImageUtils.toRoundBitmap(photo); // 這個時候的圖片已經被處理成圓形的了
        headPhoto.setImageBitmap(photo);
        uploadPic(photo);
    }
}

private void uploadPic(Bitmap bitmap) {
    // 上傳至伺服器
    // ... 可以在這裡把Bitmap轉換成file,然後得到file的url,做檔案上傳操作
    // 注意這裡得到的圖片已經是圓形圖片了
    // bitmap是沒有做個圓形處理的,但已經被裁剪了
    String imagePath = ImageUtils.savePhoto(bitmap, Environment
            .getExternalStorageDirectory().getAbsolutePath(), String
            .valueOf(System.currentTimeMillis()));
    Log.e("imagePath", imagePath+"");
    if(imagePath != null){
        // 拿著imagePath上傳了

        Log.d("TAG","imagePath:"+imagePath);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

    } else {
        // 沒有獲取 到許可權,從新請求,或者關閉app
        Toast.makeText(this, "需要儲存許可權", Toast.LENGTH_SHORT).show();
    }
}


2. 圖片的上傳及轉換類(可以作為util工具類

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//上傳頭像
public class ImageUtils {
    /**
     * Save image to the SD card
     *
     * @param photoBitmap
     * @param photoName
     * @param path
     */
    public static String savePhoto(Bitmap photoBitmap, String path,
                                   String photoName) {
        String localPath = null;
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            File dir = new File(path);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            File photoFile = new File(path, photoName + ".png");
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream = new FileOutputStream(photoFile);
                if (photoBitmap != null) {
                    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,
                            fileOutputStream)) { // 轉換完成
                        localPath = photoFile.getPath();
                        fileOutputStream.flush();
                    }
                }
            } catch (FileNotFoundException e) {
                photoFile.delete();
                localPath = null;
                e.printStackTrace();
            } catch (IOException e) {
                photoFile.delete();
                localPath = null;
                e.printStackTrace();
            } finally {
                try {
                    if (fileOutputStream != null) {
                        fileOutputStream.close();
                        fileOutputStream = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return localPath;
    }

    /**
     * 轉換圖片成圓形
     *
     * @param bitmap 傳入Bitmap物件
     * @return
     */
    public static Bitmap toRoundBitmap(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float roundPx;
        float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom;
        if (width <= height) {
            roundPx = width / 2;
            top = 0;
            bottom = width;
            left = 0;
            right = width;
            height = width;
            dst_left = 0;
            dst_top = 0;
            dst_right = width;
            dst_bottom = width;
        } else {
            roundPx = height / 2;
            float clip = (width - height) / 2;
            left = clip;
            right = width - clip;
            top = 0;
            bottom = height;
            width = height;
            dst_left = 0;
            dst_top = 0;
            dst_right = height;
            dst_bottom = height;
        }
        Bitmap output = Bitmap.createBitmap(width,
                height, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom);
        final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom);
        final RectF rectF = new RectF(dst);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, src, dst, paint);
        return output;
    }
}



相關文章