媒体通知在奥利奥不起作用

时间:2018-01-22 22:00:27

标签: android notifications android-8.0-oreo

我必须对以下代码进行哪些修改才能使通知在API 26+中工作,因为Oreo需要频道,而且此代码有点混乱。我尝试过诋毁频道,但没有工作可能做错了所以我在没有任何频道或任何其他修改的情况下发布未经修改的代码。

public class MediaPlayerService extends Service implements PlayerFragment.onPlayPauseListener {

private MediaSessionManager m_objMediaSessionManager;
private MediaSession m_objMediaSession;
private MediaController m_objMediaController;
private FFmpegMediaPlayer m_objMediaPlayer;
private NotificationManager notificationManager;

private ServiceCallbacks serviceCallbacks;

Intent startIntent;

PlayerFragment pFragment;

private boolean isSwipable = false;

public class LocalBinder extends Binder {
    public MediaPlayerService getService() {
        // Return this instance of MyService so clients can call public methods
        return MediaPlayerService.this;
    }
}

public void setCallbacks(ServiceCallbacks callbacks) {
    serviceCallbacks = callbacks;
    pFragment = serviceCallbacks.getPlayerFragment();
    if (pFragment != null)
        pFragment.mCallback7 = this;
    if (m_objMediaSessionManager == null) {
        initMediaSessions();
    }
    handleIntent(startIntent);
}

@Override
public IBinder onBind(Intent intent) {
    startIntent = intent;
    return new LocalBinder();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    try {
        pFragment = ((HomeActivity) PlayerFragment.ctx).getPlayerFragment();
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (pFragment != null)
        pFragment.mCallback7 = this;

    if (m_objMediaSessionManager == null) {
        initMediaSessions();
    }
    handleIntent(intent);
    return super.onStartCommand(intent, flags, startId);
}

private void handleIntent(Intent intent) {
    if (intent == null || intent.getAction() == null)
        return;

    String action = intent.getAction();

    if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_PLAY)) {
        m_objMediaController.getTransportControls().play();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_PAUSE)) {
        m_objMediaController.getTransportControls().pause();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_FAST_FORWARD)) {
        m_objMediaController.getTransportControls().fastForward();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_REWIND)) {
        m_objMediaController.getTransportControls().rewind();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_PREVIOUS)) {
        m_objMediaController.getTransportControls().skipToPrevious();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_NEXT)) {
        m_objMediaController.getTransportControls().skipToNext();
    } else if (m_objMediaController != null && action.equalsIgnoreCase(Constants.ACTION_STOP)) {
        m_objMediaController.getTransportControls().stop();
    }
}

private void buildNotification(Notification.Action action) {

    Notification.MediaStyle style = new Notification.MediaStyle();
    style.setShowActionsInCompactView(1);
    style.setMediaSession(m_objMediaSession.getSessionToken());

    Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class);
    intent.setAction(Constants.ACTION_STOP);
    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, intent, 0);

    String artist;

    if (pFragment != null && pFragment.localIsPlaying) {
        artist = pFragment.localTrack.getArtist();
    } else {
        artist = "";
    }

    Intent notificationIntent = new Intent(this, HomeActivity.class);
    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    Bitmap bmp = null;

    try {
        bmp = ((BitmapDrawable) pFragment.selected_track_image.getDrawable()).getBitmap();
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (bmp == null) {
        bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_default);
    }

    Notification notification = new Notification.Builder(this)
            .setStyle(style)
            .setSmallIcon(R.drawable.ic_notification)
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .setDeleteIntent(pendingIntent)
            .addAction(generateAction(R.drawable.ic_skip_previous_notif, "Previous", Constants.ACTION_PREVIOUS))
            .addAction(action)
            .addAction(generateAction(R.drawable.ic_skip_next_notif, "Next", Constants.ACTION_NEXT))
            .setContentTitle(pFragment.selected_track_title.getText())
            .setContentText(artist)
            .setLargeIcon(bmp)
            .build();

    notification.contentIntent = pendingNotificationIntent;
    notification.priority = Notification.PRIORITY_MAX;

    if (isSwipable || (pFragment.mMediaPlayer != null && pFragment.mMediaPlayer.isPlaying())) {
        notification.flags |= Notification.FLAG_ONGOING_EVENT;
    }


    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    try {
        notificationManager.notify(1, notification);
    } catch (Exception e) {
        e.printStackTrace();
    }

    updateMediaSession();

}

private Notification.Action generateAction(int icon, String title, String intentAction) {
    Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class);
    intent.setAction(intentAction);
    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, intent, 0);
    return new Notification.Action.Builder(icon, title, pendingIntent).build();
}

