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
だから誰かがデフォルトの着信音/アラームを再生する方法を知っているなら教えてください。
私はファイルをアップロードしたくない。デフォルトの着信音を再生するだけです。
これにより、設定された着信音を簡単に再生できます。
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
ユーザーが電話機でアラームを設定したことがない場合、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);
}
}
これは私がやった方法です:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();
これはmarkov00の方法に似ていますが、着信音の代わりにMediaPlayerを使用して、バックグラウンドで既に再生されている可能性のある音楽などの他のサウンドの中断を防ぎます。
あなたの例は基本的に私が使用しているものです。ただし、エミュレーターにはデフォルトで着信音がなく、content://settings/system/ringtone
は再生可能なものに解決しないため、エミュレーターでは機能しません。それは私の実際の電話でうまく機能します。
これはうまくいきます:
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();
DDMSを使用して/ sdcardフォルダーにMP3ファイルをプッシュし、エミュレーターを再起動してから、Mediaアプリケーションを開き、MP3ファイルを参照し、長押しして「電話の着信音として使用」を選択できます。
エラーはなくなりました!
編集:通知音(SMSなど)と同じトラブルがRingdroidアプリケーションを使用して解決しました
将来のGoogleユーザーの場合:RingtoneManager.getActualDefaultRingtoneUri()
の代わりにRingtoneManager.getDefaultUri()
を使用します。その名前によれば、実際のuriが返されるため、自由に使用できます。 getActualDefaultRingtoneUri()
のドキュメントから:
現在のデフォルトサウンドのUriを取得します。これはactualサウンドUriを提供します。これを使用する代わりに、ほとんどのクライアントはDEFAULT_RINGTONE_URIを使用できます。
一方、getDefaultUri()
はこう言います:
特定のタイプのデフォルトの着信音のUriを返します。実際の着信音のUriを返すのではなく、これはsymbolic Uriを返します。これは、再生時に実際の音に解決されます。
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);
}
}
次のサンプルコードを使用できます。
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)
if (ringtoneSound != null) {
ringtoneSound.play();
}
エミュレータのSDカードにオーディオファイルをコピーし、デフォルトの着信音としてメディアプレーヤーで選択すると、実際に問題が解決します。