如何在Codename One中强制添加"android.permission.CAMERA"权限到清单文件中

4
我将尝试在Codename One中展示后置摄像头的实时预览。为此,我使用本地接口(首先针对Android)。为了允许我的应用程序在不干扰构建提示的情况下使用相机,我在我的主表单中添加了以下行:
if (Capture.hasCamera()){
     Dialog.show("Appareil photo détecté", "Votre matériel est bien équipé d'un appareil photo!", "OK", null);
    } 

我这样做是因为Codename One博客指出:

android.hardware.camera和android.permission.RECORD_AUDIO - 由com.codename1.Capture触发

然而,在使用我从CN1获取的源代码在Android Studio上调试应用程序时,我总是在真实设备(API LEVEL 19即Kit Kat)上遇到java.lang.RuntimeException:Fail to connect to camera service

过了一会儿,我意识到异常是由于manifest.xml中缺少以下权限造成的:

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

请注意,如CN1博客所述,行<uses-feature android:name="android.hardware.camera" android:required="false" />已由CN1添加。

现在,我已经添加了这一行,直播预览也可以正常显示。

为什么不自动将此权限添加到清单中?我真的需要将其添加到构建提示中吗?

此外,我有另一个项目,使用相机拍照并将其保存在手机上,相机权限既未显示(在Android应用程序信息中),也未在应用程序安装期间请求,但它完全正常工作。请注意,例如Twitter应用程序在应用程序权限中显示“拍照和录制视频”,因此似乎不是手机隐藏相机权限的问题。

编辑于2016年11月20日:

确实Android开发者指南指出:

注意:如果您通过调用现有相机应用程序来使用相机,则您的应用程序不需要请求此权限。

这就是为什么CN1不需要此权限!

感谢帮助我正确管理CN1权限。


如果你不想在运行时请求权限,你可以将你的compiledSDKversion设置为android L。在这种情况下,你的应用程序将忽略所有Marshmallow功能。 - Tasneem
2个回答

4
你需要添加以下构建提示:

android.xpermissions=<uses-permission android:name="android.permission.CAMERA" android:required="false"/>

您还可以将此添加到cn1lib中,以便自动注入。


我最终做到了。但是当我使用Capture.has camera()时,为什么CN1会自动添加<uses-feature android:name="android.hardware.camera" android:required="false" />而不是您提到的所需权限? - HelloWorld
好的,我终于明白了……我的误解!实际上,Android开发者指南指出:
注意:如果您通过调用现有的相机应用程序来使用相机,则您的应用程序不需要请求此权限。
这就是为什么CN1不需要此权限的原因!
- HelloWorld
@Shai 为什么 "<uses-feature android:name="android.hardware.camera" android:required="false" />" 中的 "false" 会打开或关闭相机权限?(我的应用程序出了一些问题,这会有所帮助。谢谢!) - ikevin8me
翻译:false 表示不是必需但希望有。安装不会失败,我们可以回退到其他功能。True 表示应用程序没有该权限将无法工作。 - Shai Almog

2
过去,您需要将所需权限添加到清单中,然后在用户尝试安装应用程序时请求该权限。从Android 6.0+开始,这种情况已经改变。现在,您只需在应用程序首次需要权限时请求该权限。用户授予您权限后,下次不需要再次询问。其中一些好处包括让用户了解为什么需要特定的权限,并且不请求实际上不需要的权限。
您可以在此处阅读有关如何实施的更多信息:https://developer.android.com/training/permissions/requesting.html 没有办法在不请求权限的情况下使用手机相机。

我看到这在安卓6.0及以上版本中。但在当前情况下,涉及到的是安卓4.4.2,它仍然相当常用(截至2016年11月,它占所有Android设备的25%)。 - HelloWorld
我不确定你的问题是什么;如果你在问是否需要将它添加到你的清单中,答案是是。 - Zarwan
我正在使用Codename One(一次编写,到处运行)来开发我的应用程序。他们会根据我使用的Codename One方法编写所需的权限。但是,他们不会添加有关本地实现中所写内容的权限。这就是为什么我使用了一个CN1方法,根据文档应该触发相机权限,但实际上并没有。由于我无法直接访问清单,因此必须提供一个名为“android.xpermissions”的特定“构建提示”,并将其填充为相机权限。 - HelloWorld
CN1不会通过本地接口确定需要哪些权限。对于本地接口,它应该经过CN1代码,但实际上并没有这样做。 - James H
感谢大家的评论和答案。我混淆了对现有相机应用程序的调用(在CN1中发生的情况),它不需要相机权限,以及直接使用相机API需要相机权限的情况。我将@Shai的答案标记为正确,因为它回答了问题标题。 - HelloWorld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接