Android 10 调用拍照
在Android开发中,我们经常需要使用摄像头来拍照或录制视频。Android提供了丰富的API来实现这些功能。本文将重点介绍如何在Android 10及以上版本中调用拍照功能,并提供相应的代码示例。
前提条件
在Android 10及以上版本中,应用需要获得用户授权才能访问摄像头。因此,我们需要在AndroidManifest.xml文件中添加相应的权限声明和权限请求代码。
首先,在<manifest>
标签中添加以下权限声明:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
其中,android.permission.CAMERA
权限用于访问摄像头,android.permission.WRITE_EXTERNAL_STORAGE
权限用于保存拍摄的照片。
然后,在<application>
标签中添加以下代码以请求权限:
<application>
...
<activity android:name=".MainActivity">
...
</activity>
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
</application>
以上代码将请求访问摄像头的权限,并声明应用可以处理拍照意图。
调用拍照
在Android中,我们可以使用Intent
来调用系统相机应用,以实现拍照功能。Android 10及以上版本提供了一种新的方式来处理拍照意图,即通过Uri
来传递图片的保存路径。
首先,在MainActivity
中添加以下代码来创建拍照意图并启动相机应用:
private static final int REQUEST_IMAGE_CAPTURE = 1;
private Uri photoUri;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = createImageFile();
if (photoFile != null) {
photoUri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
private File createImageFile() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
try {
File imageFile = File.createTempFile(imageFileName, ".jpg", storageDir);
return imageFile;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
以上代码中,dispatchTakePictureIntent()
方法会创建一个拍照意图,并调用系统相机应用。createImageFile()
方法用于创建一个临时的图片文件,并获取其Uri
。
然后,我们需要在onActivityResult()
方法中处理相机应用返回的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// 处理拍照结果
Bitmap bitmap = BitmapFactory.decodeFile(photoUri.getPath());
imageView.setImageBitmap(bitmap);
}
}
以上代码中,我们可以从photoUri
中获取拍照的照片,并进行相应的处理。
总结
通过以上步骤,我们可以在Android 10及以上版本中调用拍照功能。首先,在AndroidManifest.xml文件中添加相应的权限声明和权限请求代码。然后,在MainActivity
中创建拍照意图,并处理相机应用返回的结果。
值得注意的是,在Android 10中,我们需要使用Uri
来传递图片的保存路径。这是因为Android 10之后,应用被隔离在私有目录中,无法访问其他应用的文件。因此,我们需要使用FileProvider
来获取合适的Uri
。
希望本文对你理解如何在Android 10中调用拍照功能有所帮助。
参考文献:
- [Android Developer Documentation - Android 10 Privacy Changes](
- [Android Developer Documentation - Camera app](