void updateMediaSession() {
    if (pFragment != null) {
        m_objMediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

        MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder();
        if (pFragment.localIsPlaying) {
            if (pFragment.localTrack != null) {
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, pFragment.localTrack.getTitle());
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, pFragment.localTrack.getArtist());
            }
        } else {
            if (pFragment.track != null) {
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, pFragment.track.getTitle());
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, "");
            }
        }
        if (((BitmapDrawable) pFragment.selected_track_image.getDrawable()).getBitmap() != null) {
            try {
                metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, ((BitmapDrawable) pFragment.selected_track_image.getDrawable()).getBitmap());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        m_objMediaSession.setMetadata(metadataBuilder.build());
        PlaybackState.Builder stateBuilder = new PlaybackState.Builder();
        stateBuilder.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS);
        try {
            if (pFragment.mMediaPlayer != null) {
                stateBuilder.setState(!pFragment.mMediaPlayer.isPlaying() ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 1.0f);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        m_objMediaSession.setPlaybackState(stateBuilder.build());
        m_objMediaSession.setActive(true);
    }
}

private void initMediaSessions() {

    if (pFragment != null) {
        pFragment.mCallback7 = this;

        m_objMediaPlayer = pFragment.mMediaPlayer;
        m_objMediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
        m_objMediaSession = new MediaSession(getApplicationContext(), "sample session");

        m_objMediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

        MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder();
        if (pFragment.localIsPlaying) {
            if (pFragment.localTrack != null) {
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, pFragment.localTrack.getTitle());
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, pFragment.localTrack.getArtist());
            }
        } else {
            if (pFragment.track != null) {
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, pFragment.track.getTitle());
                metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, "");
            }
        }
        if (pFragment.selected_track_image != null && pFragment.selected_track_image.getDrawable() != null) {
            if (((BitmapDrawable) pFragment.selected_track_image.getDrawable()).getBitmap() != null) {
                metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, ((BitmapDrawable) pFragment.selected_track_image.getDrawable()).getBitmap());
            }
        }


        m_objMediaSession.setMetadata(metadataBuilder.build());
        PlaybackState.Builder stateBuilder = new PlaybackState.Builder();
        stateBuilder.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS);
        try {
            if (pFragment.mMediaPlayer != null) {
                stateBuilder.setState(!pFragment.mMediaPlayer.isPlaying() ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 1.0f);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        m_objMediaSession.setPlaybackState(stateBuilder.build());

        m_objMediaSession.setActive(true);
        m_objMediaController = m_objMediaSession.getController();
        m_objMediaSession.setCallback(new MediaSession.Callback() {

            @Override
            public void onPlay() {
                super.onPlay();
                try {
                    Log.d(Constants.LOG_TAG, "onPlay");
                    PlayerFragment pFrag = pFragment;
                    if (pFrag != null) {
                        if (!pFrag.isStart) {
                            pFrag.togglePlayPause();
                        }
                        pFrag.isStart = false;
                        buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
                    }
                } catch (Exception e) {

                }
            }

            @Override
            public void onPause() {
                super.onPause();
                try {
                    PlayerFragment pFrag = pFragment;
                    if (pFrag != null) {
                        pFrag.togglePlayPause();
                        buildNotification(generateAction(R.drawable.ic_play_notif, "Play", Constants.ACTION_PLAY));
                    }
                } catch (Exception e) {

                }
            }

            @Override
            public void onSkipToNext() {
                super.onSkipToNext();
                try {
                    if (pFragment != null) {
                        pFragment.onCallbackCalled(2);
                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
                            }
                        }, 100);
                    }
                } catch (Exception e) {

                }

            }

            @Override
            public void onSkipToPrevious() {
                super.onSkipToPrevious();
                try {
                    if (pFragment != null) {
                        pFragment.onCallbackCalled(3);
                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
                            }
                        }, 100);
                    }
                } catch (Exception e) {

                }

            }

            @Override
            public void onFastForward() {
                super.onFastForward();
                Log.d(Constants.LOG_TAG, "onFastForward");
                if (pFragment != null)
                    pFragment.mCallback.onComplete();
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
                    }
                }, 100);
            }

            @Override
            public void onRewind() {
                super.onRewind();
                Log.d(Constants.LOG_TAG, "onRewind");
                if (pFragment != null)
                    pFragment.mCallback.onPreviousTrack();
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
                    }
                }, 100);
            }

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

            }

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

            @Override
            public void onSetRating(Rating rating) {
                super.onSetRating(rating);
            }
        });
    }
}

@Override
public boolean onUnbind(Intent intent) {
    m_objMediaSession.release();
    return super.onUnbind(intent);
}

@Override
public void onPlayPause() {
    if (pFragment.mMediaPlayer != null && pFragment.mMediaPlayer.isPlaying()) {
        buildNotification(generateAction(R.drawable.ic_pause_notif, "Pause", Constants.ACTION_PAUSE));
    } else {
        buildNotification(generateAction(R.drawable.ic_play_notif, "Play", Constants.ACTION_PLAY));
    }
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    try {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancel(1);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:0)

我可以确认清除应用缓存(我没有清除数据,只是缓存)并重新启动手机会恢复通知。我之前也收到了之前帖子中提到的“启用通知”屏幕。现在通知按预期工作。