2015-09-14 9 views
7

デバイスが4K UHD(3840x2160)解像度で出力できるときを検出しようとしています。 nVidia Shield TVやSony Xperia Z5 Premiumなどの多くのデバイスでは、ビデオ以外のレイアウトではデフォルトで1080p出力になるため、UHD対応でも1080pで動作していると報告されます。 Nexus Playerのような4Kデバイスと4K以外のデバイスを区別できる4Kかどうかを検出する方法が必要です。 ExoPlayerが、それは3840x2160でビデオを出力していますことを報告した場合でも、これは1920×1080のすべての時間を返し、Androidで4K UHD画面を検出する

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
Display display = wm.getDefaultDisplay(); 
Point size = new Point(); 
display.getSize(size); 

シールドテレビで:ここで

は、私は現在の解像度を決定するために使用しているコードです。

+0

これを試しましたか?http://stackoverflow.com/a/3166582/1944049 –

+0

Shield TVでは、コードはxhdpiと320 dpiの密度を報告します。 xxxhdpiと640dpiを報告する必要があります。 – Cobar

+0

ソニーのX83Cと同じ状況...本当にAndroid TVで4Kを検出する信頼できる方法はありませんか? –

答えて

3

UPDATE:確実4Kデバイスを検出する唯一の方法を

:これはExoPlayer 1.5.1で修正されました(https://github.com/google/ExoPlayer/commit/79055066813123c939c29e5a5e223a5ff043b91eを参照)


私はExoPlayerの開発者にフォローアップし、答えを見つけましたDevice.Modeを使用していますが、これはAPIレベル23+でのみ利用可能です。それは、このコードを実装していませんExoPlayerについては、現在のバージョンのように、

https://developer.android.com/reference/android/view/Display.Mode.html#getPhysicalWidth()

https://developer.android.com/preview/api-overview.html#4K-display

そして、ここでクラスのドキュメント:ここでその上のAndroid Mノートを参照してください。 (1.4.2)しかしそれはおそらく変わるでしょう。参照:

https://github.com/google/ExoPlayer/issues/800

そして最後の質問に答えるために、今4Kを検出するための正しい方法は次のようなものです:

少ない23

よりもAPIに誤った結果が得られます
/** 
* Used to check if the connected device support UHD (3840x2160) 
* 
* Note that this call will fail to identify UHD devices on api level bellow 23 (M) 
* 
* @return 1 if device is UHD, 0 otherwise 
*/ 
public int isUHD(){ 
    Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point displaySize = getDisplaySize(display); 
    return (displaySize.x >= 3840 && displaySize.y >= 2160) ? 1 : 0; 
} 

/** 
* Convenience function that forks to the different ways to obatin the Display size across Android versions 
* 
* @param display Display instance to obtain information from 
* 
* @return Point a Point describing the Display size 
*/ 
private static Point getDisplaySize(Display display) { 
    Point displaySize = new Point(); 
    if(Util.SDK_INT >= 23){ 
     getDisplaySizeV23(display, displaySize); 
    }else if(Util.SDK_INT >= 17) { 
     getDisplaySizeV17(display, displaySize); 
    } else if(Util.SDK_INT >= 16) { 
     getDisplaySizeV16(display, displaySize); 
    } else { 
     getDisplaySizeV9(display, displaySize); 
    } 
    return displaySize; 
} 

@TargetApi(23) 
private static void getDisplaySizeV23(Display display, Point outSize){ 
    Display.Mode[] modes = display.getSupportedModes(); 
    if(modes.length > 0){ 
     Display.Mode mode = modes[0]; 
     outSize.x = mode.getPhysicalWidth(); 
     outSize.y = mode.getPhysicalHeight(); 
    } 
} 

@TargetApi(17) 
private static void getDisplaySizeV17(Display display, Point outSize) { 
    display.getRealSize(outSize); 
} 

@TargetApi(16) 
private static void getDisplaySizeV16(Display display, Point outSize) { 
    display.getSize(outSize); 
} 

private static void getDisplaySizeV9(Display display, Point outSize) { 
    outSize.x = display.getWidth(); 
    outSize.y = display.getHeight(); 
} 

+0

ExoPlayerとお話いただきありがとうございます。市販されているAndroid TVデバイスはごくわずかなので、Android TVデバイスを4Kとして扱い、1080pしかサポートしないデバイスは除外しても問題ありません。私が知っている唯一の1080pデバイスは、Nexus PlayerとRazer Forge TVです。 – Cobar

+0

あなたが言うことが真実かどうかを知るための調査は行っていませんが、ExoPlayerはソースとして指定しても実際には4Kストリームをレンダリングしないという問題があります。そのため、この問題は公式プロジェクトのバグとして報告されています。 ExoPlayerが1920年に縮小されるということは、何が起こるか(間違った機能を上書きしない限り)です。 –

+0

Sony TVの場合、貼り付けたこの機能はまだ動作しません。しかし、リンクされたExoPlayerのコミットからのものが動作します - それはソニーBraviaのための特別な検出があります。 –

関連する問題