【发布时间】:2015-09-03 13:47:33
【问题描述】:
我有以下代码要求用户从照片应用程序中选择图像或通过相机应用程序捕获图像:
// Camera
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = fragment.getActivity().getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for(ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
cameraIntents.add(intent);
}
// Filesystem.
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
fragment.startActivityForResult(chooserIntent, UPLOAD_IMAGE_ACTIVITY_REQUEST_CODE);
还有我的 onActivityResult 代码:
if(requestCode == UPLOAD_IMAGE_ACTIVITY_REQUEST_CODE)
{
final boolean isCamera;
if(data == null)
{
isCamera = true;
}
else
{
final String action = data.getAction(); // data is always empty here after capture image by default camera in 5.1.1!
if(action == null)
{
isCamera = false;
}
else
{
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}
//do sth according to value of isCamera
}
这些代码在以前的 android 版本中运行良好。但是,当我将我的 nexus 5 更新到 Android 5.1.1(同时将相机应用程序更新到最新版本)时,请求默认相机拍摄照片时,代码无法正常工作。
根据调试器,当代码在默认相机应用程序捕获图像后到达final String action = data.getAction();时,结果 Intent data 始终是一个空 Intent(虽然不是 null),其中不包含任何操作、额外内容、数据等。所以final String action = data.getAction();总是返回null并且我的以下代码失败了。
我想 5.1.1 中的默认相机应用程序发生了一些变化,因此相机意图行为有所不同。但后来我不知道如何使它工作。
任何建议将不胜感激。谢谢!
【问题讨论】:
-
你的问题解决了吗我也遇到了同样的问题
-
@Tony 对不起,我没有,最后我的解决方法只是将照片保存在外部存储中,在存储后创建 URI 的静态全局变量,并检查此静态变量是否为调用 onActivityResult 时不为 Null...(并且每次调用相机时,先将此全局变量设置为 null)
标签: android android-intent camera android-camera-intent