7

我试图通过 onrecieve() 方法为清单文件中注册的以下广播接收器从 Intent Extra 中检索电话号码。

  <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>

我可以成功读取除我的像素 2 设备中升级的 android pie 之外的所有版本的电话号码。根据文档,应用程序需要额外的权限才能读取电话号码,即 READ_CALL_LOG 权限和 READ_PHONE_STATE 权限,但即使在允许这些权限之后,我仍然缺少 READ_CALL_LOG 的权限,因此我无法读取电话号码。请帮我解决这个问题。

4

3 回答 3

13

确保在 Android 6.0+ 运行时授予 READ_PHONE_STATE 和 READ_CALL_LOG 权限:
https ://developer.android.com/distribute/best-practices/develop/runtime-permissions

另外,请注意,授予这两个权限后,您将收到两次 ACTION_PHONE_STATE_CHANGED 广播意图操作;一个是 EXTRA_INCOMING_NUMBER 填充了电话号码,另一个是空白。

您可以在此处找到更多信息:
https ://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED

于 2018-08-14T21:53:19.967 回答
5

随着新的 Google Play 权限更改(即 2019 年 1 月 9 日和 Android Pie),上述任何一项都不再有效。您的应用程序将在本地运行,或者如果用户手动下载 APK 但您无法再将应用程序更新到 Play 商店。这是来自 Google Play 的电子邮件的一部分。“您好 Kishor Bapat9 的开发人员,感谢您就您的应用 Ekalipi Call Announcer (ECA) 与 Google Play 团队联系,com.ked.ekalipi.tts。
发布状态
发布状态:已拒绝 审核后,您的应用已被拒绝,并且由于违反政策而未发布。如果您提交了更新,您的应用的旧版本仍可在 Google Play 上使用。问题:违反权限政策在审核您的应用后,我们发现它不符合使用请求的权限的条件,原因如下:

根据我们的审查,我们发现您的应用所表达的用户体验与您声明的核心功能{来电显示、垃圾邮件检测和/或垃圾邮件拦截}不符。请从您的应用中删除这些权限。"

注意 - 我们没有特别要求这些权限。我们甚至尝试以不同的方式更改描述。CATCH 22 - 如果您指定 CALL_LOG 权限,Google Play 会拒绝您的应用。如果您删除权限,您将无法获取来电号码。

于 2019-08-30T06:11:15.397 回答
4

根据文档,广播中给出的电话号码需要额外的权限。因为它就像在不请求的情况下访问通话记录信息一样。

限制对电话号码的访问 除了您的应用用例所需的其他权限外,在 Android 9 上运行的应用必须先获得 READ_CALL_LOG 权限才能读取电话号码或电话状态。

与呼入和呼出相关的电话号码在电话状态广播中可见,例如呼入和呼出,并且可以从 PhoneStateListener 类访问。但是,如果没有 READ_CALL_LOG 权限,在 PHONE_STATE_CHANGED 广播中并通过 PhoneStateListener 提供的电话号码字段为空。

要从电话状态读取电话号码,请更新您的应用以根据您的用例请求必要的权限:

要从 PHONE_STATE 意图操作中读取数字,您需要 READ_CALL_LOG 权限和 READ_PHONE_STATE 权限。要从 onCallStateChanged() 读取数字,您只需要 READ_CALL_LOG 权限。您不需要 READ_PHONE_STATE 权限。

附言。请对此进行测试。在我的广播接收器中,我现在需要一个像这样的可怕块:

     if(Build.VERSION.SDK_INT >= 26 && intent!=null && intent.getExtras() !=null 
&& TextUtils.isEmpty(intent.getExtras().getString("incoming_number"))){
                        return;
                    }
于 2018-12-26T00:54:47.270 回答