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


119

私はどこでも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

したがって、デフォルトの着信音/アラームの再生方法を誰かが知っている場合は、私に知らせてください。

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

回答:


186

あなたは単にこれで設定された着信音を再生することができます:

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

それでもエラーが発生する-着信音のコンテンツを開けませんでした:// settings / system / alarm_alert
Pritesh Desai

3
素敵でシンプル。ただし、デバイスによっては、このメソッドにより、Androidで再生されている可能性のある他のサウンド(音楽など)が中断される場合があります。
igordc 2013年

getApplicationContext()の使用は、あまり良いオプションではないかもしれません。詳細:stackoverflow.com/questions/9122627/...
サケット

@BartSimpsonはどのように問題を解決し、このエラーも発生しました
user3233280 '26

1
着信音は停止できません。もう一度着信音を開始すると、2回再生されます。stopPreviousが機能していません。getapplicationcontextではなく、同じコンテキストオブジェクトで着信音プレーヤーを作成しています。
Metehan Toksoy

65

ユーザーが電話にアラームを設定したことがない場合、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);                
    }
}

1
null有効なサウンドを指していない場合でも、返されたURIはそうでない場合があります。RingtoneManager.getRingtone()for null/ as-well の戻り値をテストする必要があります
Attila

2017年には、鳴らずに動作していません。最近のAndroidで動作していますか?

55

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

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

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


5
一番上の答え(ringtone.play)を試しましたが、音が途切れる場合があります。私はこのアプローチを使用し、それは完全に機能しました。
wyz 2015年

1
これは、アプリで他のオーディオコンポーネントを使用する人にとっては、より良いソリューションです。
EntangledLoops 2015

@YumYumYum、私はテストしただけで動作します。上記のコードをsetOnClickListnerに追加するだけでした。あなたは何をした?
スカイをフィーチャー

17

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


11

これはうまくいきます:

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();

2
なぜボリュームを7.0で分割するのですか?それは、一般的に知られている実用的な価値ですか、それとも自分で掘り下げるものですか?
ErGo_404 2013年

私が掘り出した何か...:D
カムランアーメド

なぜFloat.parseFloat(Double.toString(....))を行うのですか?double-> float変換が必要なためにStringインスタンスを通過しますか?あなたはなぜこれをやっているのですか?
Zordid

1
この部分は冗長ですUri.parse(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))、getDefaultUri()は既にURIを返します。別のURIにまだ解析する必要はありません
DritanX 2015年

1
7はstramの最大ボリュームです
Leo Droidcoder、

11

今後のGoogle社員向け:のRingtoneManager.getActualDefaultRingtoneUri()代わりにを使用してくださいRingtoneManager.getDefaultUri()。その名前によれば、実際のURIが返されるので、自由に使用できます。のドキュメントからgetActualDefaultRingtoneUri()

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

一方getDefaultUri()、これは言う:

特定のタイプのデフォルトの着信音のUriを返します。実際の着信音のサウンドUriを返すのではなく、これは、再生時に実際のサウンドに解決されるシンボリック Uriを返します。


9

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

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

編集:Ringdroidアプリケーションを使用して解決した通知音(SMSなど)と同じ問題を解決


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

どこAlarmServiceから来たの?
Eduardo Wada

2

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


2

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

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

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

0

遅いかもしれませんが、誰もがそれを望んでいる人のために、この質問に対する新しい簡単な解決策があります。
コトリンに

val player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI)
player.start()

上記のコードはデフォルトの着信音を再生しますが、デフォルトのアラームが必要な場合は、

Settings.System.DEFAULT_RINGTONE_URI

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

ここにいくつかのサンプルコードがあります:

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

コードを少し説明して説明します。コードのみの回答は認められません。
Sulthan Allaudeen 14

さあ、あなたはおそらく上記の答えを決して読んでいないでしょう。stackoverflow.com/a/20177743/3332634
yshahak

1
これは、と基本的に同じである、この答えが、変数名のmediaPlayer代わりにmp
マキエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.