Фоновая музыка (MediaManager.createBackgroundMedia) вызывает сбои при закрытии / открытии приложения - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема с воспроизведением фоновой музыки в моем приложении (это игра), по какой-то причине происходит сбой приложения, если вы удаляете приложение из списка последних приложений Android, переключение на другое приложение работает нормально, другими словами, если я помещаю приложение в фоновом режиме, а затем возобновить, он работает, музыка останавливается и возобновляется (см. код ниже), но если я убиваю приложение, то происходит сбой

Насколько я знаю, это происходит только на Android 6, я тестировал на LG Nexus 5 и Samsung Galaxy S7, иногда приложение не падает, когда вы его убиваете, но происходит сбой, когда вы запускаете его после

Этого не происходит на Android 8

Init ()

String fileName = getAppHomePath() + "bgmusic.mp3";
try {
    InputStream inputStream = Display.getInstance().getResourceAsStream(getClass(), "/bgmusic.mp3");
    OutputStream outputStream = openFileOutputStream(fileName);
    Util.copy(inputStream, outputStream);
    backgroundMedia = MediaManager.createBackgroundMedia(fileName);
    backgroundMedia.setVolume(50);
    backgroundMedia.play();
} catch(IOException e) {
    Log.e(e);
}

старт ()

if (backgroundMedia != null) {
    if (!backgroundMedia.isPlaying()) backgroundMedia.play();
}

остановка ()

if (backgroundMedia != null) {
    if (backgroundMedia.isPlaying()) backgroundMedia.pause();
}

уничтожить ()

if (backgroundMedia != null) {
    backgroundMedia.cleanup();
}

изначально в destroy() не было кода, я поместил его на всякий случай, когда он вызывается в тот момент, когда приложение убивается, но в любом случае происходит сбой

Я также получил (DDMS) журналы с устройства

11-15 14:51:42.431: E/ActivityThread(4952): Activity com.manyukhin.cerebrate.words.synonyms.WordsSynonymsStub has leaked ServiceConnection com.codename1.impl.android.e$3@df3ed35 that was originally bound here
11-15 14:51:42.431: E/ActivityThread(4952): android.app.ServiceConnectionLeaked: Activity com.manyukhin.cerebrate.words.synonyms.WordsSynonymsStub has leaked ServiceConnection com.codename1.impl.android.e$3@df3ed35 that was originally bound here
11-15 14:51:42.431: E/ActivityThread(4952):     at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1092)
11-15 14:51:42.431: E/ActivityThread(4952):     at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:986)
11-15 14:51:42.431: E/ActivityThread(4952):     at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1303)
11-15 14:51:42.431: E/ActivityThread(4952):     at android.app.ContextImpl.bindService(ContextImpl.java:1286)
11-15 14:51:42.431: E/ActivityThread(4952):     at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.impl.android.e.g(AndroidImplementation.java:3133)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.o.q.d(Display.java:4152)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.media.c.a(MediaManager.java:65)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.manyukhin.cerebrate.words.synonyms.v.a(Unknown Source)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.manyukhin.cerebrate.words.synonyms.WordsSynonymsStub.a(WordsSynonymsStub.java:133)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.manyukhin.cerebrate.words.synonyms.WordsSynonymsStub$1.run(WordsSynonymsStub.java:114)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.o.q.m(Display.java:1137)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.o.q.j(Display.java:932)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.o.ai.run(RunnableWrapper.java:120)
11-15 14:51:42.431: E/ActivityThread(4952):     at com.codename1.impl.b$1.run(CodenameOneThread.java:60)
11-15 14:51:42.431: E/ActivityThread(4952):     at java.lang.Thread.run(Thread.java:818)
11-15 14:51:42.548: E/PBSessionCacheImpl(3716): sessionId[16344683113135691] not persisted.
11-15 14:51:42.628: E/ACDB-LOADER(198): Error: ACDB AudProc vol returned = -19
11-15 14:51:43.635: E/AndroidRuntime(5154): FATAL EXCEPTION: main
11-15 14:51:43.635: E/AndroidRuntime(5154): Process: com.manyukhin.cerebrate.words.synonyms, PID: 5154
11-15 14:51:43.635: E/AndroidRuntime(5154): java.lang.RuntimeException: Unable to start service com.codename1.media.AudioService@134375 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.app.ActivityThread.-wrap17(ActivityThread.java)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.os.Looper.loop(Looper.java:148)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at java.lang.reflect.Method.invoke(Native Method)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-15 14:51:43.635: E/AndroidRuntime(5154): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
11-15 14:51:43.635: E/AndroidRuntime(5154):     at com.codename1.media.AudioService.onStartCommand(AudioService.java:59)
11-15 14:51:43.635: E/AndroidRuntime(5154):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3010)
11-15 14:51:43.635: E/AndroidRuntime(5154):     ... 8 more

Как я понял createBackgroundMedia() запускает Сервис, а затем не останавливает его, когда приложение убивается, есть ли обходной путь для этого?

EDIT

проблема подтверждена на Android 4.3, 5.0 и 6.0

Я изменил код на следующий:

начало ()

String fileName = getAppHomePath() + "bgmusic.mp3";
try {
    InputStream inputStream = Display.getInstance().getResourceAsStream(getClass(), "/bgmusic.mp3");
    OutputStream outputStream = openFileOutputStream(fileName);
    Util.copy(inputStream, outputStream);
    backgroundMedia = MediaManager.createBackgroundMedia(fileName);
    backgroundMedia.setVolume(50);
    backgroundMedia.play();
} catch(IOException e) {
    Log.e(e);
}    

остановка ()

if (backgroundMedia != null) {
    backgroundMedia.cleanup();
}

Я думал, что это поможет, поскольку backgroundMedia.cleanup() должен остановить воспроизведение и освободить все связанные ресурсы, включая фоновый сервис, но это не помогло, проблема все еще существует

...