Я получаю этот сбой только для устройств Samsung под управлением Android 11. Очевидно, приложение вызывает startForegroundService(intent)
и требует, чтобы я отправил уведомление, чтобы пользователь знал, что я запускаю службу переднего плана, но этот вызов startForegroundService(intent)
никогда не выполнялся в приложении исходный код, возможно ли, что Samsung произвела индивидуальную реализацию Android 11 и автоматически вызывает startForegroundService(intent)
всякий раз, когда я вызываю startService(intent)
?
Трассировки стека
Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{4ab4323 u0 {app package name}/{library package name}.player.PlayerService}
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2240)
android.os.Handler.dispatchMessage (Handler.java:106)
android.os.Looper.loop (Looper.java:246)
android.app.ActivityThread.main (ActivityThread.java:8506)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
Я запускаю службу с помощью context.startService(intent)
, и служба запускается в OnResume приложения, а контекст - это контекст приложения.
Также вот как сервис объявлен в манифесте
<service
android:name=".player.PlayerService"
android:exported="false"
android:foregroundServiceType="mediaPlayback"
android:stopWithTask="false">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
Обновление: я нашел причину, по которой выполняется вызов startForegroundService(Intent)
, я использую следующий приемник от Android, чтобы помочь обрабатывать устройства управления действиями, такие как кнопки наушников, поэтому, поскольку я преобразовал приложение в androidx, он начал использовать новый MediaButtonReceiver
<receiver android:name="androidx.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Это код, который выполняется, когда Получатель получает событие
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null
|| !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())
|| !intent.hasExtra(Intent.EXTRA_KEY_EVENT)) {
Log.d(TAG, "Ignore unsupported intent: " + intent);
return;
}
ComponentName mediaButtonServiceComponentName =
getServiceComponentByAction(context, Intent.ACTION_MEDIA_BUTTON);
if (mediaButtonServiceComponentName != null) {
intent.setComponent(mediaButtonServiceComponentName);
startForegroundService(context, intent);
return;
}
ComponentName mediaBrowserServiceComponentName = getServiceComponentByAction(context,
MediaBrowserServiceCompat.SERVICE_INTERFACE);
if (mediaBrowserServiceComponentName != null) {
PendingResult pendingResult = goAsync();
Context applicationContext = context.getApplicationContext();
MediaButtonConnectionCallback connectionCallback =
new MediaButtonConnectionCallback(applicationContext, intent, pendingResult);
MediaBrowserCompat mediaBrowser = new MediaBrowserCompat(applicationContext,
mediaBrowserServiceComponentName, connectionCallback, null);
connectionCallback.setMediaBrowser(mediaBrowser);
mediaBrowser.connect();
return;
}
throw new IllegalStateException("Could not find any Service that handles "
+ Intent.ACTION_MEDIA_BUTTON + " or implements a media browser service.");
}
Вы можете видеть, что на самом деле он запускает службу переднего плана, я все еще изучаю сбой, но, по крайней мере, я знаю, что в приложении запущена служба переднего плана.
Кроме того, этот сбой происходит не только в Samsung, как я думал, сгруппированные отчеты о сбоях Samsung разбились вместе, потому что это сбой на платформе Android, другие экземпляры того же сбоя происходят реже, поэтому они были далеко внизу в списке сбоев на firebase.