Android Auto: My App doesn't play audio -
i'm implementing android auto support app, not working properly. i've followed google's documentation , tutorials, audio not working. controls, album art, artist name, etc., appear fine.
strange behaviour: after running spotify app through auto emulator , playing song, if go app , try play audio, works!
here's service class i've implemented:
/** * created feliperrm on 8/13/2016. */ @targetapi(build.version_codes.lollipop) public class automediabrowserservice extends mediabrowserservicecompat { private static final string current_media_position = "media_position_key"; private static final int play = 1; private static final int pause = 2; private static final int buffering = 3; private static final int connecting = 4; private static final int stopped = 5; mediaplayer mediaplayer; private static final string my_media_root_id = "meuiddaraiz"; mediasessioncompat msession; @override public void oncreate() { super.oncreate(); msession = new mediasessioncompat(this, "session tag"); setsessiontoken(msession.getsessiontoken()); // set callback object handle play control requests, // implements mediasession.callback msession.setcallback(new mediasessioncompat.callback() { @override public void onplay() { super.onplay(); playmedia( preferencemanager.getdefaultsharedpreferences( getapplicationcontext() ).getint( current_media_position, 0 ), null ); } //this called when pause button pressed, or when onplayfrommediaid called in //order pause playing media @override public void onpause() { super.onpause(); setmediaplaybackstate(pause); pausemedia(); } @override public void onstop() { super.onstop(); setmediaplaybackstate(stopped); if( mediaplayer != null ) { pausemedia(); mediaplayer.release(); preferencemanager.getdefaultsharedpreferences(automediabrowserservice.this).edit().putint( current_media_position, 0 ).commit(); } } @override public void onplayfrommediaid(string mediaid, bundle extras) { super.onplayfrommediaid(mediaid, extras); msession.setmetadata(new mediametadatacompat.builder() .puttext(mediametadatacompat.metadata_key_title, "primeira musica") .puttext(mediametadatacompat.metadata_key_artist, "joãozinho das rezas") .puttext(mediametadatacompat.metadata_key_genre, "gospel") .puttext(mediametadatacompat.metadata_key_album_art_uri, "http://70.38.6.72/~vivafe/web/wp-content/uploads/2016/08/01.jpg") .build() ); playmedia(0, mediaid); } @override public void onplayfromsearch(string query, bundle extras) { super.onplayfromsearch(query, extras); } }); msession.setactive(true); } private void setmediaplaybackstate( int state ) { playbackstatecompat playbackstate = null; switch (state) { case play: playbackstate = new playbackstatecompat.builder() .setactions( playbackstatecompat.action_play_pause | playbackstatecompat.action_skip_to_next | playbackstatecompat.action_skip_to_previous ) .setstate( playbackstatecompat.state_playing, 0, 1 ) .build(); break; case pause: playbackstate = new playbackstatecompat.builder() .setactions( playbackstatecompat.action_play_pause ) .setstate(playbackstatecompat.state_paused, 0, 1) .build(); break; case buffering: playbackstate = new playbackstatecompat.builder() .setactions( playbackstatecompat.action_stop ) .setstate(playbackstatecompat.state_buffering, 0, 1) .build(); break; case connecting: playbackstate = new playbackstatecompat.builder() .setactions( playbackstatecompat.action_stop ) .setstate(playbackstatecompat.state_connecting, 0, 1) .build(); break; case stopped: playbackstate = new playbackstatecompat.builder() .setactions( playbackstatecompat.action_play_from_media_id ) .setstate(playbackstatecompat.state_stopped, 0, 1) .build(); break; } msession.setplaybackstate( playbackstate ); } private void playmedia(final int position, string id ) { setmediaplaybackstate(buffering); if( mediaplayer != null ) try { mediaplayer.reset(); } catch (exception e){ mediaplayer = new mediaplayer(); e.printstacktrace(); } else mediaplayer = new mediaplayer(); try { mediaplayer.setaudiostreamtype(audiomanager.stream_music); mediaplayer.setdatasource("http://70.38.6.72/~vivafe/web/wp-content/uploads/2016/08/mateus-01.mp3"); mediaplayer.prepareasync(); } catch (exception e){ e.printstacktrace(); } mediaplayer.setonpreparedlistener(new mediaplayer.onpreparedlistener() { @override public void onprepared(mediaplayer mediaplayer) { mediaplayer.start(); if( position > 0 ) mediaplayer.seekto( position ); setmediaplaybackstate(play); } }); mediaplayer.setoninfolistener(new mediaplayer.oninfolistener() { @override public boolean oninfo(mediaplayer mediaplayer, int state, int extra) { switch (state){ case mediaplayer.media_info_buffering_start:{ log.d("mediaplayer","startbuffer"); setmediaplaybackstate(buffering); break; } case mediaplayer.media_info_buffering_end:{ log.d("mediaplayer","endbuffer"); setmediaplaybackstate(play); } } return true; } }); mediaplayer.setonerrorlistener(new mediaplayer.onerrorlistener() { @override public boolean onerror(mediaplayer mediaplayer, int state, int extra) { log.e("mediaplayer error", string.valueof(state)); return false; } }); } private void pausemedia() { if( mediaplayer != null ) { mediaplayer.pause(); preferencemanager.getdefaultsharedpreferences( ).edit().putint( current_media_position, mediaplayer.getcurrentposition() ).commit(); } } @nullable @override public browserroot ongetroot(string s, int i, bundle bundle) { return new browserroot(my_media_root_id, null); } @override public void onloadchildren(@nonnull string parentid, @nonnull result<list<mediabrowsercompat.mediaitem>> result) { list<mediabrowsercompat.mediaitem> mediaitems = new arraylist<>(); // check if root menu: if (parentid.equals(my_media_root_id)) { mediaitems.add(new mediabrowsercompat.mediaitem(new mediadescriptioncompat.builder().setmediaid("iddopastor").settitle("pastor").build(), mediabrowsercompat.mediaitem.flag_browsable)); } else if (parentid.equals("iddopastor")) { mediaitems.add(new mediabrowsercompat.mediaitem(new mediadescriptioncompat.builder().setmediaid("iddopastor2").settitle("pastor 2").build(), mediabrowsercompat.mediaitem.flag_browsable)); // examine passed parentmediaid see submenu we're at, // , put children of menu in mediaitems list } else if(parentid.equals("iddopastor2")){ mediaitems.add(new mediabrowsercompat.mediaitem(new mediadescriptioncompat.builder().setmediaid("genealogia") .settitle("tomé filho de josé") .setmediauri(uri.parse("http://70.38.6.72/~vivafe/web/wp-content/uploads/2016/08/mateus-01.mp3")) .seticonuri(uri.parse("http://70.38.6.72/~vivafe/web/wp-content/uploads/2016/08/01.jpg")) .build(), mediabrowsercompat.mediaitem.flag_playable)); } result.sendresult(mediaitems); } @override public void ondestroy() { msession.release(); if( mediaplayer != null ) { pausemedia(); mediaplayer.release(); preferencemanager.getdefaultsharedpreferences( ).edit().putint( current_media_position, 0 ).commit(); } super.ondestroy(); } }
sorry long code, erro might anywhere on class!
i've put on androidmanifest.xml:
<meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc"/> <meta-data android:name="com.google.android.gms.car.notification.smallicon" android:resource="@drawable/ic_notification" /> <service android:name=".auto.automediabrowserservice" android:exported="true"> <intent-filter> <action android:name= "android.media.browse.mediabrowserservice"/> </intent-filter> </service>
and have on res\xml\automotive_app_desc.xml:
<automotiveapp> <uses name="media" /> </automotiveapp>
Comments
Post a Comment