1

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;
        }
    }
}
4

1 に答える 1

1

まず、パスとファイル名でファイルを作成します。

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 以降を対象とする場合は、マニフェストで宣言するだけでなく、実行時にパーミッションをリクエストする必要があります。

于 2016-07-04T10:57:46.170 に答える