1

我正在尝试为我的音乐播放器应用程序构建锁屏控件。我已经成功构建了一个带有播放控件的媒体样式通知(完美运行)。小米设备上的锁屏控件始终发送相同的待处理意图 (android.intent.action.MEDIA_BUTTON),而在其他设备中,它完美地触发了预期的意图。

运行在相同代码上的两个设备如何触发两个不同的意图?

通知代码:

private void buildNotifications(final PlaybackStatus playbackStatus) {

        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 100, intent, 0);
        Intent intent1 = new Intent(this, MediaPlayerService.class).setAction(ConstantsForBroadCast.ACTION_KILL_APP);
        PendingIntent pendingIntent1 = PendingIntent.getService(this.getApplicationContext(), 0, intent1, 0);

        int notificationAction = R.drawable.play_song;//needs to be initialized
        PendingIntent play_pauseAction = null;


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

            createChannel();
        }

        notiB = new NotificationCompat.Builder(this, CHANNEL_ID);


        //Build a new notification according to the current state of the MediaPlayer
        if (playbackStatus == PlaybackStatus.PLAYING) {
            notificationAction = R.drawable.pause_song;

            //create the pause action
            play_pauseAction = playbackAction(1);
        } else if (playbackStatus == PlaybackStatus.PAUSED) {
            notificationAction = R.drawable.play_song;

            //create the play action
            play_pauseAction = playbackAction(0);
        }

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


            if (!Build.MANUFACTURER.equalsIgnoreCase("Huawei")) {
                notiB.setStyle(new MediaStyle()
                        .setMediaSession(mediaSession.getSessionToken())
                        .setShowActionsInCompactView(0, 1, 2));
            }


        } else {


            if (!Build.MANUFACTURER.equalsIgnoreCase("Huawei")) {
                notiB.setStyle(new MediaStyle()
                        .setMediaSession(mediaSession.getSessionToken())
                        .setCancelButtonIntent(pendingIntent1)
                        .setShowCancelButton(true)
                        .setShowActionsInCompactView(0, 1, 2));
            }


        }
        notiB.setSmallIcon(R.drawable.identifysong);
        notiB.setOngoing(playbackStatus == PlaybackStatus.PLAYING);
        notiB.setContentIntent(pendingIntent);
        notiB.setDeleteIntent(pendingIntent1);
        notiB.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
        notiB.setContentTitle(songInfoModelService.getSongName());
        notiB.setContentText(songInfoModelService.getArtistName());
        notiB.addAction(R.drawable.previous_song, "previous", playbackAction(3));
        notiB.addAction(notificationAction, "pause", play_pauseAction);
        notiB.addAction(R.drawable.next_song, "next", playbackAction(2));


        Glide.with(this).asBitmap().load(songInfoModelService.getAlbumIDArtwork()).apply(new RequestOptions()).listener(new RequestListener<Bitmap>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {

                Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
                notiB.setLargeIcon(bm);
                notification = notiB.build();
                showNotification(notification, playbackStatus);


                return true;
            }

            @Override
            public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {

                notiB.setLargeIcon(resource);
                notification = notiB.build();
                showNotification(notification, playbackStatus);

                return true;
            }
        }).submit();


    }

    private void showNotification(Notification notification, PlaybackStatus playbackStatus) {

        if (!isNotiAlive) {

            this.startForeground(NOTIFICATION_ID, notification);
            isNotiAlive = true;

        } else {

            notificationManager.notify(NOTIFICATION_ID, notification);
        }

        if (playbackStatus == PlaybackStatus.PAUSED) {

            this.stopForeground(false);
            isNotiAlive = false;
        }


    }

分配待处理意图的代码:

private PendingIntent playbackAction(int actionNumber) {
        Intent playbackAction = new Intent(this, MediaPlayerService.class);
        switch (actionNumber) {
            case 0:
                // Play
                playbackAction.setAction(ConstantsForBroadCast.ACTION_PLAY_FROM_NOTI);
                return PendingIntent.getService(this, actionNumber, playbackAction, 0);
            case 1:
                // Pause
                playbackAction.setAction(ConstantsForBroadCast.ACTION_PAUSE_FROM_NOTI);
                return PendingIntent.getService(this, actionNumber, playbackAction, 0);
            case 2:
                // Next track
                playbackAction.setAction(ConstantsForBroadCast.ACTION_PLAY_NEXT);
                return PendingIntent.getService(this, actionNumber, playbackAction, 0);
            case 3:
                // Previous track
                playbackAction.setAction(ConstantsForBroadCast.ACTION_PLAY_PREVIOUS);
                return PendingIntent.getService(this, actionNumber, playbackAction, 0);
            default:
                break;
        }
        return null;
    }

MediaSession 的代码:

 private void initMediaSession() throws RemoteException {
        if (mediaSessionManager != null) return; //mediaSessionManager exists

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
        }

        mediaSession = new MediaSessionCompat(this, "AudioPlayer", mReceiverComponent, null);

        transportControls = mediaSession.getController().getTransportControls();

        mediaSession.setActive(true);

        mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);



        updateMetaData();


        mediaSession.setCallback(new MediaSessionCompat.Callback() {
            @Override
            public void onPlay() {
                super.onPlay();

                resumeMedia();
            }

            @Override
            public void onPause() {
                super.onPause();

                pauseMedia();
            }

            @Override
            public void onSkipToNext() {
                super.onSkipToNext();
                skipToNext();

            }

            @Override
            public void onSkipToPrevious() {
                super.onSkipToNext();
                skipToPrevious();

            }

            @Override
            public boolean onMediaButtonEvent(Intent mediaButtonIntent) {



                return super.onMediaButtonEvent(mediaButtonIntent);
            }
        });


    }
4

1 回答 1

1

在您的onMediaButtonEvent是您需要接收媒体按钮类型的地方。Intent 的 action 总会有MEDIA_BUTTON,但是extras会改变。

@Override
public boolean onMediaButtonEvent(Intent eventIntent) {
    KeyEvent event = eventIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    //compare event.getKeyCode() with the relevant KeyEvent static constants
}
于 2018-09-10T18:33:59.230 回答