我的应用程序与仅支持 WiFi 的设备不兼容

My App is not compatible on WiFi only devices

我开发了一个 android 应用程序,可以在来电时显示来电者的电信位置。

我在 Google Play 上上传了它,但是这个应用程序没有出现在只有 WiFi 的设备上,它说你的设备不兼容。

我的清单权限详细信息如下。

     <uses-permission android:name="android.permission.READ_CALL_LOG"/>
   <uses-permission android:name="android.permission.READ_CONTACTS"/>
   <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

我对以下权限有疑问

     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

哪些特定权限造成了问题? 解决方法是什么。

谢谢

您对以下的怀疑是正确的...

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

某些权限"imply" 某些硬件存在的必要性。换句话说,与 phone 相关的权限要求设备具有 phone 功能(显然)。

您可以使用 AndroidManifest.xml 中的 <uses-feature> 元素来解决这个问题。这允许您指定是否需要 'feature'。

查看 <uses-feature-element>

的文档

特别是 Permissions that Imply Feature Requirements 部分,它解释了与 <uses-permission> 元素相关的要求。

编辑:还有一件事——如果一个功能可以被使用但它不是必需的,则由您来检查在尝试使用它之前它在您的代码中的可用性,否则您将得到不可预测的结果或可能的异常/崩溃。

google Play 商店根据应用程序所需的权限和 android 设备中可用的功能过滤应用程序。因此,您的应用不会出现在仅支持 WiFi 的设备中,因为该应用需要 CALL_PHONE 权限和 MODIFY_STATE_PERMISSION

MODIFY_PHONE_STATE 权限不允许您拨打电话,但这意味着电话是一项要求。

来源:https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions

因此,您应该使用 <uses-feature> 元素而不是上述权限。

来自文档:您可以通过在元素中使用 android:required="false" 属性显式声明隐含特征来禁用基于隐含特征的过滤。

你的情况:

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

但是在实际检查电话功能是否可用之前,您还需要确保不使用任何与电话相关的功能。

在 android 应用程序中,对于 SDK >=5 ,您应该使用:

PackageManager pm = this.getPackageManager();
boolean hasTelephony = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);