Отображение уведомления в широковещательном приемнике

#android

#Android

Вопрос:

ПРИВЕТ, я нахожусь в ситуации, когда мне нужно отображать уведомление при поступлении вызова. Для этого я использую широковещательный приемник. Код приведен ниже

 public class MyPhoneStateListener extends PhoneStateListener {
    public Context context;
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        // TODO Auto-generated method stub
        super.onCallStateChanged(state, incomingNumber);
        switch(state){
        case TelephonyManager.CALL_STATE_IDLE:
            NotificationManager notifier = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

            //Get the icon for the notification
            int icon = R.drawable.icon;
            Notification notification = new Notification(icon,"Simple Notification",System.currentTimeMillis());

            //Setup the Intent to open this Activity when clicked
            Intent toLaunch = new Intent(context, main.class);
            PendingIntent contentIntent = PendingIntent.getActivity(context, 0, toLaunch, 0);

            //Set the Notification Info
            notification.setLatestEventInfo(context, "Hi!!", "This is a simple notification", contentIntent);

            //Setting Notification Flags
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notification.defaults |= Notification.DEFAULT_SOUND;
            notification.flags |= Notification.FLAG_INSISTENT;
          //  notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
            //Send the notification
            notifier.notify(0x007, notification);
            Log.d("CALL", "IDLE");
        break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
          Log.d("DEBUG", "OFFHOOK");
        break;
        case TelephonyManager.CALL_STATE_RINGING:

          Log.d("DEBUG", "RINGING");
        break;
        }
    }

}
  

Теперь проблема в том, что звук для уведомления не воспроизводится, но уведомление отображается правильно. Кто-нибудь может пролить свет на это, пожалуйста, почему звук уведомления не воспроизводится?

Ответ №1:

Исправить

 notification.defaults |= Notification.DEFAULT_SOUND;
  

Для

 notification.flags |= Notification.DEFAULT_SOUND;
  

Комментарии:

1. не работает… Я думаю, что это ошибка в Android.. Должен ли я сообщить об этом там?

Ответ №2:

В итоге я воспроизвел звук вручную через медиаплеер. Код теперь выглядит следующим образом

 public class MyPhoneStateListener extends PhoneStateListener {
    public Context context;
    public static final String PREFS_NAME = "ealertprefs";
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        // TODO Auto-generated method stub      
        switch(state){
        case TelephonyManager.CALL_STATE_IDLE:                     
            Log.v("CALL", "IDLE");
        break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
          Log.d("DEBUG", "OFFHOOK");
        break;
        case TelephonyManager.CALL_STATE_RINGING:
          if(call_from_elist(incomingNumber)) {
              wake_up_phone();
              send_notification();
              create_sound();
          }
          Log.d("DEBUG", "RINGING");
        break;
        }
    }
    private boolean call_from_elist(String number) {
        return true;
    }
    private void wake_up_phone() {
        AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
    }
    private void send_notification(){
        NotificationManager notifier = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);                
        int icon = R.drawable.icon;
        Notification notification = new Notification(icon,"Simple Notification",System.currentTimeMillis());        
        Intent toLaunch = new Intent(context, main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, toLaunch, 0);        
        notification.setLatestEventInfo(context, "Hi!!", "This is a simple notification", contentIntent);        
        notification.flags |= Notification.FLAG_AUTO_CANCEL;                              
        notifier.notify(0x007, notification);
    }
    private void create_sound() {
        Uri alert;
        SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
        String ringtone = settings.getString("ringtone_uri", "");
        if(ringtone.equals("")) {
            alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        }
        else {
            alert = Uri.parse(ringtone);
        }

        MediaPlayer mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource(context, alert);
            //final AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
            //if (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) != 0) {
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                //mMediaPlayer.setLooping(true);
                mMediaPlayer.prepare();
                mMediaPlayer.start();
            //}
        }
        catch(IOException e) {
            Log.v("CALL", e.getMessage());
        }
    }
}