2012-05-26 5 views
0

Я знаю, что Android имеет встроенную систему, которая позволяет пользователю выбрать специальную мелодию для одной телефонной книги контакта/группы, но я должен изменить мелодию динамически во время вызова:Изменить телефон мелодии, звоня

Так , Я написал Сервис и загрузил его при запуске телефона, чтобы установить прослушиватель телефона, который фиксирует входящий вызов, который сохраняет стандартную телефонную мелодию звонка (в служебной переменной) и при необходимости меняет оригинальную мелодию звонка, а затем восстанавливает рингтон orignal когда состояние телефона возвращается в режим ожидания. Ну, я могу сохранить оригинальный тон, установить новый, но не слышу новый рингтон, только старый:

Взгляните на мой код и имейте в виду, что, когда прослушиватель телефона выбирает, если изменить оригинальную мелодию звонка или нет, телефон уже звонит.

Итак, как я могу изменить мелодию звонка, когда телефон уже звонит?

У меня есть android.permission.WRITE_SETTINGS и android.permission.READ_PHONE_STATE права в моем манифесте.

Служба:

public class CallFilterService extends Service { 

    private Uri originalRingtoneUri; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     telephonyManager.listen(new CallFilterListener(this), PhoneStateListener.LISTEN_CALL_STATE); 
     return START_STICKY; 
    } 

    public void saveOriginalRingtone() { 
     originalRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE); 
    } 

    public void restoreOriginalRingtone() { 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, originalRingtoneUri); 
    } 
} 

PhoneListener:

public class MyPhoneListener extends PhoneListener 
{ 
    private CallFilterService service; 
    private Uri specialRingtoneUri; 

    public CallFilterListener(CallFilterService service) { 
     super(); 
     this.service = service; 
     specialRingtoneUri = setSpecialRingtone();  
    } 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: { 
       service.saveOriginalRingtone(); 
       if (canChangeRingtone(incomingNumber)) { 
        //When in this if block, the default phone ringtone is already playing. 
        RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, specialRingtoneUri); 
       } 
       break; 
      } 
      case TelephonyManager.CALL_STATE_IDLE: 
      { 
       service.restoreOriginalRingtone(); 
       break; 
      } 
      default: 
       break; 
     } 
    } 
} 
+0

Просто интересно. Почему ты бы так поступил? Для чего это полезно? :) – user219882

+0

Я делаю это для университетского проекта, используя систему безопасности, основанную на межплатформенных портативных онтологиях rdf. –

ответ

0

Во-первых, создать файл с пути и имя файла:

File file = new File(path, songName); 

Затем подготовьте запрос:

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
values.put(MediaStore.MediaColumns.SIZE, 215454); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "Artist"); 
values.put(MediaStore.Audio.Media.DURATION, 230); 
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); 

Затем вставьте его в базу данных:

Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
Uri newUri = this.getContentResolver().insert(uri, values); 

И, наконец, установить мелодию:

RingtoneManager.setActualDefaultRingtoneUri(
    myActivity, 
    RingtoneManager.TYPE_RINGTONE, 
    newUri 
); 

Это предполагает наличие соответствующих разрешений. Если вы нацеливаете API 23 или выше, вы должны запросить разрешение во время выполнения в дополнение к объявлению его в манифесте

Смежные вопросы