特殊代码说明一、获取商米设备标识商米建议通过获取到以下内容来判断是否商米设备:1.设备的品牌名brand(如:SUNMI)商米的品牌名统一为SUNMI2.设备的系统型号model(如:V1-B18)系统型号组成为产品型号+硬件特性+‘-’+软件特性其中以V、M、P、L开头为手持设备,以T、D、S开头为横屏设备(截至2017年12月)3.设备的ROM版本号(如:1.1.0)。4.设备的ROM顺序号(如:128)。可以下载Demo,仿照Demo在自己项目src下面新建android.os包(固定写法),将SystemProperties.java放入该包下,按以下方法获取指定的值:获取brand的代码为:Stringbrand=SystemProperties.get(ro.product.brand);获取model的方法为:Stringmodel=SystemProperties.get(ro.product.model);获取ROM版本号的代码为:Stringversionname=SystemProperties.get(ro.version.sunmi_versionname);获取ROM顺序号的方法为:Stringversioncode=SystemProperties.get(ro.version.sunmi_versioncode);二、获取设备的SN号1.在AndroidManifest.xml中添加如下权限。uses-permissionandroid:name=android.permission.READ_PHONE_STATE/2.在需要的地方用以下代码获取商米SN号。try{Classc=Class.forName(android.os.SystemProperties);Methodget=c.getMethod(get,String.class);Log.i(sunmi,thesn:+(String)get.invoke(c,ro.serialno)));Log.i(sunmi,Firstfourcharacters:+(String)get.invoke(c,ro.serialno).substring(0,4));}catch(Exceptione){e.printStackTrace();}3.在需要的地方用以下代码获取客户SN号,限定最多16位数字或大小写字母。(当前仅P1设备支持)try{Classc=Class.forName(android.os.SystemProperties);Methodget=c.getMethod(get,String.class);Log.i(sunmi,thecustomersn:+(String)get.invoke(c,gsm.serial1)));}catch(Exceptione){e.printStackTrace();}三、隐藏及恢复底部导航栏Android系统默认提供了隐藏系统的导航栏的方法,但对于Dialog的支持较差,导致全屏对话框打开时先弹出导航栏再隐藏(闪屏),SunmiOS针对此问题进行了修复(V1系统固件版本252后支持,T1系统固件版本132后支持)1.Activity的全屏化——安卓默认支持publicclassMainActivityextendsAppCompatActivity{@OverridepublicvoidonWindowFocusChanged(booleanhasFocus){super.onWindowFocusChanged(hasFocus);SystemUIUtils.setStickFullScreen(getWindow().getDecorView());}}publicclassSystemUIUtils{publicstaticvoidsetStickFullScreen(Viewview){intsystemUiVisibility=view.getSystemUiVisibility();intflags=View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION//hidenavbar|View.SYSTEM_UI_FLAG_FULLSCREEN//hidestatusbar|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;systemUiVisibility|=flags;view.setSystemUiVisibility(systemUiVisibility);}}2.Dialog的全屏化——原生系统下AOSP的Bug会导致全屏对话框打开时先弹出导航栏然后再隐藏导航栏(闪屏)。publicAlertDialogcreate(booleanfullscreen){LayoutInflaterinflater=LayoutInflater.from(context);finalAlertDialogdialog=newAlertDialog(context,R.style.DialogStyle);if(fullscreen){SystemUIUtils.setStickFullScreen(dialog.getWindow().getDecorView());}}3.设置隐藏后显示导航栏3.1.全局底部上划——上划后底部导航栏显示4s,4s后底部导航栏隐藏3.2.切换应用至其他APP(如APP内跳转至第三方应用、第三方APP弹窗等)——切换至其他APP是否显示底部导航栏以第三方应用要求为准,切换至自己APP时底部导航栏消失四、避免重复申请外设权限当APP需要通过USB关联外设来实现业务时(比如连接USB打印机打印小票),安卓要求用户手动确认设备使用权限,来保障用户信息安全,防止木马非法入侵USB设备。1.如何避免USB设备重新插拔同一个外设时,APP反复申请该外设权限需要用户手动确认时,勾选“默认情况下用于该USB设备”,无法通过代码绕过该安全机制验证DEMO2.如何避免设备重启后,已勾选“默认情况下用于该USB设备”的APP仍反复申请同一个外设的使用权限2.1.在APP的AndroidManifest中指定某个Activity部分中,添加如下代码intent-filteractionandroid:name=android.hardware.usb.action.USB_DEVICE_ATTACHED//intent-filtermeta-dataandroid:name=android.hardware.usb.action.USB_DEVICE_ATTACHEDandroid:resource=@xml/device_filter/2.2.在该目录下创建xml文档?xmlversion=1.0encoding=utf-8?resourcesusb-deviceclass=7//resources其中,class的值需要和要连接的外设类型一致,外设class参照表如下/***USBclassindicatingthattheclassisdeterminedonaper-interfacebasis.*/publicstaticfinalintUSB_CLASS_PER_INTERFACE=0;/***USBclassforaudiodevices.*/publicstaticfinalintUSB_CLASS_AUDIO=1;/***USBclassforcommunicationdevices.*/publicstaticfinalintUSB_CLASS_COMM=2;/***USBclassforhumaninterfacedevices(forexample,miceandkeyboards).*/publicstaticfinalintUSB_CLASS_HID=3;/***USBclassforphysicaldevices.*/publicstaticfinalintUSB_CLASS_PHYSICA=5;/***USBclassforstillimagedevices(digitalcameras).*/publicstaticfinalintUSB_CLASS_STILL_IMAGE=6;/***USBclassforprinters.*/publicstaticfinalintUSB_CLASS_PRINTER=7;/***USBclassformassstoragedevices.*/publicstaticfinalintUSB_CLASS_MASS_STORAGE=8;/***USBclassforUSBhubs.*/publicstaticfinalintUSB_CLASS_HUB=9;/***USBclassforCDCdevices(communicationsdeviceclass).*/publicstaticfinalintUSB_CLASS_CDC_DATA=0x0a;/***USBclassforcontentsmartcarddevices.*/publicstaticfinalintUSB_CLASS_CSCID=0x0b;/***USBclassforcontentsecuritydevices.*/publicstaticfinalintUSB_CLASS_CONTENT_SEC=0x0d;/***USBclassforvideodevices.*/publicstaticfinalintUSB_CLASS_VIDEO=0x0e;/***USBclassforwirelesscontrollerdevices.*/publicstaticfinalintUSB_CLASS_WIRELESS_CONTROLLER=0xe0;/***USBclassforwirelessmiscellaneousdevices.*/publicstaticfinalintUSB_CLASS_MISC=0xef;/***ApplicationspecificUSBclass.*/publicstaticfinalintUSB_CLASS_APP_SPEC=0xfe;/***VendorspecificUSBclass.*/publicstaticfinalintUSB_CLASS_VENDOR_SPEC=0xff;3.如何避免前两步后设置后,业务页面会因USB设备插入而刷新安卓原生逻辑导致用户选择“默认情况下用于该USB设备”会导致USB设备插入时打开某个指定activity。如果要避免页面刷新导致业务中断,可以增加如下代码防止页面刷新。activityandroid:name=.MainActivityandroid:launchMode=singleTop五、如何避免自己的应用数据被清除应用数据默认是可以通过系统设置删除的,删除后应用将恢复刚安装的状态。但是可以通过配置APP来精细管理应用数据(比如按照业务分类或时间删除数据),也可以避免重要的应用数据被删除。在程序的manifest文件的application中加上manageSpaceActivity属性,并且指定一个Activity,这个Activity就是点击管理空间之后会跳转的那个Activity了。applicationandroid:manageSpaceActivity=[packageName].ManageSpaceActivity......activityandroid:name=[packageName].ManageSpaceActivi