2015-09-28 49 views
3

为什么不能在android 6棉花糖Api 23上工作?它不会抛出异常,但callStateListener中的代码不起作用。为什么不能在android 6棉花糖Api 23上工作?

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)

+3

也许是因为新的权限模式 –

+1

该代码不会执行任何操作。你创建一个'PhoneStateListener',然后不做任何事情。 – CommonsWare

+0

Android不具备android.permission.PROCESS_INCOMING_CALLS权限现在,它使用的是较早出现,检查权限 – AshuKingSharma

回答

0

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

请注意,访问某些电话信息是受权限保护的。您的应用程序不会接收受保护信息的更新,除非它的清单文件中声明了相应的权限。在适用权限的地方,它们会在相应的LISTEN_标志中标出。

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

3

您可能没有任何权限访问TelephonyManager(例如READ_PHONE_STATE)。

按照documentation,当你没有要求或者没有被授予权限,但仍试图访问它,结果将是空的,而不是例外像过去:

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

你要问用户授予相应的权限,以及处理情况下,当用户已经拒绝或已撤销的许可等有一个如何使用这种here的详细描述。

5

我刚才碰到了这个,想通了。这是因为你的目标是Android SDK 23.如果你更改你的清单文件到目标API 22,那么它即使在Marshmallow设备上安装并运行时也会开始工作。

如果您仍然想要定位API 23,那么您必须先使用新的运行时权限API来请求权限使用,否则将被拒绝。

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

+0

我们需要改变目标API中的build.gradle(模块:应用程序)文件还?请让我知道我太面对同样的问题。 – srinivas

+0

最佳答复,谢谢 – tamtoum1987

1

我所观察到的非常相同的行为。我们的应用程序在棒棒糖上运行得非常好,而不是在棉花糖上。它与权限无关。实际上,我写的测试应用程序,我刚刚进入设置,并提前给予权限。我们的应用中存在的问题是电话号码本身,它来自外部来源。如果Android认为它是无效的,你将不会得到叫做棉花糖的onCallStateChanged。只需使用虚假号码1234567890,,2#(“无效”)与1234567890(“有效”)来验证它。我不知道如何“修复”数字,作为扩展数字的一部分。
编辑:bug report I've opened at 16 Dec. 15

相关问题