Я знаю, что 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;
}
}
}
Просто интересно. Почему ты бы так поступил? Для чего это полезно? :) – user219882
Я делаю это для университетского проекта, используя систему безопасности, основанную на межплатформенных портативных онтологиях rdf. –