Android学习笔记之设置头像

本文介绍了在Android应用中为联系人和用户设置头像的方法。通过展示如何使用AlertDialog显示选择图片的途径(相册和相机),并提供相关代码细节。

最近在做个通讯录管理软件,需要给联系人和用户设置头像,之前这部分都没有接触过,所以在就找了一些资料和别人的源码看了一下,才大致搞懂了些。好东西不敢独享,所以就发上来和大家share一下。

一、显示选择获取图片的途径的对话框。

通常也就是相册和相机,使用alertdialog就可以了,一些具体的细节在下面代码里面有注释

//显示对话框
	private void showPicDialog() {
		new AlertDialog.Builder(this)
				.setTitle("设置头像")
				.setNegativeButton("相册", new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// 让对话框消失
						dialog.dismiss();
						// ACTION_PICK,从数据集合中选择一个返回,官方文档解释如下
						// Activity Action:
						// Pick an item from the data, returning what was
						// selected.
						Intent intent = new Intent(Intent.ACTION_PICK, null);
						// 设置数据来源和类型
						intent.setDataAndType(
								MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
								"image/*");
						startActivityForResult(intent, ALBUM_REQUEST_CODE);
					}
				})
				.setPositiveButton("拍照", new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int arg1) {
						dialog.dismiss();
						/**
						 * 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方
						 * 文档,you_sdk_path/docs/guide/topics/media/camera.html
						 */
						Intent intent = new Intent(
								MediaStore.ACTION_IMAGE_CAPTURE);
						// 打开图片所在目录,如果该目录不存在,则创建该目录
						File dirFile = new File(Constants.ALBUM_PATH);
						if (!dirFile.exists()) {
							dirFile.mkdirs();
						}
						// 将图片保存到该目录下
						intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
								.fromFile(new File(Constants.ALBUM_PATH,
										"tmpuser.jpg")));
						startActivityForResult(intent, CAMERA_REQUEST_CODE);
					}
				}).show();
	}

二、获取到图片之后,会调用onActivityResult方法来处理结果

	// 处理从其他Activity返回的数据
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.v(TAG, "requestCode:" + requestCode);
		if (resultCode == RESULT_OK) {
			switch (requestCode) {
			// 从相册返回
			case ALBUM_REQUEST_CODE:
				startPhotoZoom(data.getData());
				break;
			// 从相机返回
			case CAMERA_REQUEST_CODE:
				File tmp = new File(Constants.ALBUM_PATH + "tmpuser.jpg");
				startPhotoZoom(Uri.fromFile(tmp));
				break;
			// 从裁剪后返回
			case CROP_REQUEST_CODE:
				if (data != null) {
					setPicToView(data);
				}
				break;

			default:
				break;
			}
		}
三、对获取到图片进行裁剪,是指满足自己的需要

/**
	 * 将图片裁剪
	 * 
	 * @param uri
	 *            图片的uri地址
	 */
	private void startPhotoZoom(Uri uri) {
		Log.v(TAG, "Zoom:" + uri.toString());
		/*
		 * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页
		 * yourself_sdk_path/docs/reference/android/content/Intent.html
		 */
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
		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_REQUEST_CODE);
	}
四、最后还需要将获取的图片设置到控件上

//将取得的图片设置到控件上
	private void setPicToView(Intent data) {
		//取得返回的数据
		Bundle bundle = data.getExtras();
		//不为空则保存图片到本地并设置到控件上
		if (bundle != null) {
			Bitmap picture = bundle.getParcelable("data");
			try {
				ImageUtil.saveImage(picture, Constants.ALBUM_PATH, "user.jpg");
			} catch (IOException e) {
				e.printStackTrace();
			}
			pictureIBTN.setImageBitmap(picture);
		}
	}
五、这里附加几个将图片读写的方法,大家可以将他们封装成工具类,方便使用

/**
	 * 获取本地的图片
	 * @param path 图片所在路径
	 * @param filename 图片文件名
	 * @return 图片的bitmap对象
	 */
	public static Bitmap getLocalBitmap(String path,String filename){
		Bitmap bitmap = null;  
	    try  
	    {  
	        File file = new File(path+filename);  
	        if(file.exists())  
	        {  
	            bitmap = BitmapFactory.decodeFile(path+filename);  
	        }  
	    } catch (Exception e)  
	    {  
	        e.printStackTrace();
	    }  
	    
	    return bitmap;  
	}

	/**
	 * 保存图片
	 * @param bitmap 要保存的bitmap图片
	 * @param path 路径
	 * @param fileName 文件名
	 * @param ratio 图片压缩比率
	 * @throws IOException
	 */
	public static void saveImage(Bitmap bitmap, String path, String fileName,
			int ratio) throws IOException {
		File dirFile = new File(path);
		if (!dirFile.exists()) {
			dirFile.mkdir();
		}
		File myCaptureFile = new File(path + fileName);
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(myCaptureFile));
		bitmap.compress(Bitmap.CompressFormat.JPEG, ratio, bos);
		bos.flush();
		bos.close();
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值