Android开发--通过相册或拍照选择头像

来源:互联网 发布:java编码方式 编辑:程序博客网 时间:2024/04/28 11:16

        像一些需要显示个人资料的App中,选择并修改自己的个人头像是必须的,最近的项目中也有用到,做个笔记吧。总体的思路是,通过startActivityForResult方法,分别传递调用系统相册的Intent和调用相机拍照的Intent来做选择,之后调用Android系统中自带的图片剪裁,实现图片的剪裁并在onActivityResult方法中获取数据。下面来进行实践:

        1.点击拍照的按钮,则调用系统照相机,并把自己所拍摄的照片保存则自定义路径之下

        private void getPicFromCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 下面这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg")));startActivityForResult(intent, CAMERA_REQUEST);}
         接下来在onActivityResult方法中处理,如果resultCode为-1则表示拍照成功,执行图片剪裁的方法(图片剪裁的方法的稍后叙述)。
case CAMERA_REQUEST:switch (resultCode) {case -1://-1表示拍照成功File file = new File(Environment.getExternalStorageDirectory()+ "/test.jpg");if (file.exists()) {photoClip(Uri.fromFile(file));}break;default:break;}break;
            2.点击相册,调用系统相册
private void getPicFromPhoto() {Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");startActivityForResult(intent, PHOTO_REQUEST);}
             接下来在onActivityResult方法中处理,如果data不为null,则表示选取成功,执行图片剪裁的方法(图片剪裁的方法的稍后叙述)。
                case PHOTO_REQUEST:if (data != null) {photoClip(data.getData());}break;
            3.调用系统的图片剪裁进行图片的修理
        private void photoClip(Uri uri) {// 调用系统中自带的图片剪裁Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// 设置在开启的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, PHOTO_CLIP);}
              接下来在onActivityResult方法中处理,得到处理后的数据,并显示于ImageView之上
case PHOTO_CLIP:if (data != null) {Bundle extras = data.getExtras();if (extras != null) {Log.w("test", "data");Bitmap photo = extras.getParcelable("data");mImageView.setImageBitmap(photo);}}break;
附上整体

package com.example.test;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;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;public class MainActivity extends Activity implements OnClickListener {private Button photoButton;private Button cameraButton;private ImageView mImageView;private static final int PHOTO_REQUEST = 1;private static final int CAMERA_REQUEST = 2;private static final int PHOTO_CLIP = 3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);photoButton = (Button) findViewById(R.id.main_btn_photo);cameraButton = (Button) findViewById(R.id.main_btn_camera);mImageView = (ImageView) findViewById(R.id.main_img);photoButton.setOnClickListener(this);cameraButton.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch (arg0.getId()) {case R.id.main_btn_camera:getPicFromCamera();break;case R.id.main_btn_photo:getPicFromPhoto();break;default:break;}}private void getPicFromPhoto() {Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");startActivityForResult(intent, PHOTO_REQUEST);}private void getPicFromCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 下面这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg")));startActivityForResult(intent, CAMERA_REQUEST);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case CAMERA_REQUEST:switch (resultCode) {case -1://-1表示拍照成功File file = new File(Environment.getExternalStorageDirectory()+ "/test.jpg");if (file.exists()) {photoClip(Uri.fromFile(file));}break;default:break;}break;case PHOTO_REQUEST:if (data != null) {photoClip(data.getData());}break;case PHOTO_CLIP:if (data != null) {Bundle extras = data.getExtras();if (extras != null) {Log.w("test", "data");Bitmap photo = extras.getParcelable("data");mImageView.setImageBitmap(photo);}}break;default:break;}}private void photoClip(Uri uri) {// 调用系统中自带的图片剪裁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, PHOTO_CLIP);}}





0 0