为什么这个代码不适用于android 6 marshmallow Api 23?

时间:2015-09-28 15:54:30

标签: android telephonymanager android-6.0-marshmallow

为什么这个代码不适用于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)

4 个答案:

答案 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权限,则会将空字符串作为参数传递。