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](