Пользовательский звук уведомлений не работает в NotificationChannel для Android P - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть пользовательский звук уведомления, но когда устройство принимает уведомление, поэтому устройство не работает, звук уведомления не работает.Устройство воспроизводит звук по умолчанию.

NotificationChannel mChannel = new NotificationChannel(MISSED_CALL, "missedCall", NotificationManager.IMPORTANCE_HIGH);
mChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
mChannel.setShowBadge(true);
mChannel.enableLights(true);
mChannel.enableVibration(true);

Uri soundUri = Uri.parse("android.resource://" + Util.getPackageName(context) + "/" + R.raw.missed_notification);
AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build();
mChannel.setSound(soundUri, audioAttributes);
mChannel.setLightColor(Color.BLUE);
notificationManager.createNotificationChannel(mChannel);

builder.setChannelId(MISSED_CALL)
.setContentIntent(pendingIntent)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setNumber(totalNotificationCount);

NotificationCompat.BigTextStyle notification = new NotificationCompat.BigTextStyle().bigText("");
notification.setBuilder(builder);
notificationManager.notify(MISSED_CALL_NOTIFICATION_ID, 
builder.build());

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

R.raw. missed_notification является целым идентификатором ресурса; вы хотите имя звукового ресурса в этом Uri.Так что попробуйте:

Uri soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
            + "://" + getPackageName() + "/raw/missed_notification");
    notification.setSound(soundUri, audioAttributes);
0 голосов
/ 25 сентября 2019

Я запустил сервис и mediaPlayer.Он работает.

public class NotificationSoundService extends Service {

        private MediaPlayer mMediaPlayer;
        public static final String ACTION_START_PLAYBACK = "start_playback";
        public static final String ACTION_STOP_PLAYBACK = "stop_playback";
        public static final String EXTRA_SOUND_URI = "soundUri";

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        public int onStartCommand(Intent intent, int flags, int startId) {

            if (intent == null || intent.getAction() == null) {
                return START_NOT_STICKY;
            }

            String action = intent.getAction();
            switch (action) {
                case ACTION_START_PLAYBACK:
                    startSound(intent.getStringExtra(EXTRA_SOUND_URI));
                    break;
                case ACTION_STOP_PLAYBACK:
                    stopSound();
                    break;
            }

            return START_NOT_STICKY;
        }

        private void startSound(String uriString) {

            Uri soundUri;
            try {
                soundUri = Uri.parse(uriString);

                // play sound
                if (mMediaPlayer == null) {
                    mMediaPlayer = new MediaPlayer();

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

                        AudioAttributes audioAttributes = new AudioAttributes.Builder()
                                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                                .build();

                        mMediaPlayer.setAudioAttributes(audioAttributes);
                    } else {
                        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                    }

                    mMediaPlayer.setOnPreparedListener(MediaPlayer::start);
                    mMediaPlayer.setOnCompletionListener(mediaPlayer -> stopSound());
                }

                mMediaPlayer.setDataSource(this, soundUri);
                mMediaPlayer.prepareAsync();

            } catch (Exception e) {
                stopSound();
            }
        }

        private void stopSound() {
            if (mMediaPlayer != null) {
                mMediaPlayer.stop();
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
            cleanup();
        }

        private void cleanup() {
            stopSelf();
        }
...