Android 上传头像,解决小米3等手机无法直接得到裁剪照片问题

package com.zy.tour.usercenter.personinfo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


/**
 * 个人信息:可编辑
 * 
 * @author Administrator
 * 
 */
@SuppressLint({ "InflateParams", "HandlerLeak", "ShowToast" })
public class PersonalInfoActivity extends BaseActivity implements
		OnClickListener, ContantsUtils {
	private CircleImageView userImagCircleImageView;// 用户头像
	private Uri photoUri;// 照片路径
	private final int PIC_FROM_CAMERA = 0x10086;// 拍照
	private final int PIC_FROM_LOCALPHOTO = 0x10087;// 设置图片
	private final int PIC_FROM_IMAGE = 0x10088;// 从本地选择图片
	private final int EDIT_NICHENG_CODE = 10086;
	private String keyName, valuseStr;// 当前修改的条目,当前要修改的值

	private Bitmap bitmap;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_user_info);
		userImagCircleImageView = (CircleImageView) findViewById(R.id.user_img);

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.linearlayout_edit_user_img:// 编辑头像
			if (setUserImagDialog == null) {// 如果对话框为null
				setUserImagDialog = new Dialog(this, R.style.my_dialog);
				// 设置进出动画
				setUserImagDialog.getWindow().setWindowAnimations(
						R.style.dialogAnimation);
				// 按返回键时可以隐藏dialog
				setUserImagDialog.setCancelable(true);
				// 显示弹出框
				setUserImagDialog.show();
				View layout = getLayoutInflater().inflate(
						R.layout.set_user_img, null);
				// 设置布局
				setUserImagDialog.getWindow().setContentView(layout);
				layout.findViewById(R.id.linearlayout_setimg_from_camera)
						.setOnClickListener(this);
				layout.findViewById(R.id.linearlayout_setimg_from_location)
						.setOnClickListener(this);
				layout.findViewById(R.id.textview_cancle).setOnClickListener(
						this);
			} else {// 否则就直接展示
				setUserImagDialog.show();
			}
			break;
		case R.id.linearlayout_setimg_from_camera:// 拍照设置头像
			if (setUserImagDialog != null) {
				setUserImagDialog.dismiss();
			}
			doHandlerPhoto(PIC_FROM_CAMERA);// 用户点击了从照相机获取
			break;
		case R.id.linearlayout_setimg_from_location:// 从本地选择图片
			doHandlerPhoto(PIC_FROM_IMAGE);// 从相册中去获取
		case R.id.textview_cancle:// 取消
			if (setUserImagDialog != null) {
				setUserImagDialog.dismiss();
			}
			break;
		default:
			break;
		}
	}

	/**
	 * 检查是否存在SDCard
	 * 
	 * @return
	 */
	public static boolean hasSdcard() {
		String state = Environment.getExternalStorageState();
		if (state.equals(Environment.MEDIA_MOUNTED)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 根据不同方式选择图片设置ImageView
	 * 
	 * @param type
	 *            0-本地相册选择,非0为拍照
	 */
	private void doHandlerPhoto(int type) {
		try {
			// 保存裁剪后的图片文件
			File pictureFileDir = new File(
					Environment.getExternalStorageDirectory(), "/upload");
			if (!pictureFileDir.exists()) {
				pictureFileDir.mkdirs();
			}
			File picFile = new File(pictureFileDir, "upload.jpeg");
			if (!picFile.exists()) {
				picFile.createNewFile();
			}
			photoUri = Uri.fromFile(picFile);

			if (type == PIC_FROM_IMAGE) {// 从来本地获得
				Intent intent = getCropImageIntent();
				startActivityForResult(intent, PIC_FROM_IMAGE);
			} else {// 拍照
				Intent cameraIntent = new Intent(
						MediaStore.ACTION_IMAGE_CAPTURE);
				cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
				startActivityForResult(cameraIntent, PIC_FROM_CAMERA);
			}

		} catch (Exception e) {
			Log.i("HandlerPicError", "处理图片出现错误");
		}
	}

	/**
	 * 调用图片剪辑程序
	 */
	public Intent getCropImageIntent() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
		intent.setType("image/*");
		setIntentParams(intent);
		return intent;
	}

	/**
	 * 启动裁剪
	 */
	private void cropImageUriByTakePhoto() {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(photoUri, "image/*");
		setIntentParams(intent);
		startActivityForResult(intent, PIC_FROM_LOCALPHOTO);
	}

	/**
	 * 设置公用参数
	 */
	private void setIntentParams(Intent intent) {
		intent.putExtra("crop", "true");
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", 600);
		intent.putExtra("outputY", 600);
		intent.putExtra("noFaceDetection", true); // no face detection
		intent.putExtra("scale", true);
		intent.putExtra("return-data", false);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case PIC_FROM_IMAGE:// 从本地选择照片
			Uri uri = data.getData();//普通手机选择后返回的是空
			if (uri != null && uri.toString().contains("content://")) {//小米3手机返回的content://....
				userImagCircleImageView.setImageURI(data.getData());
				bitmap = ((BitmapDrawable) userImagCircleImageView
						.getDrawable()).getBitmap();
				try {
					OutputStream os = new FileOutputStream(photoUri.getPath());
					bitmap.compress(CompressFormat.PNG, 100, os);
					os.flush();
					os.close();
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			} else {
				onActivityResult(PIC_FROM_LOCALPHOTO, 0, null);
			}
		case PIC_FROM_CAMERA: // 拍照选择相片
			try {
				cropImageUriByTakePhoto();
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		case PIC_FROM_LOCALPHOTO:// 设置图片
			try {
				if (photoUri != null) {
					Bitmap bitmap = decodeUriAsBitmap(photoUri);
					userImagCircleImageView.setImageBitmap(bitmap);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		}
	}

	private Bitmap decodeUriAsBitmap(Uri uri) {
		Bitmap bitmap = null;
		try {
			bitmap = BitmapFactory.decodeStream(getContentResolver()
					.openInputStream(uri));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}
		return bitmap;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值