核心就是将targetSdkVersion升级到28 能让画布扩展到刘海那一块
cocoscreator处理:
因为cocoscreator新版本的安卓包targetSdkVersion和compileSdkVersion >= 28
所以就很舒服了
//在manifest添加。可以填充底部黑边
<meta-data android:name = "android.max_aspect"
android:value="2.2" />
//屏幕适配核心 在AppActivity的onCreate添加 让画布扩充到刘海部分
if (Build.VERSION.SDK_INT >= 28) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
}
到此cocoscreator的全部处理好了
cocos2d-x处理:
因为cocos2d-x太老了所以targetSdkVersion和compileSdkVersion 导致跟不上 但是还是有办法解决的
下面我会列出我在2d-x中碰到的所有问题和解决方案包括有些升级导致的安卓问题 我也全部踩了 大家出了啥问题就对着看 因该能很快的解决问题
/在manifest添加屏幕比例。可以填充底部黑边
<meta-data android:name="android.max_aspect"
android:value="2.2" />
//在项目级的build.gradle中添加。因为提高API等级会导致找不到http的库
useLibrary 'org.apache.http.legacy'
//在项目级的build.gradle中添加。因为提高API等级会导致在编译中找不到junit
compile 'junit:junit:4.12'
//在manifest添加 是为了在兼容9.0以上的手机的http协议 如果不加编译报错
<uses-library
android:name="org.apache.http.legacy"
android:required="false"/>
//屏幕适配核心 在AppActivity的OnCreat添加 并且加上SDK版本判断 如果不加会导致低等级的手机无法打开App
if (Build.VERSION.SDK_INT >= 28) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
}
// 修改AppActivity 中的Cocos2dxGLSurfaceView onCreateView()函数 因为安卓高版本获取设备ID的方式不一样。如果不改 必定报错
String deviceId ;
//android.telephony.TelephonyManager
TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT <= 23) {
deviceId = mTelephony.getDeviceId();
} else {
//android.provider.Settings;
deviceId = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
} https://www.cnblogs.com/lenkevin/p/7640691.html
可参考此链接的解决方法
此时 安卓9.0会因为http请求不安全 导致所有的http协议请求失败 所以 请参考
https://www.jianshu.com/p/518669631e01
此链接的解决方法
动态获取安卓9.0以上的权限。 如果不获取 可能会出问题。 获取方式参考 https://www.jb51.net/article/134767.htm
同时在项目级的build.gradle中添加
compile 'com.android.support:support-v4:26.0.0-alpha1'
compile 'com.android.support:appcompat-v7:26+' 如果通过继承AppActivity的方式无法实现 可以直接写在AppActivity里面
如果需要打包 则可以升级到4.4
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
在后期遇到一个虚拟按键的屏蔽需求。在onCreate中加入
hideBottomUI(getWindow().getDecorView());
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int arg0) {
// TODO Auto-generated method stub
hideBottomUI(getWindow().getDecorView());
}
});
并且添加一个函数
public static void hideBottomUI(View view) {
int uiFlags = 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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN; // hide status bar
if( android.os.Build.VERSION.SDK_INT >= 19 ){
uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; //View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY: hide navigation bars - compatibility: building API level is lower thatn 19, use magic number directly for higher API target level
} else {
uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
view.setSystemUiVisibility(uiFlags);
}
可参考https://www.jianshu.com/p/a98edc50f3ea