如果使用Android的ACTION_CHOOSER无法打开相机应用,可能是因为没有正确设置Intent的数据和类型。下面是一个示例代码来解决这个问题:
private void openCamera() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 创建一个文件来保存照片
File photoFile = createImageFile();
if (photoFile != null) {
Uri photoUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// 创建一个选择器来选择相机应用
Intent chooserIntent = Intent.createChooser(takePictureIntent, "选择相机应用");
List cameraActivities = getPackageManager().queryIntentActivities(chooserIntent, PackageManager.MATCH_DEFAULT_ONLY);
// 只添加支持拍照的应用到选择器
for (ResolveInfo activity : cameraActivities) {
String packageName = activity.activityInfo.packageName;
grantUriPermission(packageName, photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivityForResult(chooserIntent, 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);
mCurrentPhotoPath = imageFile.getAbsolutePath();
return imageFile;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
在上面的代码中,我们首先创建一个Intent来打开相机应用。然后,我们创建一个文件来保存照片,并将文件的URI设置为Intent的额外输出。接下来,我们创建一个选择器Intent来选择相机应用,并使用queryIntentActivities()方法来获取已安装的支持拍照的应用程序列表。最后,我们将选择器Intent传递给startActivityForResult()方法以启动选择器。