Android tabletとAndroid携帯電話用の2つのアプリがあります。タブレットアプリの場合はAndroid:minSdkVersion="11"
。しかし、今日ではAndroid Galaxy S3のような携帯電話にはAndroidバージョン4.0.4があり、S3ユーザーはGoogle Playストアからタブレットアプリをダウンロードできます。携帯電話ユーザーに警告したいタブレットアプリをインストールするときに電話アプリをダウンロードする、タブレットユーザーが電話アプリを実行するときにタブレットアプリをダウンロードするという逆も同様です。
デバイスタイプを検出する簡単な方法はありますか?
これで解決策を見つけました link 。
マニフェストファイルで、ハンドセットとタブレットの画面機能を宣言すると、Google Playが携帯電話とタブレットの両方のダウンロード許可を決定します。
これを使って:
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
デバイスが大画面で動作している場合はtrueを返します。
これも試すことができます
リソースファイルにbooleanパラメーターを追加します。
res/values/dimen.xmlファイルにこの行を追加します
<bool name="isTab">false</bool>
res/values-sw600dp/dimen.xmlファイルに次の行を追加します。
<bool name="isTab">true</bool>
次に、Javaファイルで次の値を取得します。
if(getResources().getBoolean(R.bool.isTab)) {
System.out.println("tablet");
} else {
System.out.println("mobile");
}
このコードスニペットは、デバイスタイプが7インチ以上で、Mdpi以上の解像度であるかどうかを示します。必要に応じて実装を変更できます。
private static boolean isTabletDevice(Context activityContext) {
boolean device_large = ((activityContext.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_LARGE);
if (device_large) {
DisplayMetrics metrics = new DisplayMetrics();
Activity activity = (Activity) activityContext;
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT
|| metrics.densityDpi == DisplayMetrics.DENSITY_HIGH
|| metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM
|| metrics.densityDpi == DisplayMetrics.DENSITY_TV
|| metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-True");
return true;
}
}
AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-False");
return false;
}
画面のインチに基づいてデバイスがタブレットまたは電話であると判断したい場合は、次を使用できます
6.5インチ以上のデバイスはタブレットと見なされますが、最近の一部の携帯電話では対角値が高くなっています。次のソリューションで良いことは、マージンを設定することができます。
public boolean isDeviceTablet(){
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float yInches= metrics.heightPixels/metrics.ydpi;
float xInches= metrics.widthPixels/metrics.xdpi;
double diagonalInches = Math.sqrt(xInches*xInches + yInches*yInches);
if (diagonalInches>=6.5) {
return true;
}
return false;
}
デバイスの種類(タブ/電話)に基づいて切り替える必要があるアプリで、同様の問題が発生しました。 IOSはデバイスタイプを完全に提供しましたが、同じアイデアはAndroidでは機能しませんでした。解像度/ DPIメソッドは、小さな解像度のタブ、高解像度の携帯電話で失敗しました。私たちは壁を越えて、奇妙なアイデアを試みましたが、解像度に依存しない非常にうまく機能しました。
mainクラスでこれを記述します。TABの場合はデバイスタイプをnull、Phoneの場合はモバイルを取得する必要があります。
String ua=new WebView(this).getSettings().getUserAgentString();
if(ua.contains("Mobile")){
//Your code for Mobile
}else{
//Your code for TAB
}
Google Playストアの機能を使用して、タブレットではタブレットアプリ、電話では電話アプリのみをダウンロードできるようにします。
ユーザーが間違ったアプリをインストールする場合、別の方法を使用してインストールする必要があります。
次のコードを使用して、デバイスタイプを識別します。
private boolean isTabletDevice() {
if (Android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb
// test screen size, use reflection because isLayoutSizeAtLeast is only available since 11
Configuration con = getResources().getConfiguration();
try {
Method mIsLayoutSizeAtLeast = con.getClass().getMethod("isLayoutSizeAtLeast");
Boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con, 0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE
return r;
} catch (Exception x) {
return false;
}
}
return false;
}
何かが電話をかけることができるかどうかを検出する必要があると思います。それ以外はすべて、電話機能のないタブレット/テレビです。
私が見た限りでは、これがスクリーンサイズに依存しない唯一のものです。
public static boolean isTelephone(){
//pseudocode, don't have the copy and paste here right know and can't remember every line
return new Intent(ACTION_DIAL).resolveActivity() != null;
}