Android实现选择图片或拍照设置头像的代码示例

3 下载量 156 浏览量 更新于2024-08-29 1 收藏 48KB PDF 举报
"这篇教程将介绍如何在Android应用中实现让用户通过手机拍照或从本地相册选取图片,并进行裁剪来设置头像的功能。" 在Android开发中,为应用程序添加设置头像的功能是一项常见的需求,这通常涉及到访问用户的相机和相册。下面我们将详细讲解如何在Android应用中实现这一功能。 首先,我们需要创建一个`MainActivity`,在这个活动中包含一个用于显示头像的`ImageView`以及两个按钮,一个用于打开相机,另一个用于打开相册。在`MainActivity.java`文件中,我们导入所需的库和类,例如`ActionBarActivity`、`View`、`Button`、`ImageView`、`Intent`、`Bitmap`等。 ```java import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; ``` 接着,我们定义常量来存储头像文件名、请求码以及裁剪后的图片尺寸。例如: ```java private static final String IMAGE_FILE_NAME = "temp_head_image.jpg"; private static final int CODE_GALLERY_REQUEST = 0xa0; // 从相册选取图片的请求码 private static final int CODE_CAMERA_REQUEST = 0xa1; // 使用相机拍照的请求码 private static final int CODE_RESULT_REQUEST = 0xa2; // 裁剪结果的请求码 private static int output_X = 480; // 裁剪后的宽度 private static int output_Y = 480; // 裁剪后的高度 ``` 在`onCreate`方法中,初始化`ImageView`和按钮,并为它们设置点击事件监听器。点击事件会触发打开相机或相册的`Intent`。 ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); headImage = (ImageView) findViewById(R.id.head_image); Button btnChooseFromGallery = (Button) findViewById(R.id.btn_choose_from_gallery); Button btnTakePhoto = (Button) findViewById(R.id.btn_take_photo); btnChooseFromGallery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openGallery(); } }); btnTakePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openCamera(); } }); } ``` `openGallery()`方法用于打开系统相册,选择图片: ```java private void openGallery() { Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(galleryIntent, CODE_GALLERY_REQUEST); } ``` `openCamera()`方法则是启动相机: ```java private void openCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photoFile = createImageFile(); if (photoFile != null) { Uri photoURI = Uri.fromFile(photoFile); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(cameraIntent, CODE_CAMERA_REQUEST); } } private File createImageFile() { // 创建一个文件来保存拍摄的照片 try { File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( IMAGE_FILE_NAME, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return image; } catch (IOException e) { e.printStackTrace(); return null; } } ``` 当用户从相册选取或拍照完成后,系统会回调`onActivityResult`方法,这里我们需要处理返回的图片并进行裁剪: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == CODE_GALLERY_REQUEST) { // 从相册选取的图片 handleCrop(data.getData()); } else if (requestCode == CODE_CAMERA_REQUEST) { // 拍照的照片 handleCrop(Uri.fromFile(createImageFile())); } } } private void handleCrop(Uri uri) { Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(uri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", output_X); cropIntent.putExtra("aspectY", output_Y); cropIntent.putExtra("outputX", output_X); cropIntent.putExtra("outputY", output_Y); cropIntent.putExtra("return-data", true); startActivityForResult(cropIntent, CODE_RESULT_REQUEST); } ``` 最后,在`onActivityResult`中处理裁剪后的图片并将其显示在`ImageView`上: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CODE_RESULT_REQUEST && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap bitmap = extras.getParcelable("data"); headImage.setImageBitmap(bitmap); } } ``` 以上就是Android应用中实现通过手机拍照或从本地相册选取图片并进行裁剪设置头像的完整流程。这个过程涵盖了启动相机、选择相册图片、裁剪图片以及显示结果等关键步骤,是许多社交类应用中常用的一个功能实现。