4
4
import android .content .Intent ;
5
5
import android .content .pm .PackageInfo ;
6
6
import android .content .pm .PackageManager ;
7
- import android .media . AudioManager ;
8
- import android .media . MediaDescription ;
7
+ import android .graphics . Bitmap ;
8
+ import android .graphics . drawable . Drawable ;
9
9
import android .media .MediaMetadata ;
10
- import android .media .MediaPlayer ;
11
10
import android .media .Rating ;
12
11
import android .media .browse .MediaBrowser ;
13
12
import android .media .session .MediaSession ;
14
- import android .net .Uri ;
15
- import android .os .*;
13
+ import android .media .session .PlaybackState ;
14
+ import android .os .Build ;
15
+ import android .os .Bundle ;
16
+ import android .os .ResultReceiver ;
16
17
import android .service .media .MediaBrowserService ;
17
- import android .util .Base64 ;
18
18
import android .util .Log ;
19
19
20
+ import com .squareup .picasso .Picasso ;
21
+ import com .squareup .picasso .Target ;
22
+
23
+ import java .io .IOException ;
20
24
import java .io .UnsupportedEncodingException ;
21
25
import java .util .ArrayList ;
22
26
import java .util .Arrays ;
25
29
/**
26
30
* Created by paulruiz on 11/18/14.
27
31
*/
28
- public class AutoMediaBrowserService extends MediaBrowserService implements MediaPlayer .OnPreparedListener ,
29
- MediaPlayer .OnCompletionListener , MediaPlayer .OnErrorListener , AudioManager .OnAudioFocusChangeListener {
32
+ public class AutoMediaBrowserService extends MediaBrowserService {
30
33
31
34
public static final String MEDIA_ID_ROOT = "__ROOT__" ;
32
35
public static final String MEDIA_ID_MUSICS_BY_GENRE = "__BY_GENRE__" ;
33
36
37
+ private int isPlaying ;
38
+
39
+ Target target = new Target () {
40
+ @ Override
41
+ public void onBitmapLoaded (Bitmap bitmap , Picasso .LoadedFrom from ) {
42
+ try {
43
+ setWallpaper (bitmap );
44
+ } catch ( IOException e ) {
45
+
46
+ }
47
+ }
48
+
49
+ @ Override
50
+ public void onBitmapFailed (Drawable errorDrawable ) {
51
+
52
+ }
53
+
54
+ @ Override
55
+ public void onPrepareLoad (Drawable placeHolderDrawable ) {
56
+
57
+ }
58
+ };
59
+
34
60
static final byte [][] VALID_PUBLIC_SIGNATURES = new byte [][]{
35
61
// Android Auto release public key
36
62
extractKey (
@@ -139,7 +165,6 @@ public class AutoMediaBrowserService extends MediaBrowserService implements Medi
139
165
140
166
private MediaSession mSession ;
141
167
private MediaSession .Callback mMediaSessionCallbacks ;
142
- private AudioManager mAudioManager ;
143
168
144
169
private static final String TAG = "AutoMediaBrowserService" ;
145
170
@@ -148,27 +173,9 @@ public void onCreate() {
148
173
super .onCreate ();
149
174
Log .e ( "AutoMediaBrowserService" , "onCreate" );
150
175
151
- mAudioManager = (AudioManager ) getSystemService (Context .AUDIO_SERVICE );
152
-
153
176
initCallbacks ();
154
177
initMediaSessions ();
155
178
156
- mAudioManager .requestAudioFocus (this , AudioManager .STREAM_MUSIC ,
157
- AudioManager .AUDIOFOCUS_GAIN );
158
-
159
- /*
160
- Bundle extras = new Bundle();
161
-
162
- extras.putBoolean(
163
- "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT",
164
- true);
165
- extras.putBoolean(
166
- "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS",
167
- true);
168
- mSession.setExtras(extras);
169
- */
170
-
171
-
172
179
}
173
180
174
181
private void initMediaSessions () {
@@ -177,19 +184,24 @@ private void initMediaSessions() {
177
184
mSession .setCallback ( mMediaSessionCallbacks );
178
185
mSession .setFlags (MediaSession .FLAG_HANDLES_MEDIA_BUTTONS | MediaSession .FLAG_HANDLES_TRANSPORT_CONTROLS );
179
186
180
- List <MediaSession .QueueItem > queue = new ArrayList <MediaSession .QueueItem >();
181
- MediaMetadata data = new MediaMetadata .Builder ()
182
- .putString ( MediaMetadata .METADATA_KEY_TITLE , "title" )
183
- .putString (MediaMetadata .METADATA_KEY_DISPLAY_DESCRIPTION , "description" )
184
- .build ();
185
- queue .add ( new MediaSession .QueueItem ( data .getDescription (), 0 ) );
186
- queue .add ( new MediaSession .QueueItem ( data .getDescription (), 1 ) );
187
- queue .add ( new MediaSession .QueueItem ( data .getDescription (), 2 ) );
188
- queue .add ( new MediaSession .QueueItem ( data .getDescription (), 3 ) );
189
-
190
- mSession .setQueue ( queue );
187
+ PlaybackState .Builder stateBuilder = new PlaybackState .Builder ()
188
+ .setActions (getAvailableActions ());
189
+
190
+ mSession .setPlaybackState (stateBuilder .build ());
191
191
}
192
192
193
+ private long getAvailableActions () {
194
+ long actions = PlaybackState .ACTION_PLAY | PlaybackState .ACTION_PLAY_FROM_MEDIA_ID |
195
+ PlaybackState .ACTION_PLAY_FROM_SEARCH ;
196
+
197
+ if (isPlaying == PlaybackState .STATE_PLAYING ) {
198
+ actions |= PlaybackState .ACTION_PAUSE ;
199
+ }
200
+
201
+ return actions ;
202
+ }
203
+
204
+
193
205
private void initCallbacks () {
194
206
mMediaSessionCallbacks = new MediaSession .Callback () {
195
207
@@ -288,11 +300,6 @@ public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle roo
288
300
// be made to other media browsing methods.
289
301
return null ;
290
302
}
291
- if ("com.ptrprograms.androidautomedia" .equals (clientPackageName )) {
292
- // Optional: if your app needs to adapt ads, music library or anything else that
293
- // needs to run differently when connected to the car, this is where you should handle
294
- // it.
295
- }
296
303
return new BrowserRoot ("__ROOT__" , null );
297
304
}
298
305
@@ -307,21 +314,16 @@ public static boolean isCallerAllowed(Context context, String callingPackage, in
307
314
packageInfo = packageManager .getPackageInfo (
308
315
callingPackage , PackageManager .GET_SIGNATURES );
309
316
} catch (PackageManager .NameNotFoundException ignored ) {
310
- if (Log .isLoggable (TAG , Log .DEBUG )) {
311
- Log .d (TAG , "Package manager can't find package " + callingPackage
312
- + ", defaulting to false" );
313
- }
314
317
return false ;
315
318
}
316
319
if (packageInfo == null ) {
317
- Log .w (TAG , "Package manager can't find package: " + callingPackage );
318
320
return false ;
319
321
}
320
322
321
323
if (packageInfo .signatures .length != 1 ) {
322
- Log .w (TAG , "Package has more than one signature." );
323
324
return false ;
324
325
}
326
+
325
327
final byte [] signature = packageInfo .signatures [0 ].toByteArray ();
326
328
327
329
for (int i = 0 ; i < VALID_PUBLIC_SIGNATURES .length ; i ++) {
@@ -331,10 +333,6 @@ public static boolean isCallerAllowed(Context context, String callingPackage, in
331
333
}
332
334
}
333
335
334
- if (Log .isLoggable (TAG , Log .VERBOSE )) {
335
- Log .v (TAG , "Signature not valid. Found: \n " +
336
- Base64 .encodeToString (signature , 0 ));
337
- }
338
336
return false ;
339
337
}
340
338
@@ -351,8 +349,16 @@ public void onLoadChildren(final String parentMediaId,
351
349
List <MediaBrowser .MediaItem > mediaItems = new ArrayList <MediaBrowser .MediaItem >();
352
350
353
351
MediaMetadata data = new MediaMetadata .Builder ()
354
- .putString ( MediaMetadata .METADATA_KEY_TITLE , "Media Title" )
355
- .putString ( MediaMetadata .METADATA_KEY_MEDIA_ID , "ID12345" ).build ();
352
+ .putString (MediaMetadata .METADATA_KEY_TITLE , "Gallows Pole" )
353
+ .putString ( MediaMetadata .METADATA_KEY_ART_URI , "http://upload.wikimedia.org/wikipedia/en/archive/2/26/20141106002529!Led_Zeppelin_-_Led_Zeppelin_IV.jpg" )
354
+ .putString ( MediaMetadata .METADATA_KEY_ALBUM_ART_URI , "http://upload.wikimedia.org/wikipedia/en/archive/2/26/20141106002529!Led_Zeppelin_-_Led_Zeppelin_IV.jpg" )
355
+ .putString (MediaMetadata .METADATA_KEY_ALBUM , "Led Zeppelin IV" )
356
+ .putString (MediaMetadata .METADATA_KEY_ARTIST , "Led Zeppelin" )
357
+ .putLong (MediaMetadata .METADATA_KEY_DURATION , 430000 )
358
+ .putString (MediaMetadata .METADATA_KEY_GENRE , "Rock" )
359
+ .putLong (MediaMetadata .METADATA_KEY_TRACK_NUMBER , 1 )
360
+ .putLong (MediaMetadata .METADATA_KEY_NUM_TRACKS , 8 )
361
+ .putString (MediaMetadata .METADATA_KEY_MEDIA_ID , "ID12345" ).build ();
356
362
357
363
358
364
mediaItems .add ( new MediaBrowser .MediaItem (
@@ -366,27 +372,6 @@ public void onDestroy() {
366
372
mSession .release ();
367
373
}
368
374
369
- @ Override
370
- public void onAudioFocusChange (int focusChange ) {
371
- Log .e ( "AutoMediaBrowserService" , "onAudioFocusChange" );
372
- }
373
-
374
- @ Override
375
- public void onCompletion (MediaPlayer mp ) {
376
- Log .e ( "AutoMediaBrowserService" , "onCompletion" );
377
- }
378
-
379
- @ Override
380
- public boolean onError (MediaPlayer mp , int what , int extra ) {
381
- Log .e ( "AutoMediaBrowserService" , "onError" );
382
- return false ;
383
- }
384
-
385
- @ Override
386
- public void onPrepared (MediaPlayer mp ) {
387
- Log .e ( "AutoMediaBrowserService" , "onPrepared" );
388
- }
389
-
390
375
private static byte [] extractKey (String keyString ) {
391
376
try {
392
377
return keyString .getBytes ("ISO-8859-1" );
0 commit comments