La llamada entrante reemplaza dinámicamente el tono de llamada predeterminado

Mi aplicación te permite especificar un tono de llamada diferente para diferentes eventos entrantes. EG: llamada entrante, SMS entrante, etc.

Lo que estoy tratando de lograr es cuando recibo, por ejemplo, una llamada entrante, comprobar mi base de datos de aplicaciones si una opción específica está seleccionado y si hay una opción de tono de llamada conjunto de tono de llamada.

Sin embargo, el problema que estoy teniendo es que no puedo anular / detener el tono de llamada por defecto del teléfono de jugar.

He intentado varias maneras diferentes, pero de los docs la mayoría de esos métodos solamente paran la instancia actual y no son métodos globales.

No puedo configurar el tono de timbre en la configuración predeterminada de los tonos del teléfono, ya que necesita ser dinámico en función de la llamada entrante.

Si alguien sabe de un truco o una manera de lograr esto que sería genial. Espero que tenga sentido.

Hay varios pasos para cambiar dinámicamente el tono de llamada.

1. Preparar el tono de llamada

File k = new File("/sdcard/ringtone", "kolyan_.mp3"); ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, "My Song title"); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg"); values.put(MediaStore.Audio.Media.ARTIST, "Some Artist"); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

2. Insértelo en la base de datos

  Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); // Line below is major because we need to delete old entry getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); mUri = getContentResolver().insert(uri, values); 

3. Guarde el tono de llamada predeterminado actual y suscríbase a CallListener

  // Be careful by calling getActualDefaultRingtoneUri in CallListener, it could return null, better way to save it in OnCreate mOldUri = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE); TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); mTelephonyMgr.listen(new MyCallListener(), PhoneStateListener.LISTEN_CALL_STATE); 

4. Cree la clase MyCallListener

 class MyCallListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: // On call you replace the ringtone with your own mUri RingtoneManager.setActualDefaultRingtoneUri( MainActivity.this, RingtoneManager.TYPE_RINGTONE, mUri ); break; case TelephonyManager.CALL_STATE_IDLE: // Restore the default ringtone RingtoneManager.setActualDefaultRingtoneUri( MainActivity.this, RingtoneManager.TYPE_RINGTONE, mOldUri ); break; default: break; } super.onCallStateChanged(state, incomingNumber); } } 

5. Añade permisos a tu AndroidManifest.xml

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

6. Hecho

La idea principal es enganchar para la llamada entrante y substituir el tono de llamada por su propio. Y, por supuesto, debe restaurar el tono de llamada predeterminado al valor guardado después de la llamada.

A partir de la API 5 (Android 2.x), la base de datos Contactos tiene un campo CUSTOM_RINGTONE, vea esta página:

http://developer.android.com/reference/android/provider/ContactsContract.ContactOptionsColumns.html#CUSTOM_RINGTONE

El valor de este campo debe ser un content:// URI en un archivo multimedia. Puede obtener uno de los proveedores de contenido de MedciaStore :

http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html

Eso puede ser suficiente para empezar. Esto es todo material de proveedor de contenido estándar; Gran cantidad de material existente para ambas tareas.

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