2015-12-18 186 views
1

我正嘗試在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) 

請幫

回答

0

這是因爲MediaPlayer.create()將返回null,說明它有創建問題。這很可能是因爲您試圖在BroadcastReceiver這是一個瞬態對象的上下文中創建它,並且提供給您的onReceive()方法的Context對象是一個簡化功能Context。接收者不能阻止或執行任何類型的繁重操作。您的應用程序中應運行BroadcastReceiver開始/消息Service以進行實際播放。

+0

我嘗試在我的R.raw文件夾中使用mp3文件並使用它來代替uri。它運行正常。但是,當我使用uri時不行。僅供參考,uri包含contentprovider表單中的警報路徑。這可能是一些問題嗎? –

+0

是的,很可能。 「BroadcastReceiver」的意圖是非常短小的,當你創建一個MediaPlayer時,預計你會保留它一段時間,這樣它可以被控制,等等。當使用Uri時,它將使用一個'ContentResolver'來訪問媒體/內容,這可能導致阻塞呼叫和其他不應該從'BroadcastReceiver'完成的事情。所以'MediaPlayer.create()'很可能因爲這個而失敗。 –

+0

好的。所以我做了這個改變,我用一個鈴聲替換了所有的MediaPlayer和Uri的東西,並且調用了'ringtone.play()',它正在工作。只是不明白它爲什麼會播放通知和鈴聲而不是alarm_alert。這可能是設備特定的嗎? –

1

嘿,如果警報音是沒有可能的崩潰。