web-dev-qa-db-ja.com

Androidで着信音/アラーム音を再生する方法

Androidで着信音/アラームサウンドを再生する方法を探しています。

ボタンを押して、着信音/アラーム音を再生したい。簡単でわかりやすいサンプルが見つかりませんでした。はい、私はすでに目覚まし時計のソースコードを見ました...しかし、それは簡単ではなく、私はそれをコンパイルできません。

私はこの仕事をすることはできません:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, alert);
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
    player.setAudioStreamType(AudioManager.STREAM_ALARM);
    player.setLooping(true);
    player.prepare();
    player.start();
}

私はこのエラーを受け取ります:

04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for
content://settings/system/ringtone

だから誰かがデフォルトの着信音/アラームを再生する方法を知っているなら教えてください。

私はファイルをアップロードしたくない。デフォルトの着信音を再生するだけです。

112
Federico

これにより、設定された着信音を簡単に再生できます。

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
174
markov00

ユーザーが電話機でアラームを設定したことがない場合、TYPE_ALARMはnullを返すことがあります。あなたはこれを説明できます:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

if(alert == null){
    // alert is null, using backup
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    // I can't see this ever being null (as always have a default notification)
    // but just incase
    if(alert == null) {  
        // alert backup is null, using 2nd backup
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);                
    }
}
63
Blundell

これは私がやった方法です:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();

これはmarkov00の方法に似ていますが、着信音の代わりにMediaPlayerを使用して、バックグラウンドで既に再生されている可能性のある音楽などの他のサウンドの中断を防ぎます。

52
igordc

あなたの例は基本的に私が使用しているものです。ただし、エミュレーターにはデフォルトで着信音がなく、content://settings/system/ringtoneは再生可能なものに解決しないため、エミュレーターでは機能しません。それは私の実際の電話でうまく機能します。

17
synic

これはうまくいきます:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
MediaPlayer thePlayer = MediaPlayer.create(getApplicationContext(), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

try {
    thePlayer.setVolume((float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)),
                        (float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)));
} catch (Exception e) {
    e.printStackTrace();
}

thePlayer.start();
10
Kamran Ahmed

DDMSを使用して/ sdcardフォルダーにMP3ファイルをプッシュし、エミュレーターを再起動してから、Mediaアプリケーションを開き、MP3ファイルを参照し、長押しして「電話の着信音として使用」を選択できます。

エラーはなくなりました!

編集:通知音(SMSなど)と同じトラブルがRingdroidアプリケーションを使用して解決しました

9
OcuS

将来のGoogleユーザーの場合:RingtoneManager.getActualDefaultRingtoneUri()の代わりにRingtoneManager.getDefaultUri()を使用します。その名前によれば、実際のuriが返されるため、自由に使用できます。 getActualDefaultRingtoneUri()のドキュメントから:

現在のデフォルトサウンドのUriを取得します。これはactualサウンドUriを提供します。これを使用する代わりに、ほとんどのクライアントはDEFAULT_RINGTONE_URIを使用できます。

一方、getDefaultUri()はこう言います:

特定のタイプのデフォルトの着信音のUriを返します。実際の着信音のUriを返すのではなく、これはsymbolic Uriを返します。これは、再生時に実際の音に解決されます。

9
Matvey Rybakov
public class AlarmReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        //this will update the UI with message
        Reminder inst = Reminder.instance();
        inst.setAlarmText("");

        //this will sound the alarm tone
        //this will sound the alarm once, if you wish to
        //raise alarm in loop continuously then use MediaPlayer and setLooping(true)
        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null) {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
        }
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
        ringtone.play();

        //this will send a notification message
        ComponentName comp = new ComponentName(context.getPackageName(),
                AlarmService.class.getName());
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}
3
Kumar sunny

次のサンプルコードを使用できます。

Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)

if (ringtoneSound != null) {
    ringtoneSound.play();
}
2
Gio MV

エミュレータのSDカードにオーディオファイルをコピーし、デフォルトの着信音としてメディアプレーヤーで選択すると、実際に問題が解決します。