在安卓手机上选择图片主要有两种方式:从系统相册选择图片和直接拍照。以下是具体实现方法:
一、从系统相册选择图片
使用隐式Intent启动相册 通过`Intent.ACTION_GET_CONTENT`或`Intent.ACTION_OPEN_DOCUMENT`(推荐)启动相册选择器,用户可以选择单张图片并返回结果。
```java
private static final int REQUEST_IMAGE_CODE = 10086;
Button btnSelectImage = findViewById(R.id.btnSelectImage);
btnSelectImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= 19) {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
} else {
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
}
startActivityForResult(intent, REQUEST_IMAGE_CODE);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CODE && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri imageUri = data.getData();
// 处理图片Uri,例如加载到ImageView
}
}
```
使用文件选择器库(如Material File Picker)
可以使用第三方库简化文件选择流程,例如[Material File Picker](https://github.com/petersonh/MaterialFilePicker)。
二、直接拍照
使用相机应用启动拍照
通过`Intent.ACTION_IMAGE_CAPTURE`启动相机应用,用户拍照后直接返回结果。
```java
private static final int REQUEST_IMAGE_CAPTURE_CODE = 10087;
Button btnTakePhoto = findViewById(R.id.btnTakePhoto);
btnTakePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
Uri photoUri = FileProvider.getUriForFile(this, "com.example.imageprovider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
} catch (IOException ex) {
// 处理异常
}
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE_CODE);
}
}
});
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
return image;
}
```
权限配置
需在`AndroidManifest.xml`中添加读取外部存储的权限:
```xml
```
对于Android 10及以上版本,还需在运行时申请权限。
三、注意事项
权限管理: 部分功能需在`AndroidManifest.xml`中添加权限,并在运行时动态申请(如Android 6.0及以上)。 兼容性处理
结果处理:`onActivityResult`中需正确处理返回的`Uri`,避免内存泄漏。
通过以上方法,可以实现从相册选择图片或直接拍照的功能。