¿Por qué este código no funciona en android 6 marshmallow Api 23?

¿Por qué este código no funciona en android 6 marshmallow Api 23? No produce una excepción, pero el código dentro de callStateListener no funciona.

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); 

Permisos:

 <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" /> 

Funciona perfectamente en Android 5.1.1 pero no en 6 (API Level 23)

Me encontré con esto y lo averigué. Es porque está orientado a Android SDK 23. Si cambia su archivo de manifiesto a la API 22 de destino, entonces comenzará a funcionar incluso cuando esté instalado y funcionando en un dispositivo Marshmallow.

Si todavía desea orientar la API 23, deberá utilizar la nueva API de permisos de tiempo de ejecución para solicitar el uso de permisos primero, de lo contrario, simplemente se negará.

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

Es posible que no tenga permisos para acceder al TelephonyManager (por ejemplo, READ_PHONE_STATE ).

De acuerdo con la documentación , cuando no ha solicitado o no se le ha concedido el permiso, pero todavía está tratando de acceder a él, el resultado estará vacío, en lugar de una excepción como en el pasado:

Si un usuario desactiva los permisos para una aplicación heredada, el sistema inhabilita silenciosamente la funcionalidad apropiada. Cuando la aplicación intenta realizar una operación que requiera permiso, la operación no causará necesariamente una excepción. En su lugar, puede devolver un conjunto de datos vacío, señalar un error o mostrar un comportamiento inesperado. Por ejemplo, si consulta un calendario sin permiso, el método devuelve un conjunto de datos vacío.

Debe pedir al usuario que conceda el permiso apropiado y manejar casos cuando el usuario ya haya denegado o haya revocado ese permiso, etc. Hay una descripción detallada de cómo emplear esto aquí .

Observé el mismo comportamiento. Nuestra aplicación funciona perfectamente en Lollipop y abajo, pero no en Marshmallow. No tiene nada que ver con los permisos. En realidad, con la aplicación de prueba que escribí, sólo entré en Configuración y dio los permisos de antemano. El problema en nuestra aplicación era con un número de teléfono sí mismo, que venía de la fuente externa. Si Android piensa que no es válido, no obtendrá onCallStateChanged llamado en Marshmallow. Simplemente utilice un número falso 1234567890,,2# ("inválido") vs 1234567890 ("válido") para validarlo. No sé cómo "arreglar" el número todavía, como parte de los números con las extensiones de trabajo.
Editar: informe de errores que he abierto en 16 de diciembre 15

Por favor, publica tu AndroidManifest, así como comprueba la siguiente documentación:

Tenga en cuenta que el acceso a alguna información de telefonía está protegido por permisos. Su aplicación no recibirá actualizaciones de la información protegida a menos que tenga los permisos adecuados declarados en su archivo de manifiesto. Cuando se aplican permisos, se indican en los indicadores LISTEN_ correspondientes.

(Fuente 🙂 número de teléfono entrante de la llamada. Si la aplicación no tiene permiso READ_PHONE_STATE, se pasará una cadena vacía como argumento.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.