Предоставление исключения нулевого указателя во время вызова тревоги, которая уже установлена ​​в предыдущей активности - PullRequest
1 голос
/ 01 ноября 2011

Я тестирую простое приложение тревоги. В первую очередь я установил будильник с рингтоном, который выбирается из Ringtonemanger, для этого я использовал метод setRing () . Затем, через намерение, я передал его в Broadcast Reciever, но когда сигнал тревоги вызывается в определенное время, тогда в player.setAudioStreamType (AudioManager.STREAM_ALARM) ** он выдает ** исключение указателя NULL . У кого-нибудь есть идея ??

private void setRing()
{
    intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,  RingtoneManager.TYPE_ALL);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone");
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null);

    this.startActivityForResult(intent, 5);

}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent)
{
    if (resultCode == Activity.RESULT_OK && requestCode == 5)
    {
         Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

         if (uri != null)
         {
             this.chosenRingtone = uri.toString();
         }
         else
         {
             this.chosenRingtone = null;
         }

     }            




public class GroupsCheckAlarmReceiver extends BroadcastReceiver {    

 MediaPlayer mMediaPlayer ;
 MediaPlayer player;
 Context context1;
 Uri uri=null;

@Override
public void onReceive(final Context context, Intent intent) {
     Toast.makeText(context, "Alarm success", Toast.LENGTH_LONG).show();
     String struri=intent.getStringExtra("uristr");
     Log.v("value of ring",struri);
     uri=Uri.parse(struri);
     context1=context;
     try {
        callringtone();
    } catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (SecurityException e) {

        e.printStackTrace();
    } catch (IllegalStateException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }

}
private void callringtone() throws IllegalArgumentException, SecurityException, IllegalStateException, IOException {
     mMediaPlayer = new MediaPlayer();
     mMediaPlayer.setDataSource(context1,uri);

     final AudioManager audioManager = (AudioManager)context1.getSystemService(Context.AUDIO_SERVICE);

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

     if(uri == null){

         uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
         if(uri== null){ 

             uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);               
         }

     }

  }
}

1 Ответ

1 голос
/ 01 ноября 2011

Вы никогда не инициализируете переменную player.Это ноль на протяжении всего существования вашего приемника вещания.Поэтому, когда вы вызываете setAudioStreamType(), вы получаете исключение нулевого указателя.Вы не используете переменную player где-либо еще в вашем широковещательном приемнике, и я думаю, что вы действительно хотели вызвать все эти методы в вашем блоке if в mMediaPlayer.Таким образом, вы можете решить вашу проблему, вызвав вместо этого все свои методы для этого объекта, например:

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