Android头像更换

直接上代码:

TestActivity.java


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

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class TestActivity extends Activity implements OnClickListener {
	/** 需要被更换的头像 */
	private ImageView mAvatar;
	/** 剪切后的map对象 */
	private Bitmap mBitmap;
	/** 头像文件 **/
	private File mFinalPicFile;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initView();
	}

	private void initView() {
		mAvatar = (ImageView) findViewById(R.id.iv);
		mAvatar.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.iv:
			GetPicUtil.getImgFromLocal(this, 10000);
			break;

		default:
			break;
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		if (10000 == requestCode) {
			// 从本地选择图片
			// 看完相册后,将点击的图片uri传给剪切板
			if (data != null) {
				Uri imgUrl = data.getData();
				zoomPhoto(imgUrl, requestCode);
			}
		}
		if (11000 == requestCode) {
			if (data != null) {
				Bundle bundle_2 = data.getExtras();
				mBitmap = (Bitmap) bundle_2.get("data");
				saveImage(mBitmap, getFinalPicFile());
				// 从截取相册头像返回
				// 判断文件长度不为0,用户执行了截取图片操作
				if (mFinalPicFile.length() != 0f) {

					// 在截取好的本地图片上传到服务器上
					// updateUserAvatar(mFinalPicFile);
					Bitmap bm = BitmapFactory.decodeFile(mFinalPicFile
							.getPath());
					mAvatar.setImageBitmap(bm);
				}
			}
		}
	}

	/**
	 * 裁剪图片
	 * 
	 * @param uri
	 * @param num_position
	 */
	private void zoomPhoto(Uri uri, int num_position) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		intent.putExtra("crop", "true");
		intent.putExtra("scale", true); // 设置是否允许拉伸
		// aspectX aspectY 是宽高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪图片宽高
		intent.putExtra("outputX", 256);
		intent.putExtra("outputY", 256);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 设置输出格式
		intent.putExtra("return-data", true);
		// 这里必须要加1000
		startActivityForResult(intent, num_position + 1000);
	}

	/**
	 * 获取剪切后图片的缓存路径
	 * 
	 * @return
	 */
	private File getFinalPicFile() {
		// 临时文件名
		String temp = GetPicUtil.getPhotoFileName();

		/**
		 * files下pictures的路径,String为文件夹名
		 * 
		 * 即:/mnt/sdcard/Android/data/'包名'/files/Pictures/'String'
		 */
		File dirFile = new File(
				this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
				"avatar");

		if (!dirFile.exists()) {
			if (!dirFile.mkdir())
				try {
					throw new Exception("目录不存在,创建失败!");
				} catch (Exception e) {
					e.printStackTrace();
				}
		}

		// 默认在sdcard根目录下 可以自定义目录
		mFinalPicFile = new File(dirFile.getPath() + File.separator + temp);

		// 出错点,输出流的真实输出文件,也要进行判断路径,不存在时,要进行创建。
		if (!mFinalPicFile.exists()) {
			try {
				mFinalPicFile.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return mFinalPicFile;
	}

	/**
	 * 缓存图片
	 * 
	 * @param bmp
	 * @param file
	 */
	private void saveImage(Bitmap bmp, File file) {
		file.mkdirs();
		try {
			FileOutputStream out = new FileOutputStream(file);

			bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
			out.flush();
			out.close();

			if (!file.exists()) {
				Toast.makeText(TestActivity.this, "文件路径出错", Toast.LENGTH_SHORT)
						.show();
			}
			MediaScannerConnection.scanFile(this,
					new String[] { file.getAbsolutePath() }, null, null);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


GetPicUtil.java


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;

/**
 * 图片获取工具类
 * 
 * @author Administrator
 * 
 */
public class GetPicUtil
{

	public static File mPhotoFile;
	public static String imageBasePath;

	public static void fromTakeAPhoto(Activity activity, int CAMERA_WITH_DATA)
	{

		try
		{
			// 临时文件名
			String temp = getPhotoFileName();

			// 这里获得路径是项目在手机上安卓目录下,项目名下,files下pictures的路径,String为文件夹名
			File dirFile = new File(
					activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
					"qtx");
			if (!dirFile.exists())
			{
				if (!dirFile.mkdir())
					try
					{
						throw new Exception("目录不存在,创建失败!");
					} catch (Exception e)
					{
						e.printStackTrace();
					}
			}

			// 默认在sdcard根目录下 可以自定义目录
			mPhotoFile = new File(dirFile.getPath() + File.separator + temp);

			Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
					Uri.fromFile(mPhotoFile));

			activity.startActivityForResult(cameraIntent, CAMERA_WITH_DATA + 1);
		} catch (ActivityNotFoundException e)
		{
			e.printStackTrace();
		}
	}

	// 获取拍照获取图片名
	@SuppressLint("SimpleDateFormat")
	public static String getPhotoFileName()
	{
		Date date = new Date(System.currentTimeMillis());
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				"'IMG'_yyyyMMdd_HHmmss");
		return dateFormat.format(date) + ".jpg";
	}

	/**
	 * 获取本地图片
	 * 
	 * @param activity
	 * @param requestCode
	 */
	public static void getImgFromLocal(Activity activity, int requestCode)
	{
		Intent localIntent = new Intent();
		localIntent.setAction(Intent.ACTION_PICK);
		localIntent.setDataAndType(
				MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
		activity.startActivityForResult(localIntent, requestCode);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值