1 package com.example.android.musicplayer; 2 3 import android.content.ComponentName; 4 import android.media.AudioManager; 5 import android.util.Log; 6 7 import java.lang.reflect.InvocationTargetException; 8 import java.lang.reflect.Method; 9 10 /** 11 * Class that assists with handling new media button APIs available in API level 8. 12 */ 13 public class MediaButtonHelper { 14 // Backwards compatibility code (methods available as of API Level 8) 15 private static final String TAG = "MediaButtonHelper"; 16 17 static { initializeStaticCompatMethods()18 initializeStaticCompatMethods(); 19 } 20 21 static Method sMethodRegisterMediaButtonEventReceiver; 22 static Method sMethodUnregisterMediaButtonEventReceiver; 23 initializeStaticCompatMethods()24 static void initializeStaticCompatMethods() { 25 try { 26 sMethodRegisterMediaButtonEventReceiver = AudioManager.class.getMethod( 27 "registerMediaButtonEventReceiver", 28 new Class[] { ComponentName.class }); 29 sMethodUnregisterMediaButtonEventReceiver = AudioManager.class.getMethod( 30 "unregisterMediaButtonEventReceiver", 31 new Class[] { ComponentName.class }); 32 } catch (NoSuchMethodException e) { 33 // Silently fail when running on an OS before API level 8. 34 } 35 } 36 registerMediaButtonEventReceiverCompat(AudioManager audioManager, ComponentName receiver)37 public static void registerMediaButtonEventReceiverCompat(AudioManager audioManager, 38 ComponentName receiver) { 39 if (sMethodRegisterMediaButtonEventReceiver == null) 40 return; 41 42 try { 43 sMethodRegisterMediaButtonEventReceiver.invoke(audioManager, receiver); 44 } catch (InvocationTargetException e) { 45 // Unpack original exception when possible 46 Throwable cause = e.getCause(); 47 if (cause instanceof RuntimeException) { 48 throw (RuntimeException) cause; 49 } else if (cause instanceof Error) { 50 throw (Error) cause; 51 } else { 52 // Unexpected checked exception; wrap and re-throw 53 throw new RuntimeException(e); 54 } 55 } catch (IllegalAccessException e) { 56 Log.e(TAG, "IllegalAccessException invoking registerMediaButtonEventReceiver."); 57 e.printStackTrace(); 58 } 59 } 60 61 @SuppressWarnings("unused") unregisterMediaButtonEventReceiverCompat(AudioManager audioManager, ComponentName receiver)62 public static void unregisterMediaButtonEventReceiverCompat(AudioManager audioManager, 63 ComponentName receiver) { 64 if (sMethodUnregisterMediaButtonEventReceiver == null) 65 return; 66 67 try { 68 sMethodUnregisterMediaButtonEventReceiver.invoke(audioManager, receiver); 69 } catch (InvocationTargetException e) { 70 // Unpack original exception when possible 71 Throwable cause = e.getCause(); 72 if (cause instanceof RuntimeException) { 73 throw (RuntimeException) cause; 74 } else if (cause instanceof Error) { 75 throw (Error) cause; 76 } else { 77 // Unexpected checked exception; wrap and re-throw 78 throw new RuntimeException(e); 79 } 80 } catch (IllegalAccessException e) { 81 Log.e(TAG, "IllegalAccessException invoking unregisterMediaButtonEventReceiver."); 82 e.printStackTrace(); 83 } 84 } 85 } 86