13

私のアプリでは、着信イベントごとに異なる着信音を指定できます。例: 電話の着信、SMS の着信など。

私が達成しようとしているのは、たとえば着信を受けたときに、特定のオプションが選択されているかどうか、アプリデータベースをチェックし、着信音オプションセットがその着信音を再生するかどうかです。

ただし、私が抱えている問題は、デフォルトの電話着信音の再生をオーバーライド/停止できないことです。

私はいくつかの異なる方法を試しましたが、ドキュメントから、これらのメソッドのほとんどは現在のインスタンスを停止するだけであり、グローバル メソッドではありません。

着信に基づいて動的にする必要があるため、デフォルトの電話の着信音設定で着信音を設定できません。

誰かがこれを達成するためのトリックや方法を知っていれば、それは素晴らしいことです. それが理にかなっていることを願っています。

4

2 に答える 2

12

着信音を動的に変更するには、いくつかの手順があります。

1.着信音を用意する

    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.データベースに挿入する

    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. 現在のデフォルトの着信音を保存し、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. 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. AndroidManifest.xml に権限を追加します

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

6.完了

主なアイデアは、着信をフックして、着信音を自分のものに置き換えることです。そしてもちろん、通話後にデフォルトの着信音を保存された値に復元する必要があります。

于 2012-03-10T04:34:48.840 に答える
4

API 5 (Android 2.x) 以降、連絡先データベースには CUSTOM_RINGTONE フィールドがあります。次のページを参照してください。

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

このフィールドの値はcontent://、メディア ファイルへの URI である必要があります。MedciaStoreコンテンツ プロバイダーから入手できます。

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

始めるにはそれで十分かもしれません。これはすべて標準的なコンテンツ プロバイダーのものです。両方のタスクの既存の資料がたくさんあります。

于 2011-10-19T11:01:28.600 に答える