Уведомление не отображается на Oreo - PullRequest
0 голосов
/ 02 сентября 2018

Я занимаюсь разработкой приложения и хочу играть фоновую музыку, поэтому я использую сервис для воспроизведения и остановки. Работает отлично. Кроме того, я хочу показать уведомление о приостановке, воспроизведении ..., но уведомление не появляется на Android 8.0. Я использую andorid 3.0.1, compileSdkVersion = 26, targetSdkVersion = 26 , minSdkVersion = 15

это мой текущий код

public class BackgroundSoundService extends Service {
    private static final String TAG = "BackgroundSoundService";
    MediaPlayer player;
    int length;
    static int t;
    private static final String LOG_TAG = "ForegroundService";
    String channelId = "channel-01";
    Notification notification;
    NotificationChannel mChannel;
    String name = "volume";
    int id = 0;
    int importance = NotificationManager.IMPORTANCE_HIGH;

    public IBinder onBind(Intent arg0) {
        Log.i(TAG, "onBind()");
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.jorgesys_song);
       ....
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
            Intent notificationIntent = new Intent(this, MainActivity.class);
            notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);

            Intent previousIntent = new Intent(this, BackgroundSoundService.class);
            previousIntent.setAction(Constants.ACTION.PREV_ACTION);
            PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
                    previousIntent, 0);

            Intent playIntent = new Intent(this, BackgroundSoundService.class);
            playIntent.setAction(Constants.ACTION.PLAY_ACTION);
            PendingIntent pplayIntent = PendingIntent.getService(this, 0,
                    playIntent, 0);

            Intent nextIntent = new Intent(this, BackgroundSoundService.class);
            nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
            PendingIntent pnextIntent = PendingIntent.getService(this, 0,
                    nextIntent, 0);

            Bitmap icon = BitmapFactory.decodeResource(getResources(),
                    R.drawable.esp);

            notification = new NotificationCompat.Builder(this)
                    .setContentTitle("Truiton Music Player")
                    .setTicker("Truiton Music Player")
                    .setContentText("My Music")
                    .setSmallIcon(R.drawable.esp)
                    .setLargeIcon(
                            Bitmap.createScaledBitmap(icon, 128, 128, false))
                    .setContentIntent(pendingIntent)
                    .setOngoing(true)
                    .setPriority(Notification.PRIORITY_MAX).setWhen(0)
                    .addAction(R.drawable.ic_per,
                            "", ppreviousIntent)
                    .addAction(R.drawable.ic_play, "",
                            pplayIntent)
                    .addAction(R.drawable.ic_next, "",
                            pnextIntent).build();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel mChannel = new NotificationChannel(channelId, name,
                        importance);
                mChannel.setShowBadge(true);
                NotificationManager mNotifyMgr =
                        (NotificationManager)
                                getSystemService(Context.NOTIFICATION_SERVICE);
                mNotifyMgr.createNotificationChannel(mChannel);

                // Builds the notification and issues it.
                mNotifyMgr.notify(id, notification);
            }


            startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                    notification);


        } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
            Log.i(LOG_TAG, "Clicked Previous");
        } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
            Log.i(LOG_TAG, "Clicked Play");
        } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
            Log.i(LOG_TAG, "Clicked Next");
        } else if (intent.getAction().equals(
                Constants.ACTION.STOPFOREGROUND_ACTION)) {
            Log.i(LOG_TAG, "Received Stop Foreground Intent");
            stopForeground(true);
            stopSelf();
        }


        player.start();
        return Service.START_STICKY;
    }

и у меня есть еще один вопрос: в уведомлении у меня есть три кнопки, и я добавляю для них 3 изображения, но их фон не меняется. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Пожалуйста, попробуйте это:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
        mChannel.setShowBadge(true);

        NotificationManager mNotifyMgr =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotifyMgr.createNotificationChannel(mChannel);

        notification = new Notification.Builder(this)
                .setChannelId(CHANNEL_ID)  // CHANNEL_ID = "notification"
                .setContentTitle("Truiton Music Player")
                .setTicker("Truiton Music Player")
                .setContentText("My Music")
                .setSmallIcon(R.drawable.esp)
                .setLargeIcon(
                        Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .setPriority(Notification.PRIORITY_MAX).setWhen(0)
                .addAction(R.drawable.ic_per,
                        "", ppreviousIntent)
                .addAction(R.drawable.ic_play, "",
                        pplayIntent)
                .addAction(R.drawable.ic_next, "",
                        pnextIntent).build();


        // Builds the notification and issues it.
        mNotifyMgr.notify(id, notification);
    }

Также добавьте разрешение RECEIVE_SMS во время выполнения.

0 голосов
/ 03 сентября 2018

с официального сайта Android:

Когда вы нацеливаетесь на Android 8.0 (уровень API 26), вы должны реализовать один или больше каналов уведомлений. Если ваш targetSdkVersion установлен на 25 или ниже, когда ваше приложение работает на Android 8.0 (уровень API 26) или выше, оно ведет себя так же, как на устройствах под управлением Android 7.1 (уровень API) 25) или ниже.

Поскольку ваш targetSdkVersion равен 26, измените код на:

notification = new NotificationCompat.Builder(this, channelId) // TODO: Add channelId here
                    .setContentTitle("Truiton Music Player")
                    .setTicker("Truiton Music Player")
                    .setContentText("My Music")
                    .setSmallIcon(R.drawable.esp)
                    .setLargeIcon(
                            Bitmap.createScaledBitmap(icon, 128, 128, false))
                    .setContentIntent(pendingIntent)
                    .setOngoing(true)
                    .setPriority(Notification.PRIORITY_MAX).setWhen(0)
                    .addAction(R.drawable.ic_per,
                            "", ppreviousIntent)
                    .addAction(R.drawable.ic_play, "",
                            pplayIntent)
                    .addAction(R.drawable.ic_next, "",
                            pnextIntent).build();

// TODO: Move this statement out of if block
NotificationManager mNotifyMgr =
            (NotificationManager)
                    getSystemService(Context.NOTIFICATION_SERVICE); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel mChannel = new NotificationChannel(channelId, name,
            importance);
    mChannel.setShowBadge(true);
    mNotifyMgr.createNotificationChannel(mChannel);
}

// TODO: Move this statement out of if block too.    
// Builds the notification and issues it.
mNotifyMgr.notify(id, notification);
0 голосов
/ 02 сентября 2018

добавить эту строку, если условие

notification.setChannelId(mChannel);

Как это:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel mChannel = new NotificationChannel(channelId, name,
                    importance);
            mChannel.setShowBadge(true);

            notification.setChannelId(mChannel);//add this line

            NotificationManager mNotifyMgr =
                    (NotificationManager)
                            getSystemService(Context.NOTIFICATION_SERVICE);
            mNotifyMgr.createNotificationChannel(mChannel);

            // Builds the notification and issues it.
            mNotifyMgr.notify(id, notification);
        }
...