0

Я пытаюсь использовать медиа-мероприятия для воспроизведения, паузы, следующей, предыдущей музыки из приложения для Android.java.lang.NoSuchMethodException: dispatchMediaKeyEvent [класс android.view.KeyEvent]

Когда я запускаю его на Samsung s4 (Android версии 4.4.2), я могу выполнять все действия. Но я не могу выполнять эти действия с моего Nexus 5 (Android версии 5.0.1).

Я получаю ошибку при обработке ключевых событий.

Мой код:

private void handleMediaKeyEvent(KeyEvent keyEvent) { 

    /* 
    * Attempt to execute the following with reflection. 
    * 
    * [Code] 
    * IAudioService audioService = IAudioService.Stub.asInterface(b); 
    * audioService.dispatchMediaKeyEvent(keyEvent); 
    */ 
    boolean dispatchMediaKeyEvent = false; 
    try { 

     // Get binder from ServiceManager.checkService(String) 
     IBinder iBinder = (IBinder) Class.forName("android.os.ServiceManager") 
     .getDeclaredMethod("checkService",String.class) 
     .invoke(null, Context.AUDIO_SERVICE); 

     // get audioService from IAudioService.Stub.asInterface(IBinder) 
     Object audioService = Class.forName("android.media.IAudioService$Stub") 
       .getDeclaredMethod("asInterface",IBinder.class) 
       .invoke(null,iBinder); 

     // Dispatch keyEvent using IAudioService.dispatchMediaKeyEvent(KeyEvent) 
     Class.forName("android.media.IAudioService") 
     .getDeclaredMethod("dispatchMediaKeyEvent",KeyEvent.class) 
     .invoke(audioService, keyEvent);    

     dispatchMediaKeyEvent = true; 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 
    // If dispatchMediaKeyEvent failed then try using broadcast 
    if (!dispatchMediaKeyEvent) { 
     Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); 
     mContext.sendOrderedBroadcast(intent, null); 
    } 
} 

И я получаю ошибку:

02-14 15:37:08.744: W/System.err(3474): java.lang.NoSuchMethodException: dispatchMediaKeyEvent [class android.view.KeyEvent] 
02-14 15:37:08.745: W/System.err(3474):  at java.lang.Class.getMethod(Class.java:664) 
02-14 15:37:08.745: W/System.err(3474):  at java.lang.Class.getDeclaredMethod(Class.java:626) 

Может кто-нибудь предложить решение, чтобы сделать его работать на всех устройствах Android?

+0

, где находится этот метод? dispatchMediaKeyEvent –

ответ

0

dispatchMediaKeyEvent унаследовано от AudioManager класс. Вы ссылаетесь на него как boolean.

http://developer.android.com/reference/android/media/AudioManager.html#dispatchMediaKeyEvent(android.view.KeyEvent)

Это как код, использующий это событие должно выглядеть

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 

long eventtime = SystemClock.uptimeMillis() - 1; 
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0); 
am.dispatchMediaKeyEvent(downEvent); 
+0

Спасибо, он работал для API> = 19. Мне пришлось использовать мой код для API 18. – Alina

Смежные вопросы