我试图通过onrecieve()方法从意图额外的电话中检索清单文件中注册的以下广播接收者的电话号码。
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
我可以成功读取除在我的Pixel 2设备中升级的android pie以外的所有版本的电话号码。根据{{3}},应用需要读取电话号码的其他权限,包括READ_CALL_LOG权限和READ_PHONE_STATE权限,但是即使允许了这些权限,我仍然缺少READ_CALL_LOG的权限,因此我无法读取电话号码。请帮助我解决此问题。
答案 0 :(得分:9)
确保在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
答案 1 :(得分:2)
根据文档,广播中提供的电话号码需要额外的权限。因为它就像获得访问通话记录信息without requesting it的权限一样。
对电话号码的受限访问无法在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权限。
ps。请测试一下。在我的Broadcastreciever中,我现在需要这样一个可怕的方块:
if(Build.VERSION.SDK_INT >= 26 && intent!=null && intent.getExtras() !=null
&& TextUtils.isEmpty(intent.getExtras().getString("incoming_number"))){
return;
}
答案 2 :(得分:2)
随着新的Google Play权限更改(即在2019年1月9日发布和Android Pie),以上所有方法均无效。
您的应用将在本地运行,或者如果用户手动下载APK,但您将无法再将其更新到Play商店。这是来自Google Play的电子邮件的一部分。
“ Kishor Bapat9的开发人员嗨,感谢您就您的应用Ekalipi呼叫播音员(ECA),com.ked.ekalipi.tts与Google Play小组联系。
发布状态
发布状态:已拒绝
经过审查后,您的应用由于违反政策而被拒绝,并且未发布。如果您提交了更新,则您的应用的先前版本仍可在Google Play上使用。
问题:违反权限政策经过审查您的应用后,我们发现由于以下原因,该应用不符合使用请求的权限的条件:
根据我们的评论,我们发现您应用程序的表述用户体验与您声明的核心功能{呼叫者ID,垃圾邮件检测和/或垃圾邮件阻止}不匹配。请从您的应用中删除这些权限。 “
注意-我们没有专门要求这些权限。我们甚至尝试过以不同方式更改描述。 第22章-如果您指定CALL_LOG权限,则Google Play会拒绝您的应用。如果删除权限,则无法获取来电号码。