如何制作媒体播放器的锁屏通知 [英] How to make lock screen notification for media player

查看:111
本文介绍了如何制作媒体播放器的锁屏通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在手机上获取锁定屏幕,我能够使所有功能正常运行,例如通知和应用程序的其他功能,但是当我尝试显示锁定屏幕时,它对于android M完全不起作用.

I am trying to get lock screen in the mobile I am able to get every thing work like notification and other things of my app but when I try to display the lock screen it is not working at all for android M.

private void initMediaSession() throws RemoteException {
    if (mediaSessionManager != null) return; //mediaSessionManager exists
    ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class);

    mediaSession = new MediaSessionCompat(getApplicationContext(), "AudioPlayer", mediaButtonReceiver, null);
    //Get MediaSessions transport controls
    transportControls = mediaSession.getController().getTransportControls();
    //set MediaSession -> ready to receive media commands
    mediaSession.setActive(true);
    //indicate that the MediaSession handles transport control commands
    // through its MediaSessionCompat.Callback.
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    mediaButtonIntent.setClass(this, MediaButtonReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0);
    mediaSession.setMediaButtonReceiver(pendingIntent);
    //Set mediaSession's MetaData
    updateMetaData();
    // passing the data


    // Attach Callback to receive MediaSession updates
    mediaSession.setCallback(new MediaSessionCompat.Callback() {
        // Implement callbacks
        @Override
        public void onPlay() {
            super.onPlay();
            messagesent();
            a = false;
            resumeMedia();
            buildNotification(PlaybackStatus.PLAYING);
        }

        @Override
        public void onPause() {
            super.onPause();
            messagesent();
            a = true;
            pauseMedia();
            buildNotification(PlaybackStatus.PAUSED);
        }

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

            skipToNext();
            updateMetaData();
            buildNotification(PlaybackStatus.PLAYING);
        }

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

            skipToPrevious();
            updateMetaData();
            buildNotification(PlaybackStatus.PLAYING);
        }

        @Override
        public void onStop() {
            super.onStop();
            removeNotification();
            //Stop the service
            pauseMedia();
            messagesent();
            stopSelf();
        }

        @Override
        public void onSeekTo(long position) {
            super.onSeekTo(position);
        }
    });
}

private void updateMetaData() {
    //replace with medias albumArt
    // Update the current metadata
    MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder();

    String artist;
    if (activeAudio.getArtist() != null) {
        artist = activeAudio.getArtist();
    } else {
        artist = "unknown";
    }
    String album;
    if (activeAudio.getAlbum() != null) {
        album = activeAudio.getAlbum();
    } else {
        album = "Album";
    }
    Bitmap albumArt;
    Uri myUri = Uri.parse(activeAudio.getAlbum_art());
    try {
        InputStream image_stream = getContentResolver().openInputStream(myUri);
        Bitmap bitmap = BitmapFactory.decodeStream(image_stream);
        if (bitmap != null) {
            albumArt = bitmap;
        } else {
            albumArt = BitmapFactory.decodeResource(getResources(),
                    R.drawable.music);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        albumArt = BitmapFactory.decodeResource(getResources(),
                R.drawable.music);
    }
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, albumArt);
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt);

    //lock screen icon for pre lollipop
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, albumArt);
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, activeAudio.getTitle());
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, activeAudio.getAlbum());
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album);
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, 1);
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, 1);

    mediaSession.setMetadata(metadataBuilder.build());
}

private void buildNotification(PlaybackStatus playbackStatus) {

    /**
     * Notification actions -> playbackAction()
     *  0 -> Play
     *  1 -> Pause
     *  2 -> Next track
     *  3 -> Previous track
     */

    MediaControllerCompat controller = mediaSession.getController();
    MediaMetadataCompat mediaMetadata = controller.getMetadata();
    MediaDescriptionCompat description = mediaMetadata.getDescription();

    RemoteViews views = new RemoteViews(getPackageName(),
            R.layout.customnotification);


    if (playbackStatus == PlaybackStatus.PLAYING || Singleton.getInstance().getMedia() == 1) {
        views.setImageViewResource(R.id.imageButton2,
                R.drawable.ic_pause_circle_outline_white_48dp);

        messagesent();

        views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(1));

    } else if (playbackStatus == PlaybackStatus.PAUSED || Singleton.getInstance().getMedia() == 2) {
        views.setImageViewResource(R.id.imageButton2,
                R.drawable.ic_play_circle_outline_white_48dp);
        messagesent();

        views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(0));

    }

    views.setViewVisibility(R.id.imageView, View.VISIBLE);

    // Intent notificationIntent = new Intent(this, Main2Activity.class);

    // PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
    //         notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


    views.setOnClickPendingIntent(R.id.imageButton3, playbackAction(3));
    views.setOnClickPendingIntent(R.id.imageButton4, playbackAction(2));

    views.setImageViewResource(R.id.imageButton3,
            R.drawable.ic_skip_previous_circle_outline_white_36dp);
    views.setImageViewResource(R.id.imageButton4,
            R.drawable.ic_skip_next_circle_outline_white_36dp);
    views.setTextViewText(R.id.textView, description.getTitle());
    views.setTextViewText(R.id.textView2, description.getSubtitle());
    views.setImageViewBitmap(R.id.imageView, description.getIconBitmap());


   NotificationCompat.Builder sta = new NotificationCompat.Builder(this);
   //  sta.setContentIntent(pendingIntent);
    sta.setContent(views);
    sta.setSmallIcon(R.drawable.ic_audiotrack_white_24dp);
    sta.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken()));


    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, sta.build());



}


