新浦京81707con > 软件下载 > 最全Android刘海屏适配方案,状态栏适配

原标题:最全Android刘海屏适配方案,状态栏适配

浏览次数:126 时间:2020-02-15

版权注脚:本文为博主原创小说(部分引用旁人博文,已加上援用表达State of Qatar,未经博主允许不得转发。

图片 1image

在Android系统4.4以前,状态栏的背景象和字体颜色都是不可能改造的。不过4.4随后Google扩充了改观状态栏背景透明的不二秘籍,能够通过二种方法来安装。直接在Activity中装置Window属性:

转发请注脚出处: AWeiLoveAndroid的博客

刘海屏指的是手提式有线电电话机荧屏上方由于追求极致边框而利用的方案,表现为在顶上部分有块深绿遮挡,长得像刘海,所以叫刘海屏。

@Overrideprotected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } super.onCreate(savedInstanceState);}
率先篇文章讲了 Android适配全面总计----显示器适配

时下google在Android P上早就对刘海屏的适配实行了统黄金年代,所以在targetApi >= 28上能够使用Google官方推荐的适配方案张开刘海屏适配。不过在Android O版本的刘海屏怎么着适配呢?那正是本文要器重阐释的从头到尾的经过了:

在xml的style文件中安装:

上大器晚成篇文章讲了 Android适配周全总计----版本适配

Android是开源的,不相同的无绳电话机厂家皆有友好定制的系列,所以那就给开辟者带给了ROM适配难点。在有的群里面平常看看有人因为手提式有线话机适配难点,说那些手提式有线电话机坑,那些手提式有线电话机坑,其实那是还没对ROM定制系统的意气风发部分改成理解,招致了盲指标表露这么些责备的话。假若您熟识了,也就能够少走超多弯路。下边那篇小说就来说一下多少个主流手提式有线电话机的ROM适配难点。

图片 2

小米

1、OPPO开垦者文书档案2、开采人士一定要看:《Nokia应用开拓者文书档案》 ,在这里地能够找到在华为手机上支出、分发应用的连带文书档案。3、平淡无奇难点4、摩托罗拉帐号场景化登陆5、才具文书档案

华为

