捕捉图像后,Android 5.1.1默认相机在onActivityResult中返回空的意图

我有以下代码,要求用户从照片应用程序中select图像或通过相机应用程序捕捉图像:

// 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 (一起更新相机应用程序到最新版本),代码不能很好地请求默认相机捕捉照片。

根据debugging器,当代码达到final String action = data.getAction(); 在通过默认相机应用程序捕获图像后, 结果Intent data总是一个空的Intent(不是null,但不包含动作,额外数据final String action = data.getAction(); 总是返回null,失败我的下面的代码。

我猜想5.1.1中的默认相机应用会改变一些东西,所以相机的意图行为是不同的。 但是,我不知道如何使它工作。

任何build议,将不胜感激。 谢谢!

Related of "捕捉图像后,Android 5.1.1默认相机在onActivityResult中返回空的意图"

我又增加了一个条件。 在5.1.1以及不同的API级别看起来工作正常,没有任何问题

 if(data == null){ isCamera = true; }else if(data.getData() == null){ isCamera = true; } else{ //.... 

你的猜测是正确的,有棒棒糖的变化: http : //developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE

public static final String ACTION_IMAGE_CAPTURE在API级别3中添加

可以发送的标准意图操作让相机应用程序捕捉图像并将其返回。

调用者可以传递一个额外的EXTRA_OUTPUT来控制这个图像的写入位置。 如果EXTRA_OUTPUT不存在,则在额外的字段中将小图像作为位图对象返回。 这对于只需要小图像的应用程序很有用。 如果EXTRA_OUTPUT存在,则全尺寸的图像将被写入EXTRA_OUTPUT的Uri值。 从LOLLIPOP开始,这个uri也可以通过setClipData(ClipData)来提供。 如果使用这种方法,您仍然必须通过EXTRA_OUTPUT字段提供uri,以便与旧应用程序兼容。 如果你没有设置ClipData,在调用startActivity(Intent)的时候会被复制。

你需要在意图中设置ClipData,这就是我所做的

 intent.setClipData(ClipData.newRawUri(null, Uri.fromFile(file))); 

在你的情况下,我认为这是

 intent.setClipData(ClipData.newRawUri(null, outputFileUri)); 

另外我不设置MediaStore.EXTRA_OUTPUT,因为对我来说,它返回空数据,我不知道如何得到一个空数据,设置MediaStore.EXTRA_OUTPUT,但这是另一回事: 相机活动返回null android