2016-04-02 10 views
3

Ich habe einen MusicService für MediaPlayback-, wich verwendet einen Mediaplayer mit den Einstellungen:Mediaplayer manchmal nicht vorbereitet, wenn der Bildschirm gesperrt ist

player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

und jene Hörer gesetzt:

OnPreparedListener, OnCompletionListener, OnErrorListener, OnSeekCompleteListener 

Der Mediaplayer verwendet wird, für die MP3-Wiedergabe. Wenn ein Song fertig ist, wird onCompletion aufgerufen. Dann wird PlayNext aufgerufen, der den MediaPlayer zurücksetzt und dann die Datenquelle mit dem URI des nächsten Tracks setzt. Uri geladen mit:

Uri trackUri = ContentUris .withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songId);

Dann wird der Spieler hergestellt wird, dann wird der Spieler gestartet. Das funktioniert gut, aber nur manchmal, wenn das Gerät gesperrt ist und spielte etwa 1-3 Songs, während es gesperrt wurde und der nächste Song sollte beginnen, der Player nicht vorbereitet, bis ich den Einschaltknopf drücken. Ich habe herausgefunden, dass wenn ich den PowerButton nicht drücke, dauert es ca. 2 Minuten, um den Player vorzubereiten.

Ich habe jetzt alles protokolliert und ein paar benutzerdefinierte Ausgaben mit Log.e (...) gemacht. Dies wird vor löscht prepare() (prepareAsync() liefert das gleiche Ergebnis) aufgerufen: E/MusicService: Preparing now...

Diese heraus genommen wird, wenn onPrepared genannt wird:

E/MusicService: Player prepared. 

Das ist also die vollen Geräte -Ausgang nach „Vorbereitung jetzt ...“ wird ausgegeben:

04-02 13:54:55.506 12517-12517/at.htlleonding.musync E/MusicService: Preparing now. 
04-02 13:54:55.525 811-888/? E/libsuspend: Error writing to /sys/power/state: Device or resource busy 
04-02 13:54:55.544 246-14756/? D/offload_visualizer: thread exit 
04-02 13:54:55.546 246-14754/? V/offload_effect_bundle: offload_effects_bundle_hal_stop_output output 1879 pcm_id 9 
04-02 13:54:55.546 246-14754/? D/hardware_info: hw_info_append_hw_type : device_name = speaker 
04-02 13:54:55.549 246-14752/? E/audio_hw_primary: offload_thread_loop: Compress handle is NULL 
04-02 13:54:55.549 246-924/? D/audio_hw_primary: adev_close_output_stream: enter:stream_handle(0xb5bfa640) 
04-02 13:54:55.549 246-924/? D/audio_hw_primary: out_standby: enter: stream (0xb5bfa640) usecase(3: compress-offload-playback) 
04-02 13:54:55.555 246-924/? W/AudioFlinger: moveEffectChain_l() effect chain for session 0 not on source thread 0xb59fa000 
04-02 13:54:55.611 246-15030/? I/FFmpegExtractor: android-source:0xb1834060 
04-02 13:54:55.820 811-888/? E/libsuspend: Error writing to /sys/power/state: Device or resource busy 
04-02 13:54:55.972 246-15030/? I/FFMPEG: [mp3 @ 0xae2f4400] Skipping 0 bytes of junk at 2177007. 

... theres dann nicht ausgegeben, bis ich den power~~POS=TRUNC getroffen. Dann ist das Lied vorbereitet.

Wenn sich jemand für die volle Ausgabe interessiert, nachdem ich den PowerButton gedrückt habe, bis "Player prepared" aufgerufen wird, I created a Gist here.

Nebennotiz: Während die App verwendet wird, werden in einigen Fragmenten einige Album-Covers angezeigt. Sie sind voll mit Picasso, also muss ich mir keine Gedanken über das Zwischenspeichern von Speichern machen. Einige ImageViews werden ohne Picasso gefüllt (z. B. die ImageViews, die die Zeichenelemente meiner PlayerControls enthalten). Vielleicht gibt es Probleme mit dem Speicher/Ressourcen?

Antwort

0

Ich könnte die Antwort in einem anderen Thread gefunden haben, wo einige beim Streaming von Musik das gleiche Problem konfrontiert here.

Meine letzte Lösung ist eine WakeLock zu verwenden, die ich vor dem Vorbereiten eines Songs benötige und wieder onPrepared und onError und onDestroy meines Dienstes freigeben. Es ist wichtig, es wieder freizugeben, um die Batterie zu schonen. Stellen Sie sicher, check if the WakeLock is held bevor Sie es freigeben.

Ich eröffne mein WakeLock wie dies in onCreate meiner Service:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MusicService"); 

aquire:

wakeLock.acquire(); 

Release:

if(wakeLock.isHeld()) 
     wakeLock.release(); 

die Wiedergabe nun getestet ca. 10 Minuten und hörte bis jetzt nicht auf. Ich weiß nicht, ob dies eine sehr batteriesichernde Lösung ist