上传头像

来源:互联网 发布:淘宝管制刀具的定义为 编辑:程序博客网 时间:2024/05/29 07:05
private static final String TAG = "MainActivity";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;

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_PICK,                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);                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(MainActivity_HostMessage.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);}@Overrideprotected 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");        Log.d(TAG,"setImageToView:"+photo);        photo = ImageUtils.toRoundBitmap(photo); // 这个时候的图片已经被处理成圆形的了        userimg.setImageBitmap(photo);        uploadPic(photo);    }}private void uploadPic(Bitmap bitmap){    // 上传至服务器    // ... 可以在这里把Bitmap转换成file,然后得到fileurl,做文件上传操作    // 注意这里得到的图片已经是圆形图片了    // bitmap是没有做个圆形处理的,但已经被裁剪了    String imagePath = ImageUtils.savePhoto(bitmap, Environment            .getExternalStorageDirectory().getAbsolutePath(), String            .valueOf(System.currentTimeMillis()));    Log.e("imagePath", imagePath+"");    if (imagePath!=null){        // 拿着imagePath上传了        // ...        String uid = sp.getString("uid", "");        Log.i("id",uid);        Log.i(TAG,"imagePath:"+imagePath);        File file=new File(imagePath);        OkHttp3Utils.uploadPic(Api.HEAD+uid,file,file.getName());        Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();    }}
//image工具
package test.bwei.com.zhangjian20171008xiangji;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;   }}