《Android Studio开发实战 从零基础到App上线(第2版)》在书后面的附录中给出了Android8和Android9的主要特性说明,附录表格如下图所示: 不过附录表格只涵盖了常见的功能代码适配...,而Android8和Android9的众多新特性还涉及到其它的代码适配,下面就补充列出Android8、Android9、Android10的额外兼容处理说明: Android8.0 1、属性动画组合...首先确保代码已经添加动态申请存储权限的逻辑,然后给AndroidManifest.xml中的application节点增加以下属性: android:requestLegacyExternalStorage...此时要在代码中添加版本号判断,如果当前系统版本大于等于29,就不再开关WiFi,代码例子如下: if (Build.VERSION.SDK_INT >= 29) { // Android10...在Android10及以下版本,该值默认为true,但从Android11开始该值默认为false。 设置代码示例如下: // 设置是否允许访问文件,如WebView访问存储卡的文件。
最近工作需要,反射了一下 android.app.QueuedWork 这个类,但是这个类的一些 Field 在Android P之后是不允许APP反射的,所以需要通过一些绕过系统限制的方法。...true,那么久直接返回null了。...但是他的这个方案只有在Android10之前才能正常工作,后面就失效了。...因为在Android9的时候,他会调用 hidden_api.h 里面的 IsCallerTrusted 函数,如果是BootClassLoader加载的,会直接信任: image.png但是在Android10...是null的时候,返回的是 Domain::kPlatform: image.png所以为了适配高版本,FreeReflection使用DexFile加载class(me.weishu.reflection.BootstrapClass
开始便支持浏览这两种格式的图片,从Android10开始更允许将拍摄的照片保存为HEIF格式(同时需要硬件支持)。...ImageDecoder正是Android9推出的新型图像解码器,它不但兼容常规的JPEG和PNG图片,还适配GIF、WebP、HEIF的动图效果,可谓新老图片类型一网打尽。...当然,ImageDecoder的存在意义是为了处理新的图片格式,而不是在老格式上一争高下。...它主要在如下两个方面做了增强: (1)调用带两个参数的decodeDrawable方法,此时输入第二个监听器参数,在监听器中可以获得图像的媒体类型,以及该图像是否为动图; (2)判断解码得到的图形对象是否为...Animatable类型,如果是的话,则调用start方法播放动画; 根据上述两个增强手段,补齐后的动图播放代码如下所示: // 显示指定来源的图像 private void showImageSource
有专门对此机型开发的recovery,可以做很多其它的操作:比如刷入busy box、xposed等框架; 配置及预算,部门预算有限,这款机型价格便宜,但配置是晓龙835的处理器 4GB内存 128G存储,在采购后今后...3年内配置也是够的; Android版本选择 由于Android10.0以后无法直接获取IMEI,在拿Android10中root的手机交给其它项目做开发的时候便遇到了这个问题,无法做到我们的工具获取IMEI...的方式和app一致,所以选择了Android10.0的前一个版本:Android9 root详细教程 方式1: 参见知乎专栏 方式2: 知乎专栏的方式是刷入recovery,然后刷入MagiskFace...,确保系统是ok的; 重启至bootloader模式,查看当前激活的分区,刷入boot root的img文件到当前的激活分区,重启即可; 步骤3后重启进入系统后,会多出一个Magisk Face的应用,...点击后发现无法使用,这个时候需要我们安装Magisk Face的apk应用,安装完后,打开显示正常即表示root成功; 常用命令 1.重启到bootloader adb reboot bootloader
该漏洞位于Android操作系统的内核代码中,可用于帮助攻击者获得对该设备的root访问权限。...具有讽刺意味的是,该漏洞已于2017年12月在Android内核版本3.18、4.14、4.4和4.9中进行了修补,但发现较新版本存在漏洞。...哪些手机有漏洞 此漏洞会影响以下运行Android 8.x及更高版本的Android手机型号: 具有Android9和Android10预览版的Pixel2 华为P20 小米Redmi5A 小米...“这一漏洞与NSO无关;我们的工作重点是开发旨在帮助获得许可的情报和执法机构挽救生命的产品。” CVE-2019-2215 好消息是,此次的Android的Zeroday漏洞没有过去的漏洞那么危险。...当一个线程使用 epoll方式通过使用BINDER_THREAD_EXIT显式退出,该等待队列被释放,但是永远不会从相应的epoll数据结构中删除。
正文 我们按照二大块来进行分析:一块是相关权限,一块是具体获取地理信息的相关代码。(而实际开发代码中,代码这二块是写在一起的,单纯是为了文章分析从而分开。) ? 1.相关权限 ?...1.2 手机的定位开关 在确定我们的app本身已经具有了定位权限后,我们需要知道本身的手机是否已经打开了定位功能。...既然我们用了statActivityForResult来启动,当我们返回回到自己的app界面的时候,在onActivityForResult中需要来判断,本来因为习惯性思维,所以以为自动在onActivityForResult...的返回参数resultCode可以用来判断,后来发现不管开启不开启,都是返回RESULT_CANCELED,也就是0,毕竟在那个设置界面我们并没有设定setResult(xxx);所以当判断了requestCode...也可以参考相关的链接了解一下:Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null),不过貌似也没有找到百分百直接获取GPS定位获取信息的方式。
背景 最近在项目中着手做Android10和Android11 适配时候,期间遇到了不少的坑。之前有专门写过qq、微信分享的适配。但是此次在针对偏业务侧适配工作的时候还是碰到了一些新的问题。...在以上的场景中,涉及到了这些关键点: 把图片存储到sd卡 把绝对路径path传递给qq或者微信 1.1 直接访问sd卡的根目录 通过FileOutPutStream来完成,在Android10以下都没问题...但是,这里有个坑: 在Android10上不行,在Android11上又可以!!为什么? 因为Google改回来了,让Android11支持file://格式了。。。。 (wtf?...0)); cursor.close(); } 拿到绝对路径后,在Android11上都 glide、qq分享、第三方的图片选择框架等都可以正常访问。...答: 如果按照上面正常适配,肯定完全没得问题!
但是在android10的时候,Google还是为开发者考虑,留了一手。...在targetSdkVersion = 29应用中,设置android:requestLegacyExternalStorage="true",就可以不启动分区存储,让以前的文件读取正常使用。...在应用安装到设备上后,如果用户在使用过程中屡次针对某项特定的权限点按拒绝,此操作表示其希望“不再询问”。 ” 这个都算不上改动,只是官方的一个良好建议。建议在用户多次拒绝之后,不要再展示权限申请。...当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。系统的进程也就是使用了这个fd来标示打开的文件,有了它就能对文件做各种操作,获得文件的各种相关信息了。...但是在Android 11 设备中,不好意思,不能随意使用这些信息了。只有当isUserUnlocked()方法返回true的时候,才能正常访问这些数据。
(); 备注:应用已完成存储适配工作且已打开分区存储开关,如果当前应用以兼容模式运行,覆盖安装后应用仍然会以兼容模式运行,卸载重新安装应用才会以分区存储模式运行 2.5 适配方案 2.5.1 方案概览...允许其他应用访问,并且应用卸载后不允许删除的文件,文件需要存储在共享目录,应用可以选择是否进行目录整改,将文件迁移到Android10要求的media集合目录。...ID时,会直接返回null targetSdkVersion>=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException 如果您的App希望在Android 10以下的设备中仍然获取设备...该问题有两种解决方案: 1)在AndroidManifest.xml中Application节点添加如下代码 代码。
一、获取进程名的常规方法,通过ActivityManager 在多进程的APP中,常常需要知道当前进程是主进程还是后台进程?还是什么进程。...最恐怖的是 ActivityManager.getRunningAppProcesses() 有可能调用失败,返回null,也可能 AIDL 调用失败。...在我们开头描述的使用场景中,出现进程名获取失败的情况,将会是非常恐怖。 一旦导致进程中的某些组件没有初始化,整个进程大概率是要gg了。...()方法直接返回当前进程名。...但是这个方法只有在android9【也就是aip28】之后的系统才能调用。
h5+.jpg 基于MUI 、H5+开发的APP在安卓设备升级到Android10后无法启动,点击图片没反应!! 经查得知Android10后,plus获取设备信息等一些操作不在支持了。...同样的代码在原来版本的HX中可以直接真机调试运行在Android10设备上,可正常启动未发现其他异常。由于我是离线打包的,所以断定打包过程一些api无法用了。...但是官方的基座可以在老版本HX上直接运行在Android10上,推测基座版本和HX关系不大,应该是最新的。 所以我们的APP要重新打包发布了。...Android10的更新,DCloud官方一些api不能用了直接造成已有的APP不能启动。感觉这是个挺大的bug!
从后台启动 Activity 的限制 创建高优先级通知 Android10中, 当App无前台显示的Activity时,其启动Activity会被系统拦截, 导致启动无效。...以下代码段展示了如何在应用中请求在后台访问位置信息: <!...参数解释: 参数 类型 释义 uri Uri 提供检索内容的 Uri,其 scheme 是content:// projection String[] 返回的列,如果传递 null 则所有列都返回(效率低下...) selection String 过滤条件,即 SQL 中的 WHERE 语句(但不需要写 where 本身),如果传 null 则返回所有的数据 selectionArgs String[] 如果你在...我们就可以在 onActivityResult回调中拿到结果进行操作了。
MVP是由MVP模式进化而来的,MVP改进了MVC中的控制器过于臃肿的问题。 与MVC一样,MVP将应用程序的数据处理、数据显示和逻辑控制分开,用一种业务逻辑、数据显示和界面相分离的方法组织代码。...二、MVP与MVC的比较(以Android开发为例) MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。...MVP作为一个新的模式,与MVC有一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部;而在MVC中View...MVP解决了MVC问题: 在MVP中,Presenter完全把View与Model进行分离,主要的程序逻辑在Presenter实现。...这个特性非常有用,因为视图的变化总是比模型的变化要频繁。 4、把程序逻辑放在Presenter中,我们就可以脱离用户接口来测试这些逻辑了。
但内存回收并不总是理想的,在一定条件下,为了保证系统的正常运行,会采用更加激进、直接的方式——杀进程。low memory killer(lmk)。 在android 系统中LMK经历了两次演进。...KLMK KLMK在android中存在了很长的时间,其基本原理是基于minfree来控制kill 相关的app的相关测试。...如代码维护,由于KLMK 是android 独有的,因此linuxupstream 并不愿意维护这部分代码,因此内核4.12开始,kernel 中KLMK驱动程序。...PSI+ULMK 在Android10以及以后的版本,android变采用基于PSI 的ULMK PSI 是Facebook搞的一套东西并在2018 年开源。PSI提供了一种评估系统资源压力的方法。...&psi_memory_fops); proc_create("pressure/cpu", 0, NULL,&psi_cpu_fops); psi_init 函数中初始化统计管理结构和更新任务的周期
RatingBar 点击评分栏后,通过Toast显示当前分数 单击按钮获取当前分数并将其显示在TextView上 <RatingBar android:id="@+id/rb_normal...关键是在加载页面时使用onload()加载相应的js脚本。js脚本中定义的一个函数是取出传递的对象,获取其中的数据,并通过for循环以单位行的形式打印出来! 有图片和事实。...当系统创建UI线程时,它将初始化Looper对象并创建与其关联的MessageQueue; 处理程序:用于发送和处理信息。...如果希望处理程序正常工作,则当前线程中必须有Looper对象 Message:处理程序接收并处理的消息对象 MessageQueue:消息队列。先进先出管理邮件。...毕竟,我们的设备不能总是水平的。Android返回的方向值是一个长度为3的flaot数组,包括三个方向的值!
一、获取进程名的常规方法,通过ActivityManager 在多进程的APP中,常常需要知道当前进程是主进程还是后台进程?还是什么进程。...如下代码,是我们常见的一个用法,在进程启动时,根据进程名判断当前进程是哪个进程: public class MyApp extends Application { private static final...最恐怖的是 ActivityManager.getRunningAppProcesses() 有可能调用失败,返回null,也可能 AIDL 调用失败。...在我们开头描述的使用场景中,出现进程名获取失败的情况,将会是非常恐怖。 一旦导致进程中的某些组件没有初始化,整个进程大概率是要gg了。...Application.getProcessName()方法直接返回当前进程名。这不就是我们想要的API吗! 但是这个方法只有在android9【也就是aip28】之后的系统才能调用。
无Root虚拟定位 很多人(包括我自己)可能想当然的认为安卓上的虚拟定位必须依赖于Root权限,其实不然,在非Root的情况下也能实现一定程度上的虚拟定位,那就是借助开发者模式中的模拟位置功能。...开发者模式中提供了模拟位置的接口,能够自己开发一个用于模拟位置的app,只要在Manifest中声明权限"android.permission.ACCESS_MOCK_LOCATION"后,即可在开发者选项...但是由于代码中写死了企业微信的包名,所以只能对企业微信生效,其实现在有LSPosed可以指定模块只对特定的app生效,所以已经没必要用以往的包名限定写法来写xposed插件了。...这边我将其hook的对象包名改成com.tencent.mm即微信,测试后证明了该插件经久不衰,即使时隔多年也依然能对最新版本的微信生效后,我阅读了它的源码,并参考其主要hook逻辑,实现了对应的frida...= function(){ console.log("getLastKnownLocation") var location = Location.
sd卡的权限(实际上我已经配置了),最后才定位到是android10之后不能问题。...附上我最后解决问题的关键代码段: 在AndroidManifest.xml中添加对应的权限 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS...ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 222); 选择弹窗的允许后,...但是Android10之后Google默认不允许随意创建文件夹。这是因为Android10及之后将执行分区存储,只能操作Google规定的自己应用目录下的文件,所以要对之前的应用数据进行迁移。...好在Android10是个过渡期,开发者可以使用下面三种解决方式来暂时忽略分区存储。但是Android11将强制执行分区存储。所以在Android10的时候就先对自己之前的数据做迁移吧。
【前言】 小编负责的地图手表项目,和Google合作,需要尽快完成targetsdk升级的适配测试工作。...veridex工具会扫描APK的整个代码库(包括所有第三方库),并报告发现的所有使用非SDK接口的行为,该工具的扫描结果会列出应用对于三个限制名单中的接口的调用细节。...veridex工具也在不断地更新,它存在以下局限性: 它无法检测到通过JNI 实现的调用。 它只能检测到一部分通过反射实现的调用。 它对非活动代码路径的分析仅限于API 级别的检查。 【4....如果您的应用有多个使用Web View,CookieManager或android.webkit包中的其他API的进程,则当第二个进程调用WebView方法时,您的应用将崩溃。 【6....测试 最新版本,targetSdkVersion升级后,能正常拿到该参数。
前言 今天分享的面试题是: Android在版本迭代中,总会进行很多改动,那么你熟知各版本都改动了什么内容?又要怎么适配呢? Android4.4 发布ART虚拟机,提供选项可以开启。...这应该是个bug,在Android8.0中出现,8.1中被修复。 我们的处理办法就是要么去掉设置方向的代码,要么舍弃透明效果。...--或者在AndroidManifest.xml中配置: android:usesCleartextTraffic="true" --> 移除Apache HTTP 客户端 在6.0中取消了对Apache...Activity 在9.0 中,不能直接非 Activity 环境中(比如Service,Application)启动 Activity,否则会崩溃报错,解决办法就是加上FLAG_ACTIVITY_NEW_TASK...分区存储 Android10中默认开启了分区存储,也就是沙盒模式。
领取专属 10元无门槛券
手把手带您无忧上云