为什么在android应用中自动添加android.hardware.telephony功能

时间:2018-10-26 18:54:34

标签: android telephonymanager

发布APK到Play商店时,我发现我的应用程序需要android.hardware.telephony功能,但我没有在清单中的任何位置添加它。我还检查了android studio中的合并清单,它也不包含此功能,因此我认为没有第三方sdk会添加此功能。此功能的来源可能是什么?

供参考,我在清单中声明了以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

此外,当我使用以下代码将其设置为可选时,该应用将在不具有此功能的设备上可用:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="false" />

那么为什么默认情况下不需要在任何地方添加它?

2 个答案:

答案 0 :(得分:1)

Google Play会根据您请求的权限自动添加一些功能。

当您请求READ_SMSRECEIVE_SMS权限时,这意味着您在使用telephony功能。因此,Google Play的反应就像您在AndroidManifest.xml中包含以下内容一样:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="true" />

当您手动添加并声明为required="false"时,它告诉Google Play,尽管您确实请求了权限,但是可以处理用户没有telephony功能的情况。 / p>

这是通过this note in the docs确认的:​​

  

注意:某些系统权限暗含要求设备功能的可用性。例如,如果您的应用请求访问BLUETOOTH的权限,则暗中需要FEATURE_BLUETOOTH设备功能。

暗含的权限和功能要求的完整列表为available here,其中包括您的情况:

sms permissions implying telephony

最后,您还通过ACCESS_COARSE_LOCATION声明了android.hardware.location的功能要求,仅供参考。

有关the GameDev StackExchange的详细信息。

答案 1 :(得分:0)

项目正在使用的一个或多个依赖项/模块/库正在将该要求添加到您的Android Manifest中。

要进行调查,请在Android Manifest中打开您的主要Android Studio文件,然后单击页面底部的Merged Manifest标签。

这将向您显示最终合并的清单的视图以及每一行的来源。

在此处详细了解此内容:https://developer.android.com/studio/build/manifest-merge#inspect_the_merged_manifest_and_find_conflicts

如何修复

如果您希望避免在最终清单中添加该要求,则可以在清单中使用节点标记来控制合并的工作方式。

在此处了解有关节点标记的更多信息:https://developer.android.com/studio/build/manifest-merge#node_markers

例如试试这个:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="false"
    tools:node="replace" />