2017-04-05 6 views
1

私は最初のAndroidアプリを開発中です。それは没入型に設計されており、すべてのアクティビティでNavigationBarを非表示にし、ActionBarを介して独自のナビゲーションを提供します。android.widget.MediaControllerを拡張してsetSystemUiVisibilityをオーバーライドできません

このアプリケーションでは、デフォルトのMediaControllerビューを使用します。私はandroid.widget.VideoViewを介してフルスクリーンビデオアクティビティのMediaControllerとしてandroid.widget.MediaControllerを使用しています。私はandroid.media.MediaPlayerを介してフルスクリーンでないオーディオアクティビティに対してMediaController.MediaPlayerControlを実装するandroid.widget.MediaControllerの拡張も使用しています。

android.widget.MediaControllerソースを調べた後、現在のアクティビティの上に新しいウィンドウでFrameLayoutとして表示されます。 MediaControllerが表示されるときはいつでも、ウィンドウの下にmWindowManager.addView(mDecor, mDecorLayoutParams);を呼び出すことで、レイアウトパラメータの特定のセットを持つウィンドウに追加されます。

public void show(int timeout) { 
    if (!mShowing && mAnchor != null) { 
     setProgress(); 
     if (mPauseButton != null) { 
      mPauseButton.requestFocus(); 
     } 
     disableUnsupportedButtons(); 
     updateFloatingWindowLayout(); 
     mWindowManager.addView(mDecor, mDecorLayoutParams); 
     mShowing = true; 
    } 
    updatePausePlay(); 

    // cause the progress bar to be updated even if mShowing 
    // was already true. This happens, for example, if we're 
    // paused with the progress bar showing the user hits play. 
    post(mShowProgress); 

    if (timeout != 0 && !mAccessibilityManager.isTouchExplorationEnabled()) { 
     removeCallbacks(mFadeOut); 
     postDelayed(mFadeOut, timeout); 
    } 
} 

この呼び出しの結果はSystemUiVisibilityは、このウィンドウのリセットされ、アプリがNavigationBarを示し、没入モードの出てくるということです。

私が問題にしているのは、このクラスのすべての変数は、ほとんどの方法と同様にプライベートであるということです。プライベート変数にはゲッターまたはセッターがありません。ですから、showメソッドの変数との相互作用を変更することはできません。

MediaControllerクラスを拡張している間は、showメソッドをオーバーライドすればhideNavigationをすぐに呼び出すことができます。ただし、コントローラが表示されるたびに画面上にNavigationBarが表示されます。これは私が心地よい解決策ではありません。

// MediaController implementation 
@Override 
public void show(int timeout) { 
    super.show(timeout); 

    // hide navigation 
    hideNavigation(); 
} 

// hide navigation 
public void hideNavigation() { 

    // get root view 
    View rootView = this.getRootView(); 

    // options 
    final int options = 
     View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
     View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 
     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 
     View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | 
     View.SYSTEM_UI_FLAG_FULLSCREEN | 
     View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
    ; 

    // set visibility options 
    rootView.setSystemUiVisibility(options); 
} 

だから、私は、そのプライベートなデザインに、適切にクラスを拡張することができないことを考えると、私は保護された変数を使用して、元のコードのほとんどを使用して、完全に自分自身でそれを交換したいと思いますプライベートなものの代わりにメソッドを使用します。

このアプローチの問題は、Android Studioプロジェクトにimport com.android.internal.policy.PhoneWindow;を追加できないことです。このパッケージをGradleビルドに含めるにはどうしたらいいですか?

compile 'com.android.internal.policy:phonewindow:1.0' 

これを行うには何を変更する必要がありますか?それとも、それはできないのですか?

メソッドをandroid.view.accessibility.AccessibilityManagerという呼び出しが認識されないことがわかります。このクラスも複製できません。

なぜこの方法は利用できないのですか?

WindowsがSystemUiVisibilityオプションを変更したり、クラス全体を再現せずにshowメソッドを拡張したりすることを強制的に禁止する方法があれば、それが望ましいでしょう。

ガイダンスをいただければ幸いです。

答えて

0

私は今、同じ問題に直面しています。私はMediaControllerクラスに変更を加えたいと思います。

私はPhoneWindowをインポートせず、getInstance(context)がエラーを投げたので、クラスにバグがありましたが、これはコードを保護する方法であることがわかりました。

私はStackOverflowの上でこの答えを見つけました:

com.android.internal.telefonyは、Androidの内部(または非表示)のAPIに該当するとして、あなたはそれを直接インポートすることはできません。しかし、彼らと協力する方法があります。私は、thisthisに行き、リフレクションを通じてテレフォニーを操作する方法を知ることをお勧めします。

これはPhoneWindowクラスに関するものではありませんが、私はこのクラスと似たようなことができると思います。私はこれを試していないが、おそらくできますか?

関連する問題