1、 APK固件及分辨率适配表明2、 索尼爱立信周详屏适配技术指引3、 中兴刘海屏手提式有线电话机安卓O版本适配指点4、 谷歌(Google卡塔尔(قطر‎强迫晋级TargetSdkVersion适配指引5、 Android P版本非SDK接口管理调节脾性解读及适配带领6、 Android P版本接纳包容性适配技导7、One plus桌面角标开辟教导书

1、对国内四大厂家(金立、中兴、Samsung、VIVO)对Android O 版本刘海屏的适配方案进行介绍;2、对Android P版本的刘海屏举行适配;3、提议对Android O 版本刘海屏的通用应用方案,包罗全屏占用刘海屏、全屏不占用刘海屏三种景况;4、提议适配工具NotchTools应用方案,让你的利用简单高效的适配全面屏

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">true</item></style>
1、One plus部分设施不打字与印刷Log

部分的华为设备工程方式下log是关门的,中兴部分设施不打字与印刷Log的实施方案:

1.如果是华为手机,进入拨号界面输入:*#*#2846579#*#*进入页面设置。2.如果是华为pad,进入计算器输入:2846579= 进入页面设置。

因为相对来说平常常规手提式有线电话机来讲,刘海屏最上部中间会鼓起一块刘海区域,所以会在给Actiivty设置全屏Flag的时候有生机勃勃部分不少年老成。本文所涉嫌到的刘海屏适配都以在给Activity的window设置SYSTEM_UI_FLAG_FULLSCREEN前提下的,在突显状态栏的场馆下(不管是情形栏透明大概不透明),不是本文研讨的主导,大家的所说的刘海屏适配只是本着全屏沉浸式的景色下。

使用android:windowTranslucentStatus属性须要在res目录下新建values-v19文件夹,style文本要放在中间。尽量使用第意气风发种方法类达成,听别人讲是第三种办法在一些魅蓝手提式有线电话机上尚无功用。

2、魅族手提式有线电电话机获取拍照权限后拍片,重返值为空

主题素材根源:开垦中境遇了急需拍录和从图库中选拔图片显示并上传的功效,别的手提式有线电话机测验没难题,荣耀手提式有线电话机获取拍照权限后留影,再次回到值为空。

主题素材浅析:本来是摩Toro拉在7.0之后的体系中,对于拍照后归来的图片也做了权力管理。所以说,Samsung7.0在照相的时候,不仅仅要获得拍照 CAMERA 的权力,还要获得读写文件的权柄 WRITE_EXTERNAL_STORAGE

不留余地办法有个别代码如下:

//声明两个常量public static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 0x0001;public static final int MY_PERMISSIONS_REQUEST_CALL_PHONE2 = 0x0002;//设置权限public void setTakePhonePermissions(Context context) { if (Build.VERSION.SDK_INT >= 23) { int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA); if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.CAMERA,} , MY_PERMISSIONS_REQUEST_CALL_PHONE); } else if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CALL_PHONE2); } else { takePhoto(); } //小于23的不需要动态权限 } else { takePhoto(); } } 

在设置SYSTEM_UI_FLAG_FULLSCREEN了Flag后,我国厂家的刘海屏手提式无线电话机对于此表现的暗许展现效果都以有出入的,具体为:1、OPPO手机暗许是全屏不过不占用刘海区域;2、国产手机私下认可是全屏可是不占用刘海区域;3、oppo手提式有线电话机暗中认可是全屏且占用刘海区域,可在安装里单独给应用程式设置是不是隐伏刘海;4、Motorola手提式有线电话机暗中同意是全屏且占用刘海区域,可在设置里单独给应用程式设置是或不是隐伏刘海;

二种艺术都是让情况背景栏透明。但是在实际测量检验后意识,在android4.4系统上状态栏的背景是渐变半晶莹剔透。而在android5.0 的系列上又有所分裂又有差别:

3、小米Android7.0部手提式有线电话机展开摄像头拍照闪退难点。

备注:通超过实际验及查阅文书档案开掘,金立和小米适配方案是相同的且适配方案成熟,oppo、和三星的适配介绍是周围的,且基本无适配方案。Nokia、金立会分别对全屏占用刘海、全屏不占用刘海二种情景分别提供了章程。而oppo、华为只提供了是还是不是有刘海这些三个办法,并从未提供适配方案。

在Genymotion模拟器、Samsung、nexus6p的android5.0 系统上是半透明。在xiaomi、oppo、huawei、leshi等5.0 系统是全透明的。

4、华为手机Android8.0 使用代码安装APK闪退难点

更新版本APK自动安装的时候,在安卓6.0、7.0下都OK,唯独在BlackBerry安卓8.0手提式有线话机闪退。

缓慢解决方案: 只要在Mainfest.xml 中步入央浼设置权限就OK了

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> 
  • ★★ 关于闪退的计算:
    1. 在Android 7.0有线电话拉开始拍戏摄效果,既要申请CAMERA 权限,还要申请 WRITE_EXTERNAL_STORAGE 权限。
    1. Android 7.0以致上述版本不支持file://那连串型的U锐界I,而是接受content://那类别型的URubiconI。不然会报android.os.FileUriExposedException以此错,使用Android 7.0有线电话拍照作用时,必要求留神那些api的变化。
    1. 利用Android 8.0手提式有线电电话机更新安装apk时,在Mainfest.xml 中号令设置权限android.permission.REQUEST_INSTALL_PACKAGES

于是我们再全屏的动静下供给对四大厂家做下适配,不然有极大希望三个App在区别手提式有线电话机上表现差异样、或许会对UI做了截断,影响使用体验:

图片 3android4.4图片 4模拟器android5.0 图片 5Nokia5android6.0从成效图也足以看来,上边三种办法使得内容区域延伸到状态栏上面去了。我们能够加上android:fitsSystemWindows来幸免那样的动静。在Activity的根构造文件中增加

5、国产手提式有线电话机app闪退重启清空log日志难题

缓和方案:

◆ 方式1:

找到手机设置 ---> 最后的开发人员选项 ---> 在调试模块,打开USB调试。 还是调试模块内,找到日志记录器缓冲区大小,改为1M,然后进入拨号界面输入:*#*#2846579#*#* ----> 选择USB端口设置 ----> 选择Google模式。

◆ 情势2:拨号键盘 快速键设置(这种方法不是兼具log都能显得)

进入拨号界面输入:*#*#2846579#*#*依次选择:后台设置 ---> LOG设置 ---> AP 日志,重新启动手机。

◆ 情势3:错误现身后,急迅拔掉USB线,那是叁个拼手速的法子,成功率不敢保障。

图片 6攻克刘海展现的刘海屏图片 7未占用刘海呈现的刘海屏

android:fitsSystemWindows="true"
6、关于红米手提式无线电话机App权限更正招致应用重启的坑(一时本人还并未有很好的解决办法)

标题重现:

  • 1.当大家在索尼爱立信手提式有线电话机上开荒一个选用,将运用退至后台进程中。
  • 2.展开“设置”去改换该接受的权力(例如将“存款和储蓄”权限由授权情形改为非授权状态)。
  • 3.再将该使用重新切换成前台,会意识选取进行了再次开动。 (在该app中,运维的时候,FragmentManager依旧会有着原有的fragment。)

网络有人揭露了风华正茂种原因和朝气蓬勃种 寸草不留方案:当使用的权力爆发变化的时候,魅蓝手提式有线电话机发生广播,招致应用重新起动。 消除办法:在Activity的onCreate(State of Qatar方法中,依据FragmentManager获取到已经存在的fragment,并将它们移除掉。重新再成立一下亟待浮现的fragment

不过作者想知道framework层是如何操作的?不清楚有未有大佬能够解析一下源码?

魅族

BlackBerry开拓者文书档案

oppo

oppo开采者文书档案

Android O的刘海屏适配方案可分为三种境况:

抑或在主题style文件中增添

2、关于开发者选项

oppo手提式有线电话机的开辟者格局很恶心,开启“设置”》别的装置》开垦者选项》USB调节和测量试验待机,然后事态栏有个石榴红的晋升窗口,提醒10秒钟后自行关闭开垦者选项。

对于急需全屏且占用刘海屏彰显的气象,如沉浸式游戏、沉浸式阅读,适配时得以运用如下步骤:1、在Activity中央银行使setSystemUiVisibility设置全屏的大器晚成都部队分标志;2、根据不一致厂家的适配法规设置分歧的flag,来让App全屏沉浸式彰显;3、依据厂家提供的Api,获取刘海的惊人,来调解一些View的间隔,到达适配指标。

<item name="android:fitsSystemWindows">true</item>
3、关于验证码

装个应用要验证码,张开开垦者选项要求验证码。。很恶心。。

这种适配方案经常接收如下步骤:1、去各大手机厂家官方网址找到呼应的全屏但不占用刘海的方案,方今唯有Nokia、魅族提供了具体方法来安装是或不是占用刘海区域,oppo和Motorola只提供了机型是还是不是是刘海屏手机的不二诀窍,但未提供适配方案;2、OPPO和华为都有切实方案来适配全屏不占用刘海的场所,这里关键对金立和oppo进行适配。这里要表达下,在系统装置里能够安装刘海是或不是隐伏,可是红米、Samsung是大局设置,而ov是足以独自对app实行安装,又因为ov未有提供切实的适配方案,所以对于ov的全屏适配达不到宏观的适配,在不占用刘海时最上部会留出一块黑边。

图片 8android4.4图片 9模拟器android5.0 图片 10Samsung5android6.0上海体育场所为了方便阅览状态栏的背景颜色,就将Activity的构造文件的背景观设置成了新民主主义革命。能够见见Toolbar所在的开始和结果区域未有洗澡到状态栏上面了,何况状态栏的背景颜色仍然在此以前同样,只是将内容区域向下偏移了情景栏中度的偏离。这是因为fitsSystemWindows天性使得布局的paddingTop被重新改写了(paddingTop日增了状态栏的可观)。要得以达成沉浸式的状态栏,其实正是状态栏的背景颜色和Toolbar的水彩肖似。那么大家将Activity的背景象改为Toolbar花青(内容区域的背景颜色设置为石榴红)看下效果:图片 11android4.4图片 12模拟器android5.0 图片 13HTC5android6.0除了通过fitsSystemWindows其风度翩翩天性,大家能够团结给在Toolbar的下面加多二个和情景栏高度生龙活虎致的Veiw,并将那一个View的背景观设置成和Toolbar的背景观同样。也足以一贯给Toobar设置paddingTop对等状态栏中度值。为了方便,作者平常是采纳重写Toolbar,改写它的paddingTop值来实现。

4、oppo手机的奥迪Q59体系和A系列的5.1系统存在严重的bug,近似以下这种的gc引致的假释超时超多。

图片 14

vivo

索尼爱立信开垦者文书档案

  • 有关as项目相当小概在一加中装置的难点:

新近适配魅族手提式有线电话机 用的是诺基亚 x9 发掘选拔不可能在大哥大上安装 已经张开了开采者格局依旧不行,报以下错:

图片 15

关掉Android Studio的Instant Run作用,然后把开荒者方式中的USB安全形式和USB调节和测量检验一齐张开。(其余手提式有线电电话机缘到相似难点,也足以用那几个主意解决。)

锤子

一时没找到有关文书档案。。。

沉浸式状态栏适配

  • 此间讲一下小米手提式无线电话机沉浸式状态栏和虚构键盘冲突难点怎么消除:

是因为字数节制,详细代码请看本人的github

沉浸式状态栏Logo的适配

  • 2.2.1 中兴MIUI系统适配

事前做沉浸式状态栏,由于店肆应用软件底色是反动,所以对MIUI进行超过常规规管理。在MIUI V6及以上版本,调用MIUI的点子将气象栏Logo改为深翠绿。开掘部分国产手提式有线电话机,那样的装置不管用,导致头上一片白,状态栏上的事物基本看不到。

调动进程中发觉以下情况:

手机型号 MIUI版本 Android版本 系统方法是否生效 MIUI的方法是否生效
红米 NOTE 1LTE MIUI 8 8.2.1稳定版 4.4 生效
小米5 MIUI 8 8.5.3稳定版 7.0 生效
MI 3W MIUI 9 7.9.14开发版 6.0.1 生效

参照官方文书档案:

动用卸载然后安装更新的适配

  • 2.3.1 HTC适配荣耀手机前后相继卸载,安装更新包,依然提醒更新包与安装使用具名不一致等。

  • 2.3.2 黑莓适配

    • 标题1. 测量检验的具名和你正式出包的签署假若不黄金年代致就无法设置,卸载应用也没用。
    • 主题素材2. 用as安装过使用,卸载后安装正式的apk就安装不了,用adb命令卸载后就能够了。

更改状态栏字体颜色为铁青的适配

  • 2.4.1 中兴适配
/** * 改变小米的状态栏字体颜色为黑色,要求MIUI6以上 * tested on: MIUI V7 5.0 Redmi-Note3 */private void processMIUI(boolean lightStatusBar) throws Exception{ Window window = getWindow(); Class<? extends Window> clazz = window.getClass(); int darkModeFlag; Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(window,lightStatusBar ? darkModeFlag : 0, darkModeFlag);}
  • 2.4.2 Motorola适配
/** * 改变魅族的状态栏字体为黑色,要求FlyMe4以上 */private void processFlyMe(boolean isLightStatusBar) throws Exception{ Window window = getWindow(); WindowManager.LayoutParams layoutParams = window.getAttributes(); Class<?> instance = Class.forName("android.view.MiuiWindowManager$LayoutParams"); int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(layoutParams); Field field = instance.getDeclaredField("meizuFlags"); field.setAccessible; int origin = field.getInt(layoutParams); if(isLightStatusBar){ field.set(layoutParams, origin | value); }else{ field.set(layoutParams, -value | origin); }}

上面来一张示例图:

图片 16

荧屏圆角实现和适配

图片 17示例图

  • 得以达成原理:利用WindowManager将大家的圆角加到显示屏的多少个角,圆角颜色设置为红色,变成视觉圆角显示屏。

上面简单的把部分基本代码讲一下:

  • 自定义圆角View,这里以左上角为例:
// top leftcase Gravity.TOP | Gravity.LEFT: path.moveTo(0.0f, 0.0f); path.lineTo(0.0f, ; path.arcTo(new RectF(0.0f, 0.0f,  w) * 2.0f,  h) * 2.0f), 180.0f, 90.0f, true); path.lineTo w, 0.0f); path.lineTo(0.0f, 0.0f); path.close(); break;
  • windowmanager在增进view的时候必要安装三个WindowManager.LayoutParams。上面早先化那一个Params:
// window managermanager = (WindowManager) this.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);params = new WindowManager.LayoutParams();/* 系统提示类型:7.0以前可以直接用TOAST的类型,不用申请权限,直接添加 7.0以后不行了,需要申请SYSTEM_ALERT_WINDOW权限,window type最好 设置为ERROR 或者 PHONE */if (Utilities.isCanUseToastType { params.type = WindowManager.LayoutParams.TYPE_TOAST;} else { params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;}params.format = 1;params.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN // 全屏 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // 覆盖到status bar | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION // 覆盖到导航栏 // 以下属性设置加载我们圆角window 不抢焦点,不拦截事件 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.alpha = 1.0f;params.x = 0;params.y = 0;// 设置 大小为全屏params.width = ViewUtil.getScreenSize.x;params.height = ViewUtil.getScreenSize.y;
  • 圆角加到荧屏上:
public void addCornerViewByPosition(String position){ boolean enable = true; switch  { case LEFT_TOP: enable = leftTopEnable; params.gravity = Gravity.TOP | Gravity.LEFT; break; case RIGHT_TOP: enable = rightTopEnable; params.gravity = Gravity.TOP | Gravity.RIGHT; break; case LEFT_BOTTOM: enable = leftBottomEnable; params.gravity = Gravity.BOTTOM | Gravity.LEFT; break; case RIGHT_BOTTOM: enable = rightBottomEnable; params.gravity = Gravity.BOTTOM | Gravity.RIGHT; break; } CornerView corner = buildCorner(enable,params.gravity); if(!corners.containsValue { corners.put(position, corner); manager.addView(corner, params); }}

显示器圆角完成和适配,详细的能够点击这里:

在带虚构开关的无绳电话机上,虚构按钮会遮挡全屏图片的尾部的消除。

在做splash页面包车型客车时候,通过windowBackground设置背景图片,在带虚构按钮的无绳电话机上,设想按钮会遮挡图片的最底层,这几个标题标解决措施:

参考:

到底怎么适配Android尾巴部分设想开关,能够参照他事他说加以考察那篇博文:

悬浮窗权限设置了,dialog照旧不提拔。

在Nexus 手提式有线电话机,原生Android 8.0上,使用扫码的时候显得的照相预览方向不正,有180度的转动何况变形的,解决方案:

private void surfaceIsChanged() { if (mHolder.getSurface() == null) { System.out.println("getSurface,nullnull"); return; } try { mCamera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } try { Camera.Size previewSize = mCamera.getParameters().getPreviewSize(); int dataBufferSize =  (previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(mCamera.getParameters() .getPreviewFormat); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.setPreviewDisplay; mCamera.setPreviewCallback(previewCallback); mCamera.startPreview(); mCamera.autoFocus(autoFocusCallback); // 核心代码:根据照相的内容进行设置显示方向。 Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); // DO your logic to get front or back camera...or loop through all avaialable. int camIdx = 0; Camera.getCameraInfo(camIdx, cameraInfo); try { // If using back camera then simply rotate what CameraInfo tells you. if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK){ mCamera.setDisplayOrientation(cameraInfo.orientation); }else{ // If using front camera note that image might be flipped // to give users the impresion the are looking at a mirror. mCamera.setDisplayOrientation( (360 - cameraInfo.orientation) % 360); } } catch (Exception e) { e.printStackTrace(); } //开始扫描 // Toast.makeText(QRZbarActivity.this, "开始扫描",Toast.LENGTH_SHORT).show(); // 打开闪光灯,这个方法自己去实现,这里不是重点,就不写了。 autoOpenLight(); } catch (Exception e) { Toast.makeText(BaseScanActivity.this, R.string.account_toast_not_open_camera, Toast.LENGTH_SHORT).show(); // showTip("您未允许"   getResources().getString(R.string.app_name) //   "访问您的相册n请在“安全中心 -授权管理”中更改设置"); Log.d("DBG", "Error starting camera preview: "   e.getMessage; }}

其一解决方案来自:

获取手提式有线电话机里有所存储设备盘符,差别厂家手提式有线电话机的路径大概差异等。

标题陈说:荣耀手提式有线电话机很失常,存储路线跟原生系统的不风流洒脱致,所以须求对其做非常管理。

缓慢解决方案: 要求使用叁个被系统隐蔽的艺术,即StorageManager下的getVolumePaths(State of Qatar方法。具体经过反射能够赢得,当中mPath、mRemovable、mEmulated、mState那多少个属性是大家供给关注的。

切切实实代码:

public class StorageUtils { /* 获取全部存储设备信息封装对象 */ public static ArrayList<Volume> getVolume(Context context) { ArrayList<Volume> list_storagevolume = new ArrayList<Volume>(); StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); try { Method method_volumeList = StorageManager.class.getMethod("getVolumeList"); method_volumeList.setAccessible; Object[] volumeList =  method_volumeList.invoke(storageManager); if (volumeList != null) { Volume volume; for (int i = 0; i < volumeList.length; i  ) { try { volume = new Volume(); volume.setPath volumeList[i].getClass().getMethod("getPath").invoke(volumeList[i])); volume.setRemovable volumeList[i].getClass().getMethod("isRemovable").invoke(volumeList[i])); volume.setState volumeList[i].getClass().getMethod("getState").invoke(volumeList[i])); list_storagevolume.add; } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } else { Log.e("null", "null-------------------------------------"); } } catch (Exception e1) { e1.printStackTrace(); } return list_storagevolume; } /* 存储设备信息封装类 */ public static class Volume { protected String path; protected boolean removable; protected String state; public String getPath() { return path; } public void setPath(String path) { this.path = path; } public boolean isRemovable() { return removable; } public void setRemovable(boolean removable) { this.removable = removable; } public String getState() { return state; } public void setState(String state) { this.state = state; } }}

测验代码:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<StorageUtils.Volume> list_volume = StorageUtils.getVolume; for (int i=0;i<list_volume.size{ Log.e(i "","path:" list_volume.get.getPath() "----"  "removable:" list_volume.get.isRemovable() "---"  "state:" list_volume.get.getState; } }}

急需加上权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

本文部分内容引用了该博客:

图片 18

图片 19索爱手提式有线电电话机刘海屏适配方案

/** * Created by xiaoyanger on 2017/3/1. * 沉浸式、版本兼容的Toolbar,状态栏透明. */public class CompatToolbar extends Toolbar { public CompatToolbar(Context context) { this(context, null); } public CompatToolbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CompatToolbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setup(); } public void setup() { int compatPadingTop = 0; // android 4.4以上将Toolbar添加状态栏高度的上边距,沉浸到状态栏下方 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { compatPadingTop = getStatusBarHeight(); } this.setPadding(getPaddingLeft(), getPaddingTop()   compatPadingTop, getPaddingRight(), getPaddingBottom; } public int getStatusBarHeight() { int statusBarHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } Log.d("CompatToolbar", "状态栏高度:"   px2dp(statusBarHeight)   "dp"); return statusBarHeight; } public float px2dp(float pxVal) { final float scale = getContext().getResources().getDisplayMetrics().density; return (pxVal / scale); }}

3.3.1 判别OPPO手提式有线电话机是或不是为刘海屏手提式有线电话机

 @RequiresApi(api = Build.VERSION_CODES.O) @Override public boolean isNotchScreen(Window window) { boolean isNotchScreen = false; try { ClassLoader cl = window.getContext().getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen"); isNotchScreen =  get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { LogUtils.d(TAG, "hasNotchInScreen ClassNotFoundException"); } catch (NoSuchMethodException e) { LogUtils.d(TAG, "hasNotchInScreen NoSuchMethodException"); } catch (Exception e) { LogUtils.d(TAG, "hasNotchInScreen Exception"); } finally { return isNotchScreen; } }

急需小心的是,英特网有过多作品说状态栏的冲天是25dp,但实在测验后发掘并非有所的机型都以25dp。使用getStatusBarHeight()可以确切的收获状态栏的冲天值,看下获取到惊人的日记:

3.3.2 获取华为手提式有线电话机的刘海屏中度

 @RequiresApi(api = Build.VERSION_CODES.O) @Override public int getNotchHeight(Window window) { if (!isNotchScreen { return 0; } int[] ret = new int[]{0, 0}; try { ClassLoader cl = window.getContext().getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("getNotchSize"); ret =  get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { } catch (NoSuchMethodException e) { } catch (Exception e) { } finally { return ret[1]; } }

图片 20android4.4模拟器图片 21android6.0模拟器图片 22oppo r9图片 23索尼爱立信5各类机型获得到的景观栏中度超级多都不平等,所以最佳仍然重写Toolbar,动态获取到系统状态栏的惊人来改写它的上方距。

本文由新浦京81707con发布于软件下载,转载请注明出处:最全Android刘海屏适配方案,状态栏适配

关键词: 状态 Android ROM 适配 最全

上一篇:0运行权限解决方案,行为变更指南

下一篇:没有了