Galaxy Tab Limited Edition 中的相机图像捕获意图无法返回

Posted

技术标签:

【中文标题】Galaxy Tab Limited Edition 中的相机图像捕获意图无法返回【英文标题】:Camera Image Capture Intent fails to return in Galaxy Tab Limited Edition 【发布时间】:2011-09-14 08:42:23 【问题描述】:

当我打开带有 Intent 的相机时,我遇到了 Galaxy Tab 限量版 (Google I/O) 的问题。

这是我的代码:

意图 imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(新 文件(mSavedFilePath))); startActivityForResult(imageCaptureIntent, REQUEST_IMAGE_CAPTURE);

在摩托罗拉 Xoom 上,此代码运行良好。 但在 Galaxy Tab 10.1 上,我从未收到相机应用的响应。

我没有堆栈跟踪,因为我没有错误。

有人知道吗?

【问题讨论】:

您无法从 logcat 获得任何信息? 您的设备更新到 3.1 了吗?许多内部应用程序在该设备上的 3.0 版本中存在错误。您可以尝试手动更新到 3.1 并重试。 【参考方案1】:

向相机应用启动 Intent 时不需要相机权限。 然而,这在 android 平台上是一个高度分散的过程。我有很多问题。基本上,如果您检查发送到相机应用程序的额外文件,您会注意到结果返回时他的大小为 0 字节。此错误存在于许多 android 设备中,您是修复大部分错误的解决方法,即当此错误失败时(这意味着没有返回可分析的额外输出,如果是,则未创建额外文件或长度为 0那么您需要从意图中获取 Uri,例如:intent.getData(); 这会将 uri 返回到文件,该文件的形成方式与 Extra Output Uri 基本相同,因此您之后可以使用相同的方法获取图像.

您会注意到图像存储在 Media.Images 提供程序和相机目录中,以及指向那里的 intent.getData() Uri。

希望这会有所帮助。不要忘记投票:D。

【讨论】:

感谢您的回复。我无法从 Intent 获取数据,因为相机不会将控件返回给我的应用程序。拍照后永远不会调用 onActivityResult()。 您是否使用 startActivityForResult(intent) 启动相机应用程序?哦,我看你是......但它应该至少返回某种结果......当你返回一个调用另一个结果的活动时,你总是会得到一个结果:D。这就是规则.. 它可能是 Activity.Cancel 或 Activity.Ok 或其他第三方代码... 但是相机应用程序仍有可能无法以标准方式运行。据我目前所见,android 没有明确的意图/方式来实际从相机意图中获得结果。这一切都取决于制造商的实施。尽管他们努力使之成为可能,但大多数时候他们都失败了,这是一个丑陋的事实,尤其是在测试版和早期版本中。 Uri u = data.getData();在三星手机上将提供 NullPointerException。【参考方案2】:

我也对此非常感到沮丧。但是,我确实找到了一个(相当可怜的)解决方法。

我应该说,我没有使用标准的 ACTION_IMAGE_CAPTURE Intent。因为我想在窗口中显示相机图像,所以我使用了自己的布局,并使用以下作为模板:

How to Program the Google Android Camera to Take Pictures

点击屏幕会调用Camera.PictureCallback函数onPictureTaken(byte[] imageData, Camera c),这是我抓取包含图片的byte[]的地方。我有一个全局变量“byte[] MainApplication.snapshotBytes”,由该函数中的 imageData 分配。

既然数据已经全局保存,并且可供调用的 Activity 使用,那么应该如何终止当前的 Activity 以便通知调用的 Activity?好吧,有很多方法,但我很早就意识到按下后退按钮仍然会调用 OnActivityResult(...)。所以,我做了以下事情:

   if (imageData != null)
       
      MainApp.snapshotBytes = imageData;

      setResult(RESULT_OK);
      onBackPressed();
   

调用的 Activity 现在负责另外三件事。

1:在启动相机Activity之前设置MainApp.snapshotBytes = null

2:调用OnActivityResult(...)时,首先检查*resultCode == RESULT_OK*,然后使用全局MainApp中存储的图像数据。快照字节。

3:最后,它再次设置MainApp.snapshotBytes = null,以便GC可以回收内存。

我将是第一个承认这是一个杂牌的人,但它可以工作并且兼容或不兼容 Camera-null-Intent 错误。

我希望这会有所帮助!

【讨论】:

【参考方案3】:

这听起来像一个错误...

但以防万一,您是否在您的 AndroidManifest.xml 中包含以下内容???

    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

您也可以尝试使用 Intent 不带额外功能。

    Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(imageCaptureIntent, REQUEST_IMAGE_CAPTURE);

生成的位图会更小,但至少你可以试试看它是否有效。 希望对你有帮助。

问候,

【讨论】:

【参考方案4】:

听起来可能和这个http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/有关

还有另一个open question 可能会提供更多信息

【讨论】:

以上是关于Galaxy Tab Limited Edition 中的相机图像捕获意图无法返回的主要内容,如果未能解决你的问题,请参考以下文章

android 多个 videoView 问题,特定于 Galaxy Tab

模拟三星 Galaxy Tab

无法在三星 Galaxy Tab 2 和 Note 上获取位置

Galaxy Tab 10.1 上的 Android ADK 错误

为 AVD 配置 Samsung Galaxy Tab 3 设备

三星 Galaxy Tab 中的 Sencha touch Textfield 突出显示行为