26958
cocos2d-x v3.10で、タブレットか携帯電話か判定する方法が知りたいです。  
以下のように、frameSizeの縦横比を調べて、それが1.5以上の場合はタブレットだと判断していました。  
iOS端末の場合はこれで判定できました。

```

    Size frameSize = glview->getFrameSize();
    
    if (frameSize.width / frameSize.height >= 1.5f) {
        //phone
        glview->setDesignResolutionSize(designResolutionSize_phone.width,
                                        designResolutionSize_phone.height,
                                        ResolutionPolicy::NO_BORDER);
    } else {
        //tablet
        glview->setDesignResolutionSize(designResolutionSize_tablet.width,
                                        designResolutionSize_tablet.height,
                                        ResolutionPolicy::NO_BORDER);
    }
    
```

しかし、Android端末の場合、例えばNexut10の縦横比は1.6なので、携帯電話と判定されてしまいます。  
端末の物理的な画面サイズが7インチ以上の場合はタブレットと判断したいのですが、どのように判定すれば良いでしょうか。  
物理サイズの取得方法等ご存知でしたら教えてください。  
よろしくお願いいたします。
CC BY-SA 3.0
2016-06-20T07:00:55.600
26880
2016-06-22T14:21:57.027
8825
question
android cocos2d-x
cocos2d-xでタブレットか携帯電話か判定する方法
cocos2dxは知りません。  
しかし、androidのSDKにはその機能があるので、もしcocos2dxのAPIにそのような機能がなければ、Javaで呼び出す他にないでしょうね。  
というわけで、以下にjavaでのやり方を説明します。

一応、参考にさせてもらったサイトも挙げておきます。

  * [画面サイズを攻略して機種依存を吸収する](http://techbooster.org/android/hacks/16066/)
  * [画面サイズ(ピクセル)をセンチメートルに変換するには](http://android-note.open-memo.net/sub/layout--convert-screen-pixels-to-cm.html)

例えば、以下のような感じで画面サイズを計算できます。

```

    package com.example.sample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Display;
    import android.util.DisplayMetrics;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            this.setContentView(R.layout.main);
    
            Display display = this.getWindowManager().getDefaultDisplay();
            DisplayMetrics metrics = new DisplayMetrics();
            display.getMetrics(metrics);
            DisplayMetrics realMetrics = new DisplayMetrics();
            display.getRealMetrics(realMetrics);
            TextView textView = (TextView)this.findViewById(R.id.text);
            textView.setText(String.format("display %dx%d (%.1f inch).\nreal %dx%d (%.1f inch).",
                        metrics.widthPixels, metrics.heightPixels,
                        Math.sqrt(Math.pow(metrics.widthPixels / metrics.xdpi, 2.0) + Math.pow(metrics.heightPixels / metrics.ydpi, 2.0)),
                        realMetrics.widthPixels, realMetrics.heightPixels,
                        Math.sqrt(Math.pow(realMetrics.widthPixels / realMetrics.xdpi, 2.0) + Math.pow(realMetrics.heightPixels / realMetrics.ydpi, 2.0))));
        }
    }
    
```

注意する点は、「Display#getMetrics」と「Display#getRealMetrics」という２つのメソッドが存在する点です。

違いは、前者はアプリケーションが使用している表示領域に対して、後者はナビゲーションバーも含む「本当の」ハードウェアの表示領域の情報を取得する点です。  
つまり、いわゆるスペック表通りの数値を期待するならば、後者を使います。

しかし、「Display#getRealMetrics」はAPILevel17からの実装になっているので、それ以前のOS(android4.2より古い機種)では動作しません。  
(上記のリンク先で書かれているように、隠されている可能性もありますから、強引に使用できるかもしれませんが)

上記の事を踏まえて、どちらを使用するかはご自身で決めてください。

(もしかして、ナビゲーションバーを非表示にした状態で「Display#getMetrics」を呼べば、「Display#getRealMetrics」と同じ結果になるかなぁ…)

余談ですが、「iphone ipad 判別」でググったら、iOSでの質問とは別の判別方法が出てきました。  
そっちの方がいいのでは?と思いますが、いかがですかね。  
まぁ、何で区別したいかの理由にもよりますので、最終的な判断はお任せします。
CC BY-SA 3.0
2016-06-22T14:21:57.027
26958
2016-06-22T14:21:57.027
15473
26880
answer