我正在尝试RemoteControlClient
设置,以便我的应用程序的音乐可以通过锁定屏幕上弹出的小部件(如SoundCloud,Google Play音乐和其他音乐/视频应用程序工作)进行控制.我不确定我的代码有什么问题以及为什么它没有正确挂钩,但这是我到目前为止所拥有的...
一个名为MusicService的类,它尝试处理RemoteControlClient的更新
public class MusicService extends Service { public static final String ACTION_PLAY = "com.stfi.music.action.PLAY"; private RemoteController controller = null; @Override public void onCreate() { super.onCreate(); System.out.println("Creating the service."); if(controller == null) { controller = new RemoteController(); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { String action = intent.getAction(); System.out.println("Got an action of " + action); /* Logic to get my Song cur */ controller.register(this); controller.updateMetaData(cur); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); System.out.println("Destorying MusicService"); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
它使用一类我称之为RemoteController
里面有我的RemoteControlClient
.
public class RemoteController { private RemoteControlClient remoteControlClient; private Bitmap dummyAlbumArt; public void register(Context context) { if (remoteControlClient == null) { System.out.println("Trying to register it."); dummyAlbumArt = BitmapFactory.decodeResource(context.getResources(), R.drawable.dummy_album_art); AudioManager audioManager = (AudioManager) context.getSystemService(context.AUDIO_SERVICE); ComponentName myEventReceiver = new ComponentName(context.getPackageName(), MediaButtonReceiver.class.getName()); audioManager.registerMediaButtonEventReceiver(myEventReceiver); // build the PendingIntent for the remote control client Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(myEventReceiver); // create and register the remote control client PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(context, 0, mediaButtonIntent, 0); remoteControlClient = new RemoteControlClient(mediaPendingIntent); remoteControlClient.setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE | RemoteControlClient.FLAG_KEY_MEDIA_NEXT | RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | RemoteControlClient.FLAG_KEY_MEDIA_PLAY | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE ); audioManager.registerRemoteControlClient(remoteControlClient); } } /** * Update the state of the remote control. */ public void updateState(boolean isPlaying) { if(remoteControlClient != null) { if (isPlaying) { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); } else { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); } } } /** * Updates the state of the remote control to "stopped". */ public void stop() { if (remoteControlClient != null) { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); } } public void updateMetaData(Song song) { if (remoteControlClient != null && song != null) { System.out.println("Updating metadata"); MetadataEditor editor = remoteControlClient.editMetadata(true); editor.putBitmap(MetadataEditor.BITMAP_KEY_ARTWORK, dummyAlbumArt); editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, (long)1000); editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "Artist"); editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "Title"); editor.apply(); updateState(true); } } /** * Release the remote control. */ public void release() { remoteControlClient = null; } }
每次我想要更新小部件时,我都会打电话startService(new Intent(MusicService.ACTION_PLAY));
.看起来它正确地创建了服务,它总是达到"更新元数据"的程度,但出于某种原因,当我锁定屏幕并解锁时,我在锁定屏幕上看不到任何小部件.
以下是我的清单的重要部分,因为这可能以某种方式导致问题......
...other activities listed
现在我的MediaButtonReceiver并没有真正做很多事情.我只是想设置钩子.如果你愿意,这是我的MediaButtonReceiver类......
public class MediaButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("Receiving something."); if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) { final KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event != null && event.getAction() == KeyEvent.ACTION_UP) { if (event.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { System.out.println("You clicked pause."); } else if(event.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY) { System.out.println("You clicked play."); } else if (event.getKeyCode() == KeyEvent.KEYCODE_MEDIA_NEXT) { System.out.println("You clicked next."); } else if (event.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { System.out.println("You clicked previous."); } } } }
}