Android实现选择图片或拍照设置头像的代码示例
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应用中实现通过手机拍照或从本地相册选取图片并进行裁剪设置头像的完整流程。这个过程涵盖了启动相机、选择相册图片、裁剪图片以及显示结果等关键步骤,是许多社交类应用中常用的一个功能实现。
2023-11-25 上传
2023-05-31 上传
2023-04-25 上传
2023-09-03 上传
2023-06-09 上传
2023-06-13 上传
weixin_38625464
- 粉丝: 5
- 资源: 937
最新资源
- Angular实现MarcHayek简历展示应用教程
- Crossbow Spot最新更新 - 获取Chrome扩展新闻
- 量子管道网络优化与Python实现
- Debian系统中APT缓存维护工具的使用方法与实践
- Python模块AccessControl的Windows64位安装文件介绍
- 掌握最新*** Fisher资讯,使用Google Chrome扩展
- Ember应用程序开发流程与环境配置指南
- EZPCOpenSDK_v5.1.2_build***版本更新详情
- Postcode-Finder:利用JavaScript和Google Geocode API实现
- AWS商业交易监控器:航线行为分析与营销策略制定
- AccessControl-4.0b6压缩包详细使用教程
- Python编程实践与技巧汇总
- 使用Sikuli和Python打造颜色求解器项目
- .Net基础视频教程:掌握GDI绘图技术
- 深入理解数据结构与JavaScript实践项目
- 双子座在线裁判系统:提高编程竞赛效率