我正嘗試在Android中使用鬧鐘管理器。我想要的是,當鬧鐘響起時,它應該播放我爲android時鐘設置的默認鬧鐘鈴聲。我用下面的代碼Android AlarmManager使用默認鬧鐘鈴聲
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
mp = MediaPlayer.create(context, uri);
mp.start();
不過,我得到異常以下
java.lang.RuntimeException: Unable to start receiver com.example.user.alarmmanager.MyBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
at com.example.user.alarmmanager.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:25)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
請幫
我嘗試在我的R.raw文件夾中使用mp3文件並使用它來代替uri。它運行正常。但是,當我使用uri時不行。僅供參考,uri包含contentprovider表單中的警報路徑。這可能是一些問題嗎? –
是的,很可能。 「BroadcastReceiver」的意圖是非常短小的,當你創建一個MediaPlayer時,預計你會保留它一段時間,這樣它可以被控制,等等。當使用Uri時,它將使用一個'ContentResolver'來訪問媒體/內容,這可能導致阻塞呼叫和其他不應該從'BroadcastReceiver'完成的事情。所以'MediaPlayer.create()'很可能因爲這個而失敗。 –
好的。所以我做了這個改變,我用一個鈴聲替換了所有的MediaPlayer和Uri的東西,並且調用了'ringtone.play()',它正在工作。只是不明白它爲什麼會播放通知和鈴聲而不是alarm_alert。這可能是設備特定的嗎? –