做了一个双屏的APK,分辨率老是不对,我这边获取的1920*1080但是硬件本身是1366*768
我甩脱给底层,底层在甩锅给我,持续了半个月,实在是忍无可忍,我决定花时间研究下这个
扒了一下android API的源码,确实是有一个获取每个屏幕分辨率的方法,副屏的分辨率不能使用主屏的方法来获取
给大家看看源码
@Override
public void onClick(View v) {
Context context = v.getContext();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
final Display display = (Display) v.getTag();
Resources r = context.getResources();
AlertDialog alert = builder
.setTitle(r.getString(
R.string.presentation_alert_info_text, display.getDisplayId()))
.setMessage(display.toString())
.setNeutralButton(R.string.presentation_alert_dismiss_text,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create();
alert.show();
}
这个是点击按钮弹窗显示屏幕相关的信息,里面
final Display display = (Display) v.getTag();
先看一下获取屏幕的方法
DisplayManager mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = mDisplayManager.getDisplays();
MyLog.diff("33333=====当前屏幕的个数====" + displays.length);
int screenNum = displays.length;
if (screenNum < 2) { //单个屏幕
return;
}
看到这里,应该就明白了,果断追下去,去找尺寸,分辨率封装在Mode里面,
Display display = displays[1]; //0表示主屏,1 表示副屏
int width = display.getMode().getPhysicalWidth();
int height = display.getMode().getPhysicalHeight();
根据不同的系统版本,这个调用方法有所变动
android 5.0没有getModel(),这个方法,可以直接调用getWidth(),方法,
android 7.0,就可以直接采取display.getModel().getPhysicalWidth();
获取屏幕的方向
调用getProperties(String info);这个方法,传递上面的两个常量值即可得到参数
不过,主屏返回的是 0 ,90,180, 270
副屏返回的是0,1,2,3,4,
0对应是0 度
1对应的是90
2对应的是180
3对应的是270
4对应的是和主屏一样的角度,然后剩下的,你去判断主屏的方向就可以了,单独处理
public static final String PROOERTY_INFO = "persist.sys.displayrot"; //主屏幕的旋转方向
public static final String PROOERTY_OTHER_INFO = "persist.orientation.vhinit"; //副屏幕的旋转方向
//判断设备是否连网线 0:没有连接 1:已经连接
public static final String JUJLE_ETH_LINE_DEV_ORDER = "cat /sys/class/net/eth0/carrier";
// 获取和设置SystemProperties属性的代码
public static String getProperty(String key, String defaultValue) {
String value = defaultValue;
try {
Class> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class);
value = (String) (get.invoke(c, key, defaultValue));
} catch (Exception e) {
e.printStackTrace();
} finally {
return value;
}
}
这里贴一下判断副屏方向的代码,主屏就不需要了,因为可以直接根据宽高来判断
/**
*
* 1 横屏
* -1 竖屏
* 0 方屏
*
* @return
*/
public int getScreenRoate() {
int screenRoate = 0;
String roate = RootCmd.getProperty(RootCmd.PROOERTY_OTHER_INFO, "0");
screenRoate = Integer.parseInt(roate);
/**
* 0 0度
* 1 旋转90度
* 2 旋转180度
* 3 旋转270度
* 4 和主屏一样的角度
*/
if (screenRoate == 0 || screenRoate == 2) { //横屏
screenRoate = 1;
} else if (screenRoate == 1 || screenRoate == 3) { //竖屏
screenRoate = -1;
} else if (screenRoate == 4) { //副屏和主屏一个方向
int mainWidth = SharedPerManager.getScreenWidth();
int mainHeight = SharedPerManager.getScreenHeight();
if (mainWidth > mainHeight) { //横屏
screenRoate = 1;
} else if (mainWidth < mainHeight) { //竖屏
screenRoate = -1;
} else if (mainWidth == mainHeight) { //方屏
screenRoate = 0;
}
}
return screenRoate;
}
不是看源码,真的不知道还有这个方法,分享给大家.