【问题标题】:Why doesn't this code work on android 6 marshmallow Api 23?为什么此代码不适用于 android 6 marshmallow Api 23?
【发布时间】:2015-09-28 15:54:30
【问题描述】:

为什么这段代码不能在 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)中无法正常运行

【问题讨论】:

  • 可能是因为新的权限模型
  • 该代码不执行任何操作。你创建了一个PhoneStateListener,然后什么都不做。
  • Android现在没有android.permission.PROCESS_INCOMING_CALLS权限,以前是有的,检查权限

标签: android telephonymanager android-6.0-marshmallow


【解决方案1】:

我只是遇到了这个问题并想通了。这是因为您的目标是 android SDK 23。如果您将清单文件更改为目标 API 22,那么即使在 Marshmallow 设备上安装和运行它也会开始工作。

如果您仍想以 API 23 为目标,则必须先使用新的运行时权限 API 来请求权限使用,否则将被拒绝。

https://developer.android.com/training/permissions/requesting.html

【讨论】:

  • 我们还需要更改 build.gradle(Module:app) 文件中的目标 API 吗?请告诉我我也面临同样的问题..
【解决方案2】:

您可能无权访问TelephonyManager(例如READ_PHONE_STATE)。

根据documentation,当你没有请求或没有被授予权限,但仍在尝试访问它时,结果将为空,而不是像过去那样的异常:

如果用户关闭旧版应用的权限,系统会静默禁用相应的功能。当应用程序尝试执行需要该权限的操作时,该操作不一定会导致异常。相反,它可能会返回空数据集、发出错误信号或以其他方式表现出意外行为。例如,如果您在未经许可的情况下查询日历,则该方法返回一个空数据集。

您需要要求用户授予适当的权限,并处理用户已经拒绝或撤销该权限等情况。有关如何使用此here的详细说明。

【讨论】:

    【解决方案3】:

    我观察到了同样的行为。我们的应用程序在 Lollipop 和 Down 上运行良好,但在 Marshmallow 上却不行。它与权限无关。实际上,使用我编写的测试应用程序,我只是进入设置并事先授予权限。我们的应用程序中的问题在于电话号码本身,它来自外部来源。如果 Android 认为它无效,您将不会在 Marshmallow 上调用 onCallStateChanged。只需使用假号码1234567890,,2#(“无效”)与1234567890(“有效”)来验证它。我还不知道如何“修复”该号码,因为带有扩展名的号码的一部分有效。
    编辑:bug report I've opened at 16 Dec. 15

    【讨论】:

      【解决方案4】:

      请发布您的 AndroidManifest 以及 check the following documeetation:

      请注意,对某些电话信息的访问是受权限保护的。您的应用程序不会收到受保护信息的更新,除非它具有在其清单文件中声明的适当权限。如果权限适用,它们会在相应的 LISTEN_ 标志中注明。

      (Source:)来电电话号码。如果应用程序没有 READ_PHONE_STATE 权限,则会将空字符串作为参数传递。

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多