2017-12-20 2 views
1

Ich habe ein Custom der LinearLayout erweitert, ich bin das Hinzufügen WindowManager.addView() Methode zum Screenen unter Verwendung mit folgendem Layout param FlagsWie keyup und keydown Ereignis in Dienst erkennen

LinearLayout mLinear = new LinearLayout(getApplicationContext()) { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 
      super.dispatchKeyEvent(event); 
      Log.i(TAG, "event"); 

      int action = event.getAction(); 
      int keyCode = event.getKeyCode(); 
      switch (keyCode) { 

       case KeyEvent.KEYCODE_VOLUME_UP: 
        Log.i("Key", "VolumeUp"); 

        return true; 
       case KeyEvent.KEYCODE_VOLUME_DOWN: 
        Log.i("Key", "VolumeDown"); 
        return true; 

       case KeyEvent.KEYCODE_BACK: 
        Log.d(TAG, " " + "KEYCODE_BACK"); 

        return false; 

       default: 
        return true; 
      } 

     } 

    }; 

    mView = LayoutInflater.from(this).inflate(R.layout.volume_service_layout, mLinear); 
    wm = (WindowManager) getSystemService(WINDOW_SERVICE); 


    if (mView.getVisibility() == View.VISIBLE) 
     flag = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING ; 


    //params 
    params = new WindowManager.LayoutParams(
      100, 
      100, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; 
    wm.addView(mView, params); 

} 

dispatchKeyEvent() ist wichtiges Ereignis in meinem Dienst zu erkennen Override in customview Klasse, aber nach dem Hinzufügen zu Windows zurück drücken Sie Button funktioniert nicht.Wenn ich hinzufügen WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE Flag Rückstempeltaste funktioniert gut, ich bin nicht in der Lage, keyup und Keydown-Ereignis zu erkennen.

Ich möchte Keyup oder Keydown-Ereignis in Serviceklasse erkennen. Bitte schlagen Sie eine Lösung für dieses Problem vor.

+0

Wo müssen Sie Ihren Code geschrieben haben, meine ich in Aktivität oder Fragment? –

+0

Ich habe diesen Code im Service verwendet –

Antwort

1

Android dokumentiert nicht APIs in diesem Fall mit volume buttons interagieren. Also ich denke.Ist nicht möglich

0

Ich denke, Sie dies erreichen, durch die Verwendung mit BroadcastReceiver

die Sie interessieren,

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name"...> 
    //code, like activities, etc 

    <receiver android:name="com.example.test.VolumeBroadcast" > 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
</application> 

Beispiel eines Empfängers:

public class VolumeBroadcast extends BroadcastReceiver{ 

     public void onReceive(Context context, Intent intent) { 
      //check the intent something like: 
      if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
       KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
       if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { 
       // Handle key press. 
       } 
      } 
     } 
    } 

Die Art und Weise Sie sich registrieren ist wie folgt aus:

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); 
// Start listening for button presses 
am.registerMediaButtonEventReceiver(RemoteControlReceiver); 
// Stop listening for button presses 
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 

Audio Playback

+0

Ich bin nicht in der Lage Schlüsselereignis zu erkennen, wenn ich WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE –

+0

Wait, werde ich meine Antwort zu aktualisieren, und ich werde hier meinen ganzen Code hinzufügen. Also, du kannst es besser verstehen. –

+0

Ich habe versucht, Ihren Code, aber immer noch nicht funktioniert Backpress-Taste Methode –

Verwandte Themen