【发布时间】:2018-08-31 17:36:27
【问题描述】:
我在 Android Dashboard 崩溃日志中看到了这个错误:
Context.startForegroundService() 没有调用 Service.startForeground()(没有可用的位置)
我了解 Oreo 中引入的背景限制,并已阅读 this post。
但是,对于运行 Android Wear 8.0 的一小部分用户,我仍然收到此错误消息。令人困惑的是,并非所有用户都在运行 8.0。
根据文档,如果您调用 Context.startForgroundService(),则必须在 5 秒内通过在服务中调用 startForeground() 来显示通知(我假设 MediaBrowserCompat 正在调用 Context.startForgroundService())。
但是,如果我使用的是MediaBrowserServiceCompat,我不确定是否需要这样做。当用户点击播放开始音频播放时,我确实会显示前台通知。
public class MediaActivity {
private MediaBrowserCompat mMediaBrowserCompat;
@Override
public void onCreate() {
super.onCreate(savedInstanceState);
mMediaBrowserCompat = new MediaBrowserCompat(
this,
new ComponentName(this, MediaPlayerService.class),
mMediaBrowserCompatConnectionCallback,
getIntent().getExtras()
);
mMediaBrowserCompat.connect();
}
}
private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
super.onConnected();
final MediaControllerCompat mcc = new MediaControllerCompat(MediaActivity.this, mMediaBrowserCompat.getSessionToken());
mcc.registerCallback(mMediaControllerCompatCallback);
MediaControllerCompat.setMediaController(mActivity, mcc);
}
};
public class MediaPlayerService extends MediaBrowserServiceCompat {
@Override
public void onCreate() {
super.onCreate();
//Should I add a startForeground notification here
}
}
private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {
@Override
public void onPlay() {
super.onPlay();
final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID)
...
startForeground(101, builder.build());
}
@Override
public void onPause() {
super.onPause();
}
};
【问题讨论】:
-
我在 Google Dashboard 中报告了同样的问题。与@Stephen Kennedy 所理解的相反,我们不能调用 startForegroundService,因为该服务是由 MediaBrowser 触发和启动的。在这一点上,我认为这是 Android 的一个错误,我们必须忍受它。
-
是的,我知道我不应该在 MediaService 中调用
Service.startForeground()。 issuetracker 中有一个似乎与此相关的错误:issuetracker.google.com/issues/76112072
标签: android wear-os android-8.0-oreo foreground-service mediabrowserservicecompat