public PendingIntent playbackAction(int actionNumber) {
    Intent playbackAction = new Intent(this, MediaService.class);
    switch (actionNumber) {
        case 0:
            // Play
            playbackAction.setAction(ACTION_PLAY);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 1:
            // Pause
            playbackAction.setAction(ACTION_PAUSE);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 2:
            // Next track
            playbackAction.setAction(ACTION_NEXT);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 3:
            // Previous track
            playbackAction.setAction(ACTION_PREVIOUS);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 4:
            playbackAction.setAction(Constants.ACTION.STOPFOREGROUND_ACTION);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        default:
            break;
    }
    return null;
}

我尝试设置通知.setstyle,但显示了一些错误. 我遵循了伊恩·莱克的视频,但仍然无法正常工作,可以帮助我做错什么事

I tried to set the notification .setstyle but it is showing some error. I followed the video of ian lake but it is still not working can some one help what I am doing wrong

推荐答案

我遵循了以下教程并获得了输出.

I followed the follow the following tutorial and get the output.

private Notification createNotification() {  
if (mMetadata == null || mPlaybackState == null) {
    return null;
}

Notification.Builder notificationBuilder = new Notification.Builder(mService);
int playPauseButtonPosition = 0;

// If skip to previous action is enabled
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0) {
    notificationBuilder.addAction(R.drawable.ic_prev_gray,
            mService.getString(R.string.label_previous), mPreviousIntent);

    // If there is a "skip to previous" button, the play/pause button will
    // be the second one. We need to keep track of it, because the MediaStyle notification
    // requires to specify the index of the buttons (actions) that should be visible
    // when in compact view.
    playPauseButtonPosition = 1;
}

addPlayPauseAction(notificationBuilder);

// If skip to next action is enabled
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) {
    notificationBuilder.addAction(R.drawable.ic_next_gray,
            mService.getString(R.string.label_next), mNextIntent);
}

MediaDescription description = mMetadata.getDescription();

String fetchArtUrl = null;
Bitmap art = null;
if (description.getIconUri() != null) {
    // This sample assumes the iconUri will be a valid URL formatted String, but
    // it can actually be any valid Android Uri formatted String.
    // async fetch the album art icon
    String artUrl = description.getIconUri().toString();
    if (art == null) {
        fetchArtUrl = artUrl;
        // use a placeholder art while the remote art is being downloaded
        art = BitmapFactory.decodeResource(mService.getResources(), R.mipmap.ic_launcher);
    }
}

notificationBuilder
        .setStyle(new Notification.MediaStyle()
            .setShowActionsInCompactView(new int[]{playPauseButtonPosition})  // show only play/pause in compact view
            .setMediaSession(mSessionToken))
        .setColor(mNotificationColor)
        .setSmallIcon(R.drawable.ic_notification)
        .setVisibility(Notification.VISIBILITY_PUBLIC)
        .setUsesChronometer(true)
        .setContentIntent(createContentIntent(description)) // Create an intent that would open the UI when user clicks the notification
        .setContentTitle(description.getTitle())
        .setContentText(description.getSubtitle())
        .setLargeIcon(art);

setNotificationPlaybackState(notificationBuilder);
if (fetchArtUrl != null) {
    fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder);
}

return notificationBuilder.build();

}

并尝试遵循教程 由于android版本没有问题,因此它也不会在棒棒糖中显示通知.或者您甚至也可以复制以下的tutoria,

and try to follow the tutorial as there is no issue in the android version it is just not showing the notification in lollipop also.Or you can even just copy the following tutoria alsotutorial or

   Notification.MediaStyle style = new Notification.MediaStyle();

Intent intent = new Intent( getApplicationContext(), MediaPlayerService.class );
intent.setAction( ACTION_STOP );
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, intent, 0);
Notification.Builder builder = new Notification.Builder( this )
        .setSmallIcon( R.drawable.ic_launcher )
        .setContentTitle( "Media Title" )
        .setContentText( "Media Artist" )
        .setDeleteIntent( pendingIntent )
        .setStyle( style );

如果能够获取锁定屏幕将自动显示的样式,请尝试使用该问题的通知样式.

try to use the notification style thats the issue if you are able to get the style the lock screen will show automaticaly .

这篇关于如何制作媒体播放器的锁屏通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