1818
1919import android .annotation .SdkConstant ;
2020import android .annotation .SdkConstant .SdkConstantType ;
21+ import android .app .PendingIntent ;
2122import android .content .ComponentName ;
2223import android .content .Context ;
24+ import android .content .Intent ;
2325import android .database .ContentObserver ;
2426import android .graphics .Bitmap ;
2527import android .os .Binder ;
@@ -1684,17 +1686,42 @@ public int abandonAudioFocus(OnAudioFocusChangeListener l) {
16841686 * Register a component to be the sole receiver of MEDIA_BUTTON intents.
16851687 * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver}
16861688 * that will receive the media button intent. This broadcast receiver must be declared
1687- * in the application manifest.
1689+ * in the application manifest. The package of the component must match that of
1690+ * the context you're registering from.
16881691 */
16891692 public void registerMediaButtonEventReceiver (ComponentName eventReceiver ) {
16901693 if (eventReceiver == null ) {
16911694 return ;
16921695 }
1696+ if (!eventReceiver .getPackageName ().equals (mContext .getPackageName ())) {
1697+ Log .e (TAG , "registerMediaButtonEventReceiver() error: " +
1698+ "receiver and context package names don't match" );
1699+ return ;
1700+ }
1701+ // construct a PendingIntent for the media button and register it
1702+ Intent mediaButtonIntent = new Intent (Intent .ACTION_MEDIA_BUTTON );
1703+ // the associated intent will be handled by the component being registered
1704+ mediaButtonIntent .setComponent (eventReceiver );
1705+ PendingIntent pi = PendingIntent .getBroadcast (mContext ,
1706+ 0 /*requestCode, ignored*/ , mediaButtonIntent , 0 /*flags*/ );
1707+ registerMediaButtonIntent (pi , eventReceiver );
1708+ }
1709+
1710+ /**
1711+ * @hide
1712+ * no-op if (pi == null) or (eventReceiver == null)
1713+ */
1714+ public void registerMediaButtonIntent (PendingIntent pi , ComponentName eventReceiver ) {
1715+ if ((pi == null ) || (eventReceiver == null )) {
1716+ Log .e (TAG , "Cannot call registerMediaButtonIntent() with a null parameter" );
1717+ return ;
1718+ }
16931719 IAudioService service = getService ();
16941720 try {
1695- service .registerMediaButtonEventReceiver (eventReceiver );
1721+ // pi != null
1722+ service .registerMediaButtonIntent (pi , eventReceiver );
16961723 } catch (RemoteException e ) {
1697- Log .e (TAG , "Dead object in registerMediaButtonEventReceiver " +e );
1724+ Log .e (TAG , "Dead object in registerMediaButtonIntent " +e );
16981725 }
16991726 }
17001727
@@ -1707,15 +1734,27 @@ public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) {
17071734 if (eventReceiver == null ) {
17081735 return ;
17091736 }
1737+ // construct a PendingIntent for the media button and unregister it
1738+ Intent mediaButtonIntent = new Intent (Intent .ACTION_MEDIA_BUTTON );
1739+ // the associated intent will be handled by the component being registered
1740+ mediaButtonIntent .setComponent (eventReceiver );
1741+ PendingIntent pi = PendingIntent .getBroadcast (mContext ,
1742+ 0 /*requestCode, ignored*/ , mediaButtonIntent , 0 /*flags*/ );
1743+ unregisterMediaButtonIntent (pi , eventReceiver );
1744+ }
1745+
1746+ /**
1747+ * @hide
1748+ */
1749+ public void unregisterMediaButtonIntent (PendingIntent pi , ComponentName eventReceiver ) {
17101750 IAudioService service = getService ();
17111751 try {
1712- service .unregisterMediaButtonEventReceiver ( eventReceiver );
1752+ service .unregisterMediaButtonIntent ( pi , eventReceiver );
17131753 } catch (RemoteException e ) {
1714- Log .e (TAG , "Dead object in unregisterMediaButtonEventReceiver " +e );
1754+ Log .e (TAG , "Dead object in unregisterMediaButtonIntent " +e );
17151755 }
17161756 }
17171757
1718-
17191758 /**
17201759 * Registers the remote control client for providing information to display on the remote
17211760 * controls.
@@ -1724,14 +1763,13 @@ public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) {
17241763 * @see RemoteControlClient
17251764 */
17261765 public void registerRemoteControlClient (RemoteControlClient rcClient ) {
1727- if ((rcClient == null ) || (rcClient .getRcEventReceiver () == null )) {
1766+ if ((rcClient == null ) || (rcClient .getRcMediaIntent () == null )) {
17281767 return ;
17291768 }
17301769 IAudioService service = getService ();
17311770 try {
1732- service .registerRemoteControlClient (rcClient .getRcEventReceiver (), /* eventReceiver */
1771+ service .registerRemoteControlClient (rcClient .getRcMediaIntent (), /* mediaIntent */
17331772 rcClient .getIRemoteControlClient (), /* rcClient */
1734- rcClient .toString (), /* clientName */
17351773 // used to match media button event receiver and audio focus
17361774 mContext .getPackageName ()); /* packageName */
17371775 } catch (RemoteException e ) {
@@ -1746,13 +1784,13 @@ public void registerRemoteControlClient(RemoteControlClient rcClient) {
17461784 * @see #registerRemoteControlClient(RemoteControlClient)
17471785 */
17481786 public void unregisterRemoteControlClient (RemoteControlClient rcClient ) {
1749- if ((rcClient == null ) || (rcClient .getRcEventReceiver () == null )) {
1787+ if ((rcClient == null ) || (rcClient .getRcMediaIntent () == null )) {
17501788 return ;
17511789 }
17521790 IAudioService service = getService ();
17531791 try {
1754- service .unregisterRemoteControlClient (rcClient .getRcEventReceiver (), /* eventReceiver */
1755- rcClient .getIRemoteControlClient ()); /* rcClient */
1792+ service .unregisterRemoteControlClient (rcClient .getRcMediaIntent (), /* mediaIntent */
1793+ rcClient .getIRemoteControlClient ()); /* rcClient */
17561794 } catch (RemoteException e ) {
17571795 Log .e (TAG , "Dead object in unregisterRemoteControlClient" +e );
17581796 }
0 commit comments