我目前正在开发一个应用程序,以便于从Android的Gallery应用程序共享Panorama和Photosphere图像。
我的理解是,全景图片的mimetype报告为application/vnd.google.panorama360+jpg
(来源:https://developers.google.com/photo-sphere/android/?hl=en),因此,我AndroidManifest.xml
的以下片段应该足以让photospheres成为从Gallery应用程序分享到我的活动:
<activity
android:name=".SphereUploadActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<data android:mimeType="application/vnd.google.panorama360+jpg" />
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
这适用于我自己的设备(Nexus 5,Android 4.4.2),在360°全景图像的共享菜单中显示我的应用程序。在我测试的任何其他设备上,我的应用程序从未出现(我在相同的Nexus 5,Nexus 4和Nexus 7平板电脑上进行了测试)。我肯定每次尝试共享全景图像,我已经尝试重新安装,清除应用程序数据,重新启动设备 - 除了恢复出厂设置之外的一切都试图让它破坏我的设备,或者修复其他设备。
在我测试期间,我也尝试放宽我的mime类型限制,仅过滤image/*
。奇怪的是,这导致我的应用程序始终显示在共享菜单中,在所有设备上,并且它工作正常,除了显示为所有图像的选项,而不仅仅是全景图。由于我的应用程序仅用于处理photospheres,我显然不会将我的应用程序列为常规照片的共享选项。
我尝试过的另一件事是记录我在活动中收到的URI的mime类型。我使用上面描述的轻松意图过滤器运行此操作,以便我可以使用我SphereViewActivity
中的以下代码测试我可用的所有设备:
Uri imageUri = (Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
Log.d("PANO MIME TYPE", getContentResolver().getType(imageUri);
奇怪的是,这总是记录image/jpeg
,无论我在哪台设备上,包括我在工作设备上测试时启用了全景模式的mime类型的intent-filter而禁用了通用图像。在这种情况下,我希望至少它应该报告为正确的全景mime类型。
我已经在StackOverflow和其他一些网站上进行了大量的研究。我发现Christopher Orr's blog post on photosphere mime types对于验证我在清单中使用了正确的intent过滤器非常有用,但对此特定问题没有帮助。我遇到的所有其他问题都是意图过滤明显的问题,这些问题已经很容易解决了 - 我没有遇到任何有过与我似乎有同样问题的人。我还浏览了Android平台软件包源代码中Gallery2应用程序的源代码,但没有找到任何有用的东西 - 它让我觉得全景图正常分享并没有什么不同。
所以,我或多或少地出于想法 - 任何建议都将受到高度赞赏!
答案 0 :(得分:1)
经过大量的日志记录和调试后,我发现问题是Camera应用程序只报告带有Sphere mimetype的Photo Shere图像,如果它足够大,需要特殊渲染。也就是说,如果在Photo Sphere模式下仅捕获一个或两个帧,则图像的mime类型为image/jpeg
,但如果捕获了一个完整的球体,则mime类型将被正确报告为{{1} }。
我不确定这种行为是否是相机应用程序的错误,因为它似乎在根据捕获所包含的区域确定图像是否实际上是一个照片球体。无论mime类型如何,XMP照片元数据都可以described by Google,并且可以从图像中进行解析。
对于我的特定应用,我最终不得不接受 application/vnd.google.panorama360+jpg
或image/jpeg
图像。然后我有一个asynctask解析图像中的XMP数据,以检测它是否具有必要的Photo Sphere元数据,并相应地采取相应措施(如果元数据不存在则退出Toast消息)。