CodenameOne:Capture.capturePhoto() 请求错误的权限?

Posted

技术标签:

【中文标题】CodenameOne:Capture.capturePhoto() 请求错误的权限?【英文标题】:CodenameOne: Capture.capturePhoto() requests wrong permission? 【发布时间】:2018-01-14 20:37:33 【问题描述】:

CodenameOne 的 Capture.capturePhoto(1000, -1) 似乎与 android targetSDKVersion 21 权限配合良好。但在 23 日,它错误地请求了一个

允许 [...] 访问您设备上的照片媒体和文件吗?

来自用户的许可,但由于缺少android.permission.CAMERA 而失败。

(没有摄像头的模拟器会请求媒体文件 - 会不会有什么混淆?)

更新(DDMS 输出)

08-09 15:13:47.866: W/ActivityManager(1676): Permission Denial: starting Intent  act=android.media.action.IMAGE_CAPTURE flg=0x4000003 cmp=com.sec.android.app.camera/.Camera clip=text/uri-list U:file:///storage/emulated/0/Pictures/XXX/IMG_20170809_151347.jpg (has extras)  from ProcessRecordf736f3f 20079:com.XXX/u0a338 (pid=20079, uid=10338) with revoked permission android.permission.CAMERA
08-09 15:13:47.876: W/System.err(20079): java.lang.SecurityException: Permission Denial: starting Intent  act=android.media.action.IMAGE_CAPTURE flg=0x4000003 cmp=com.sec.android.app.camera/.Camera clip=text/uri-list U:file:///storage/emulated/0/Pictures/XXX/IMG_20170809_151347.jpg (has extras)  from ProcessRecordf736f3f 20079:com.XXX/u0a338 (pid=20079, uid=10338) with revoked permission android.permission.CAMERA
08-09 15:13:47.896: E/ConfigFileUtils(3071): Failed to read config file: /data/data/com.google.android.gms/app_chimera/current_modulesets.pb: open failed: ENOENT (No such file or directory)
08-09 15:13:47.906: W/System.err(20079):    at android.os.Parcel.readException(Parcel.java:1620)
08-09 15:13:47.906: W/System.err(20079):    at android.os.Parcel.readException(Parcel.java:1573)
08-09 15:13:47.906: W/System.err(20079):    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3131)
08-09 15:13:47.906: W/System.err(20079):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1540)
08-09 15:13:47.906: W/System.err(20079):    at android.app.Activity.startActivityForResult(Activity.java:4283)
08-09 15:13:47.906: W/System.err(20079):    at android.app.Activity.startActivityForResult(Activity.java:4230)
08-09 15:13:47.906: W/System.err(20079):    at com.codename1.impl.android.CodenameOneActivity.startActivityForResult(CodenameOneActivity.java:576)
08-09 15:13:47.906: W/System.err(20079):    at com.codename1.impl.android.c.a(AndroidImplementation.java:5869)
08-09 15:13:47.906: W/System.err(20079):    at com.codename1.u.p.b(Display.java:3109)
08-09 15:13:47.906: W/System.err(20079):    at com.codename1.b.a.a(Capture.java:77)
08-09 15:13:47.906: W/System.err(20079):    at com.codename1.b.a.a(Capture.java:125)
08-09 15:13:47.906: W/System.err(20079):    at com.grandgreat.XXX.ai.b(SettingsForm.java:98)

(SettingsForm.java:98 String path = Capture.capturePhoto(1000, -1);)

【问题讨论】:

我建议提供您遇到的失败,例如堆栈跟踪 DDMS 输出等。 我怀疑这个老问题与最近的问题有关:github.com/codenameone/CodenameOne/issues/2409 【参考方案1】:

这应该有效,因为我们使用了 Intent 来完成所有捕获工作,因此我们甚至不需要请求该权限。见代码here。

然而,正如这个堆栈溢出问题Android M Camera Intent + permission bug?所解释的那样

如果应用拥有摄像头权限,则 Intent 可能无法阻止看似不当的行为。又是意图系统的一个可怕的边缘案例......

解决方法确实是提示相机权限,我们将在明天(2017 年 8 月 11 日)添加更新。

【讨论】:

我将 DDMS 输出添加到问题中 谢谢,现在很清楚为什么它会中断您而不是其他人,这取决于现有的应用程序权限,这可能在此处有所不同。用答案更新帖子 我恢复了这个并做了更多的阅读。我不明白为什么这首先对您不利。您的构建提示中有哪些内容?

以上是关于CodenameOne:Capture.capturePhoto() 请求错误的权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CodenameOne 源附加到我的项目?

CodenameOne - BrowserComponent 不可滚动

使用 Codenameone 显示推送通知

Codenameone订阅

将 LWUIT 项目转换为 Codenameone 时出错

CodenameOne - 使用 android.buildToolsVersion=27 构建时,Android 应用程序无法启动