【问题标题】:Android 5.1.1 default camera return empty intent in onActivityResult after capturing imageAndroid 5.1.1 默认相机在捕获图像后在 onActivityResult 中返回空意图
【发布时间】: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


【解决方案1】:

我又添加了一个条件。在 5.1.1 以及不同的 API 级别中,它似乎工作正常,没有任何问题

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

【讨论】:

  • 感谢您的建议。恕我直言,它需要一个更改而不是 data.getData() == null,条件应该是 data.getAction() == null。有用。在 5.1.1 上测试。
  • 实际上,WAKALEY,我在我的代码中有完全相反的检查:if (data.getAction() == null) isCamera= false;
【解决方案2】:

你猜对了,棒棒糖有变化:http://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE

公共静态最终字符串 ACTION_IMAGE_CAPTURE 在 API 级别 3 中添加

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

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

你需要在intent中设置ClipData,我就是这样做的

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

在你的情况下,我认为是

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

另外我没有设置 MediaStore.EXTRA_OUTPUT,因为对我来说它返回空数据,我不知道设置 MediaStore.EXTRA_OUTPUT 是如何获得空数据的,但这是另一回事:Camera activity returning null android

【讨论】:

  • 在代码中添加 intent.setClipData() 后仍然相同,它返回一个空意图(但不是 null)。
【解决方案3】:

我遇到了同样的问题,我添加了

mFileTemp.getParentFile().mkdirs();

在将 uri 传递给意图并为我解决之前。

【讨论】:

    【解决方案4】:

    经过一番研究和测试,我找到了解决方案。

    解决方案是在创建临时文件时将文件或文件对象的路径设为静态。

    private static String path;
    
     private File createImageFile() throws IOException {
            File storageDir = Environment.getExternalStorageDirectory();
            File image = File.createTempFile(
                    "hoivia_image",  /* prefix */
                    ".jpg",         /* suffix */
                    storageDir      /* directory */
            );
    path=image.getpath();
            return image;
        }
    

    这可能是因为当前活动对象在 onActivityResult() 处变为空。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2013-07-23
      • 2017-02-09
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2014-04-28
      相关资源
      最近更新 更多