我想在移动设备上获得锁定屏幕我能够让每件事情都像我的应用程序的通知和其他东西一样工作但是当我尝试显示锁定屏幕时它根本不适用于Android M. / p>
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但它显示出一些错误。 我按照伊恩湖的视频,但仍然没有工作可以帮助我做错了什么
答案 0 :(得分:1)
首先检查您的应用是否在build.gradle上使用targetSdkVersion 22工作。如果它工作,那么你有Marshmallow运行时权限相关的问题。如果授予权限,则在Manifest上添加所需权限并运行initMediaSession()。详情Link1 和Link2。
如果这对您没有帮助,请提供您的错误详情。
答案 1 :(得分:1)
我按照以下教程操作并获得输出。
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();
}
并尝试关注tutorial 因为在Android版本中没有问题,它只是没有在棒棒糖中显示通知。或者你甚至可以复制以下的tutoria tutorial 或
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 );
如果您能够获得锁屏将自动显示的样式,请尝试使用该问题的通知样式。