相机图像捕获没有 Return 数据 - 在某些设备上
Camera Image Capture Does Not Return Data - on Some Device(s)
我已经开始在 Moto E2 上测试我的应用程序,它是第一个 Android Lollipop 设备之一。原来我 用相机 捕捉图像时出乎意料地遇到了问题。我收不到照片。
使用以下方法创建图像捕获意图:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, PICK_FROM_CAMERA);
返回到我的 activity 后,Intent
不包含任何数据,即 data.getData()
returns null。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) return;
switch(requestCode) {
case PICK_FROM_CAMERA:
(...)
}
}
Moto E2 运行 Android 5.0.2:
现在这里有大量关于 SO 的问题,它们具有相似的问题和各种不同的原因。真正让我困惑的是这段代码在我的其他 Android 设备 运行 KitKat 和 Jelly Bean 上工作得很好(见下文)。 此行为的原因可能是什么,我该如何解决?
在 Galaxy S4 mini 运行 Android 4.4.2 上:
问题可以按照上面 Jibran Khan 的评论解决(摘自 https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent 的 Android 文档)。
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
...
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
和
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
其中 mCurrentPhotoPath
可用于提取 onActivityResult()
中的文件。
这个 returns 全尺寸图像的路径与 data
参数相反,returns 一个缩略图。
Android 5.0
有一些额外的过滤来处理 Intent
。因此,您可能必须以这种方式处理它。您可以尝试一下,因为它已在相机 API 中更改为 5.0
这里有一部分
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
可以在 Android 5.0 API
更改的文档中找到更多详细信息。
https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent
我在不同制造商和 Android 版本的不同 Android 设备上也遇到了一些相机意图问题(请在此处查看原始 post:Summary: Take a picture utilizing Camera Intent and display the photo with correct orientation (works on hopefully all devices))
我在 github 上发布了我的代码:
https://github.com/ralfgehrer/AndroidCameraUtil
我已经开始在 Moto E2 上测试我的应用程序,它是第一个 Android Lollipop 设备之一。原来我 用相机 捕捉图像时出乎意料地遇到了问题。我收不到照片。
使用以下方法创建图像捕获意图:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, PICK_FROM_CAMERA);
返回到我的 activity 后,Intent
不包含任何数据,即 data.getData()
returns null。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) return;
switch(requestCode) {
case PICK_FROM_CAMERA:
(...)
}
}
Moto E2 运行 Android 5.0.2:
现在这里有大量关于 SO 的问题,它们具有相似的问题和各种不同的原因。真正让我困惑的是这段代码在我的其他 Android 设备 运行 KitKat 和 Jelly Bean 上工作得很好(见下文)。 此行为的原因可能是什么,我该如何解决?
在 Galaxy S4 mini 运行 Android 4.4.2 上:
问题可以按照上面 Jibran Khan 的评论解决(摘自 https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent 的 Android 文档)。
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
...
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
和
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
其中 mCurrentPhotoPath
可用于提取 onActivityResult()
中的文件。
这个 returns 全尺寸图像的路径与 data
参数相反,returns 一个缩略图。
Android 5.0
有一些额外的过滤来处理 Intent
。因此,您可能必须以这种方式处理它。您可以尝试一下,因为它已在相机 API 中更改为 5.0
这里有一部分
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
可以在 Android 5.0 API
更改的文档中找到更多详细信息。
https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent
我在不同制造商和 Android 版本的不同 Android 设备上也遇到了一些相机意图问题(请在此处查看原始 post:Summary: Take a picture utilizing Camera Intent and display the photo with correct orientation (works on hopefully all devices))
我在 github 上发布了我的代码: https://github.com/ralfgehrer/AndroidCameraUtil