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 2 和 Note 上获取位置
Galaxy Tab 10.1 上的 Android ADK 错误