Как создать уведомление с пользовательским контентом для экрана блокировки и другим пользовательским контентом для области уведомлений в Android - PullRequest
0 голосов
/ 25 августа 2018

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

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "media");

RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification);

remoteViews.setOnClickPendingIntent(R.id.play, MediaButtonReceiver.buildMediaButtonPendingIntent(this,
            PlaybackStateCompat.ACTION_PLAY_PAUSE));

    remoteViews.setOnClickPendingIntent(R.id.pause, MediaButtonReceiver.buildMediaButtonPendingIntent(this,
            PlaybackStateCompat.ACTION_PLAY_PAUSE));

    builder
    .setCustomContentView(remoteViews)
    .setContentIntent(contentPendingIntent)
    .setSmallIcon(R.drawable.logo)
    .setVisibility(VISIBILITY_PRIVATE)
    .setPublicVersion(getLockScreenBuilder(state))
            .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(getApplicationContext(), PlaybackStateCompat.ACTION_STOP));

startForeground(10, builder.build());

// это уведомление для экрана блокировки

private Notification getLockScreenBuilder(PlaybackStateCompat state) {

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "media");


    PendingIntent contentPendingIntent = PendingIntent.getActivity(this, 0, getPlayerIntent(), PendingIntent.FLAG_UPDATE_CURRENT);

    RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_lock_screen);
    remoteViews.setImageViewBitmap(R.id.track_name, textAsBitmap(currentTrack.getTitle(), Typeface.createFromAsset(getAssets(), "iran_sans_mobile_fa_num_bold.ttf"), 45));
    remoteViews.setImageViewBitmap(R.id.channel_title, textAsBitmap(channelTitle, Typeface.createFromAsset(getAssets(), "iran_sans_mobile_fa_num_medium.ttf"), 40));

    if (state.getState() == PlaybackStateCompat.STATE_PLAYING) {

        remoteViews.setViewVisibility(R.id.pause, VISIBLE);
        remoteViews.setViewVisibility(R.id.play, GONE);
    } else {
        remoteViews.setViewVisibility(R.id.pause, GONE);
        remoteViews.setViewVisibility(R.id.play, VISIBLE);
    }

    remoteViews.setOnClickPendingIntent(R.id.play, MediaButtonReceiver.buildMediaButtonPendingIntent(this,
            PlaybackStateCompat.ACTION_PLAY_PAUSE));

    remoteViews.setOnClickPendingIntent(R.id.pause, MediaButtonReceiver.buildMediaButtonPendingIntent(this,
            PlaybackStateCompat.ACTION_PLAY_PAUSE));

    remoteViews.setOnClickPendingIntent(R.id.previous, MediaButtonReceiver.buildMediaButtonPendingIntent
            (this, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS));

    remoteViews.setOnClickPendingIntent(R.id.next, MediaButtonReceiver.buildMediaButtonPendingIntent
            (this, PlaybackStateCompat.ACTION_SKIP_TO_NEXT));


    Glide.with(getApplicationContext()).load(Url.ROOT_URL + "storage/podcasts/" + currentTrack.getCoverImage()).asBitmap().diskCacheStrategy(DiskCacheStrategy.ALL).into(new SimpleTarget<Bitmap>(100, 100) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            remoteViews.setImageViewBitmap(R.id.image, resource);
        }
    });

    builder.setCustomContentView(remoteViews)
            .setContentIntent(contentPendingIntent)
            .setSmallIcon(R.drawable.logo)
            .setVisibility(VISIBILITY_PUBLIC)
            .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(getApplicationContext(), PlaybackStateCompat.ACTION_STOP));

    return builder.build();
}

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

1 Ответ

0 голосов
/ 25 августа 2018

AFAIK, отображение другого макета уведомлений на экране блокировки * только 1001 * - это функция, которой не существует!

Однако могут быть некоторые идеи или обходные пути для достижения этой цели, такие как прослушивание или наблюдение за событиями включения / выключения экрана для обновления / замены вашего уведомления.

Этого можно достичь, настроив широковещательный приемник, который может обнаруживать следующие 3 действия:

<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.USER_PRESENT" />

и добавление вашего кода должно проверять, заблокирован ли экран или не используется KeyguardManager, здесь является хорошим примером.

...