Android には、ユーザーが単一の電話帳の連絡先/グループに対して特別な着信音を選択できるシステムが組み込まれていることは知っていますが、通話中に着信音を動的に変更する必要があります。
そのため、サービスを作成し、電話の起動時にロードして、着信をキャプチャする電話リスナーを設定し、デフォルトの電話の着信音を (サービス変数に) 保存し、必要に応じて元の着信音を別の着信音に変更してから、元の着信音を復元します。電話の状態がアイドル状態に戻ったときの着信音。元の着信音を保存して新しい着信音を設定することはできますが、新しい着信音は聞こえず、古い着信音しか聞こえません。
私のコードを見て、電話のリスナーが元の着信音を変更するかどうかを選択すると、電話はすでに鳴っていることに注意してください。
では、電話がすでに鳴っているときに着信音を変更するにはどうすればよいですか?
マニフェストにアクセス許可が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;
}
}
}