尝试在空对象上调用接口方法android.media.ession.ISessionController android.media.session.ISession.getController()'

本教程将介绍尝试在空对象上调用接口方法android.media.ession.ISessionController android.media.session.ISession.getController()'的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

尝试在空对象上调用接口方法android.media.ession.ISessionController android.media.session.ISession.getController()' 教程 第1张

问题描述

下面的代码是用于音乐通知播放器的,带有使用媒体会话的控件。每当我从通知中单击控件时,它就会崩溃,并出现上述错误。请看下面的代码,如果我错了,请纠正我。在下面的代码中,我使用了媒体会话和广播接收器来构建通知。"Track"是我的所有歌曲数据的模型类。

try {
 if (track.getImage() == null) {
  track.setImage(BitmapFactory.decodeResource(context.getResources(),
 R.mipmap.ic_launcher));
 }
 
 
 NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
 MediaSessionCompat mediaSessionCompat = new MediaSessionCompat(context, "tag");
 mediaSessionCompat.setMetadata(
new MediaMetadataCompat.Builder()
  .putString(MediaMetadata.METADATA_KEY_TITLE, track.getTitle())
  .putString(MediaMetadata.METADATA_KEY_ARTIST, track.getArtist())
  .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, track.getImage())
  .putString(MediaMetadata.METADATA_KEY_ALBUM, track.getAlbum())
  .build()
 );
 mediaSessionCompat.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
  MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
 
 PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder();
 
 stateBuilder.setActiveQueueItemId(MediaSession.QueueItem.UNKNOWN_ID);
 
 long actions = PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
 stateBuilder.setActions(actions);
 if (isPlaying) {
  stateBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f);
  mediaSessionCompat.setActive(true);
 
 } else {
  stateBuilder.setState(PlaybackStateCompat.STATE_PAUSED, 0, 1.0f);
  mediaSessionCompat.setActive(true);
 
 
 }
 mediaSessionCompat.setPlaybackState(stateBuilder.build());
 Bitmap icon = track.getImage();
 
 
 PendingIntent pendingIntentPrevious;
 int drw_previous;
 
 // pendingIntentPrevious = null;
 // drw_previous = 0;
 Intent intentPrevious = new Intent(context, NotificationActionService.class)
.setAction(ACTION_PREVIUOS);
 pendingIntentPrevious = PendingIntent.getBroadcast(context, 0,
intentPrevious, PendingIntent.FLAG_UPDATE_CURRENT);
 drw_previous = R.drawable.ic_back;
 Intent intentPlay = new Intent(context, NotificationActionService.class)
.setAction(ACTION_PLAY);
 PendingIntent pendingIntentPlay = PendingIntent.getBroadcast(context, 0,
intentPlay, PendingIntent.FLAG_UPDATE_CURRENT);
 
 PendingIntent pendingIntentNext;
 int drw_next;
 // pendingIntentNext = null;
 // drw_next = 0;
 Intent intentNext = new Intent(context, NotificationActionService.class)
.setAction(ACTION_NEXT);
 pendingIntentNext = PendingIntent.getBroadcast(context, 0,
intentNext, PendingIntent.FLAG_UPDATE_CURRENT);
 drw_next = R.drawable.ic_next;
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  notification = new NotificationCompat.Builder(context, CHANNEL_ID)
 .setSmallIcon(R.drawable.logo)
 .setContentTitle(track.getTitle())
 .setContentText(track.getArtist())
 .setLargeIcon(icon)
 .setAutoCancel(isPlaying ? false : true)
 .setOngoing(isPlaying ? true : false)
 .setWhen(0)
 .setNotificationSilent()
 .setSound(null)
 .addAction(drw_previous, "Previous", pendingIntentPrevious)
 .addAction(playbutton, "Play", pendingIntentPlay)
 .addAction(drw_next, "Next", pendingIntentNext)
 .setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(0, 1, 2)
.setMediaSession(mediaSessionCompat.getSessionToken()))
 .setPriority(NotificationCompat.PRIORITY_LOW)
 .build();
 
 } else {
  notification = new NotificationCompat.Builder(context, CHANNEL_ID)
 .setSmallIcon(R.drawable.logo)
 .setContentTitle(track.getTitle())
 .setContentText(track.getArtist())
 .setLargeIcon(icon)
 .setAutoCancel(true)
 .setOngoing(false)
 .setWhen(0)
 .setNotificationSilent()
 .setSound(null)
 .addAction(drw_previous, "Previous", pendingIntentPrevious)
 .addAction(playbutton, "Play", pendingIntentPlay)
 .addAction(drw_next, "Next", pendingIntentNext)
 .setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(0, 1, 2)
.setMediaSession(mediaSessionCompat.getSessionToken()))
 .setPriority(NotificationCompat.PRIORITY_LOW)
 .build();
 
 }
 
 notificationManagerCompat.notify(1, notification);
} catch (Exception e) {
 Log.e("media sesison", e.getLocalizedMessage());
}


推荐答案

内部有Android MediaSession限制SESSION_CREATION_LIMIT_PER_UID = 100;

您应该释放不再需要的MediaSession个实例。

怎么复制:

// Just create 100 instances of MediaSession
repeat(200) {
 val session = MediaSessionCompat(context, "Session") // Will cause a crash after 99 iterations
}

怎么修复:

// You should release MediaSession instances that you don't need anymore.
repeat(200) {
 val session = MediaSessionCompat(context, "Session")
 session.release()
}

好了关于尝试在空对象上调用接口方法android.media.ession.ISessionController android.media.session.ISession.getController()'的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。