为什么这个代码不适用于android 6 marshmallow Api 23?它不会抛出异常,但callStateListener中的代码不起作用。
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener callStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//if(logAtive) Log.i(LOG_TAG,incomingNumber + " " + state);
if(state==TelephonyManager.CALL_STATE_RINGING){
Toast.makeText(getApplicationContext(),"Hey, receive your call. Phone is ringing.",
Toast.LENGTH_LONG).show();
}
if(state==TelephonyManager.CALL_STATE_OFFHOOK){
Toast.makeText(getApplicationContext(),"You are in a call. ",
Toast.LENGTH_LONG).show();
}
if(state==TelephonyManager.CALL_STATE_IDLE){
Toast.makeText(getApplicationContext(),"You are in idle state… ",
Toast.LENGTH_LONG).show();
}
}
};
telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);
权限:
<uses-feature android:name="android.hardware.telephony" android:required="true" />
<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.PROCESS_INCOMING_CALLS" />
它在Android 5.1.1中完美运行,但在6级(API级别23)
答案 0 :(得分:5)
我刚刚遇到这个并想出来了。这是因为您的目标是Android SDK 23.如果您将清单文件更改为目标API 22,那么即使在Marshmallow设备上安装并运行它也会开始工作。
如果你仍想要定位API 23,那么你必须先使用新的运行时权限API来请求权限使用,否则它将被拒绝。
https://developer.android.com/training/permissions/requesting.html
答案 1 :(得分:3)
您可能没有权限访问TelephonyManager
(例如READ_PHONE_STATE
)。
根据documentation,如果您尚未请求或尚未获得权限,但仍在尝试访问它,则结果将为空,而不是像过去那样的异常:
如果用户关闭旧应用程序的权限,系统将以静默方式禁用相应的功能。当应用程序尝试执行需要该权限的操作时,该操作不一定会导致异常。相反,它可能返回空数据集,发出错误信号或以其他方式表现出意外行为。例如,如果您在未经许可的情况下查询日历,则该方法将返回一个空数据集。
您需要让用户授予相应的权限,并在用户已拒绝或已撤销该权限等时处理案例。有详细说明如何使用此here。
答案 2 :(得分:1)
我观察到了同样的行为。我们的应用程序非常适用于棒棒糖和羽绒服,但不适用于棉花糖。它与权限无关。实际上,在我写的测试应用程序中,我刚进入设置并事先给出了权限。我们的应用程序中的问题是电话号码本身来自外部来源。如果Android认为它无效,则不会在Marshmallow上调用onCallStateChanged
。只需使用假号1234567890,,2#
(“无效”)与1234567890
(“有效”)进行验证即可。我不知道如何“修复”这个数字,作为扩展工作的数字的一部分
修改:bug report I've opened at 16 Dec. 15
答案 3 :(得分:0)
请发布您的AndroidManifest以及check the following documeetation:
请注意,对某些电话信息的访问受权限保护。除非在其清单文件中声明了相应的权限,否则您的应用程序将不会收到受保护信息的更新。如果权限适用,则会在相应的LISTEN_标记中注明。
(Source:)来电电话号码。如果应用程序没有READ_PHONE_STATE权限,则会将空字符串作为参数传递。