Android Q(Api 29)的新特性

设计方面

全局夜间模式

Android P 系统中,就已经在设置项中提供了一个「黑暗主题」,不过这个主题并非全局,而是仅适用于下拉通知栏的开关面板和文件夹等少部分界面。
在这里插入图片描述
Android Q 开始,Google 开始提供系统级的黑暗模式,大部分预装应用、抽屉、设置菜单和 Google Feed 资讯流等界面和按钮,都会变成以黑色为主色调

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
google声称当操作系统和应用程序处于「夜间模式」下,确实会比全白背景模式更省电,这也和大多数中高端智能手机正在使用的 OLED 屏幕有关。

定位权限变得更重要

在这里插入图片描述
现在应用第一次开启并需要调用定位权限时,系统就会提供了三种选项,分别为「始终允许」、「仅在使用期间打开」和「拒绝」,你也可以直接在设置项中对定位权限进行调整。

目前电量还能坚持多久

在下拉通知栏顶部加入了一项新内容,即剩余续航时间。和电池图标的百分比不同,它会直接告诉你手机还能用多长时间,相当于是将设置项中的「预估使用时长」放到了通知栏上。目前我们系统上面是放在电池电量界面的
在这里插入图片描述

在这里插入图片描述

截图保留刘海屏

在这里插入图片描述

原生支持录屏

在这里插入图片描述

Android Q 将支持桌面模式,类似三星 Dex 和华为的投影模式。它提供类似一个类似于 PC 的体验。

文本显示

默认设置下,系统将禁用自动断字 (hyphenation) 功能;
允许使用多种字体或字体族来创建单个 typeface;
允许应用获取设备所安装的字体列表;
优化部分常用的文本风格 API。
详情可参考:https://www.jianshu.com/p/6b0ac3bd1641

AccessibilityNodeInfo增强

在 Android Q 中,AccessibilityNodeInfo 得到了增强,现在增加了一个新标记,用于指示其是否代表文本输入键的。您可以使用 AccessibilityNodeInfo.isTextEntryKey() 方法来访问此标记。

一些细节和底层变化

a,原生支持 AV1 格式,这是一种新的开源视频解码器,在实现更高压缩比的同时,也能有效提高编码效率;此外它还支持名为 WAP3 和 Enhanced Open 两项新 Wi-Fi 标准,以及 HDR 10+ 标准。

图形接口方面,Android Q 将会继续推行并普及 Vulkan 图形渲染 API,之后还会加入对 ANGLE 抽象层的支持。

b,ART 机制的改进。这个从 Android 4.4 就开始启用的新编译模式大幅提升了 Android 应用的流畅度;而在 Android Q 中,Google 则尝试将部分预先配置好的文件放在云端,以此来进一步优化应用的加载和运行效率。

c,Android Q 还加入了对原生录屏和桌面模式的支持

对于开发者需要关注的修改

a,存储的权限

Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒  沙盒就是应用专属文件夹,并且访问这个文件夹无需权限。谷歌官方推荐应用在沙盒内存储文件的地址为Context.getExternalFilesDir()下的文件夹。

1,访问自己文件:Q中用更精细的媒体特定权限替换并取消了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己沙盒中的文件。
2,访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,如果要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要申请新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。
3,访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用系统的文件选择器应用来选择文件。
4,所以请判断当应用运行在Q平台上时,取消对READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE两个权限的申请。并替换为新的媒体特定权限。
5,开启兼容模式,即不开启Q设备中的存储权限改动
	应用targetSDK<=P。
	应用安装在从 Android P 升级到 Android Q 的设备上。

更详细的说明请参考google文档:https://developer.android.google.cn/preview/privacy/scoped-storage
解决方法:
1,使用旧版的存储模式:

   <manifest ... >
     <!-- This attribute is "false" by default on apps targeting Android Q. -->
     <application android:requestLegacyExternalStorage="true" ... >
       ...
     </application>
   </manifest>

2,文件存到特定目录

File dir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);缺点是这个当前应用的特定目录 如果清楚数据或者删除应用的话文件也就没了 好处是直接用无需申请权限

后台地理位置权限受限

当应用请求位置信息访问时,用户会看到提示框,android 9.0提示允许和拒绝,Android Q添加了在使用期间可以访问,也就是说如果你的应用在后台运行,用户选择使用期间可以访问的话,是无法获取到位置的 需要添加新的权限ACCESS_BACKGROUND_LOCATION或者添加前台服务
<service 
 	android:name=".permission.LocationService"
    android:foregroundServiceType="location"/>

a,targetSdkVersion<Q,没影响,申请权限时系统默认会加上后台位置权限
b,应用变为后台应用90s后开始定位失败(Pixel AndroidQ-beta6)
c,ACCESS_BACKGROUND_LOCATION不能单独申请,需要和ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION一起申请

getDeviceId() 获取不到了

原来的做法:

// 返回:866976045261713; 
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.getDeviceId();
//返回:66J0218B19000977; 
Build.getSerial();

在AndroidQ及以上的系统上运行时:

如targetSdkVersion<Q,返回null或“unknown”;

如targetSdkVersion>=Q,抛异常

推荐方法

    public static String getUUID() {
   
           String serial = null;
           String m_szDevIDShort = "35" +
           Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
   
           Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
   
           Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
   
           Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
   
           Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
   
           Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
   
           Build.USER.length() % 10; //13 位
   
   		try {
   		    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   		        serial = android.os.Build.getSerial();
   		    } else {
   		        serial = Build.SERIAL;
   		    }
   		    //API>=9 使用serial号
   		    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
   		} catch (Exception exception) {
   		    //serial需要一个初始化
   		    serial = "serial"; // 随便一个初始化
   		}
       //使用硬件信息拼凑出来的15位号码
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
 }

禁止后台启动Activity

1,后台启动Activity会被系统忽略,不管targetSdkVersion多少
2,即返回应用有前台服务也不行

方案:

<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT"/>

Intent intent = new Intent(this, ScopedStorageActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
        REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(this, Constants.CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_launcher_foreground)
        .setContentTitle("Incoming call")
        .setContentText("(919) 555-1234")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setCategory(NotificationCompat.CATEGORY_ALARM)
        //设置全屏通知后,发送通知直接启动Activity
        .setFullScreenIntent(pendingIntent, true)
        .build();
NotificationManager manager = getSystemService(NotificationManager.class);
manager.notify(445456, notification);

非 SDK 接口限制

详细说明:https://developer.android.google.cn/distribute/best-practices/develop/restrictions-non-sdk-interfaces

非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=P或target>=Q的设备上被限制使用,当你使用了这些方法后,会报类似于下面这样log的错

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

名单分类:
Light grey list: targetSDK>=P时,警告;

Dark grey list: targetSDK

=p时,不允许调用;
Black list:三方应用不允许调用

共享功能方面的改进

官方文档有很详细的描述和demo:https://developer.android.google.cn/preview/features/sharing
在这里插入图片描述

ZIP 文件实用程序库变更

Android Q 对 java.util.zip 软件包(用于处理 ZIP 文件)中的类做出了以下变更。这些变更会让库的行为在 Android 和使用 java.util.zip 的其他平台之间更加一致。

Inflater
在以前的版本中,如果在调用 end() 之后调用 Inflater 类中的某些方法,这些方法会抛出 IllegalStateException。在 Android Q 中,这些方法会抛出 NullPointerException。

ZipFile
如果所提供的 ZIP 文件不包含任何文件,则 ZipFile 的构造函数(采用的参数类型为 File、int 和 Charset)不再抛出 ZipException。

ZipOutputStream
如果 ZipOutputStream 中的 finish() 方法尝试为不包含任何文件的 ZIP 文件写入输出流,此方法不再抛出 ZipException

启用和禁用Wi-Fi的限制

在Android Q上运行的应用无法启用或停用Wi-Fi。 WifiManager.setWifiEnabled()方法始终返回false。 如果需要,请使用设置面板提示用户启用和禁用Wi-Fi。

访问剪贴板数据

除非您的应用程序是默认输入法编辑器或当前具有焦点的应用程序,否则您的应用程序无法访问剪贴板数据。

影响针对 Android Q API 级别运行的应用的更改

java_sdk_library

java_sdk_library 是Android Q 新提供的一种编译语法 目的是解决多个library之间兼容性的问题 例如系统的和厂商自定已的library 厂商可以通过java_sdk_library 编译自己的library
prebuilt_apis 可以指定编译依赖的android版本

java_sdk_library {
          name: "android.test.mock",

          srcs: ["src/**/*.java"],

          api_packages: [
              "android.test.mock",
          ],

          srcs_lib: "framework",
          srcs_lib_whitelist_dirs: ["core/java"],
          srcs_lib_whitelist_pkgs: ["android"],
          compile_dex: true,
      }
prebuilt_apis {
        name: "sdk",
        api_dirs: [
            "1",
            "2",
              ....
            "28",
            "current",
        ],
    }

Modular system components

android Q 提供了如下的这些系统组件可以通过被单独的 通过googleplay 或者ota升级 不依赖整个android生态
在这里插入图片描述

Hardware abstraction layer (HAL

Android 10 可实现hal的动态关停 例如,如果用户未使用 WLAN,则 WLAN 子系统不应占用内存、耗损电量或使用其他系统资源。早期版本的 Android 中,在 Android 手机启动的整个持续时间内,Android 设备上的 HAL/驱动程序都会保持开启状态
详情可参考:https://source.android.google.cn/devices/architecture/hal/dynamic-lifecycle#automatic-lifecycles

HIDL

Android Q 提供了一中全新的aidl机制 stable aidl
他和aidl的区别在于
1,接口是直接定义在aidl_interfaces文件中的
2,Interfaces can contain only structured data. Parcelables representing the desired types are automatically created based on their AIDL definition and are automatically marshalled and unmarshalled.
3,Stable AIDL是向前兼容的 可以转化aidl to stable aidl

详情参考:https://source.android.google.cn/devices/bootloader/stable-aidl

Display

1,Android Q支持 HDR10, VP9, and HDR10+ 回放

2,优化了Text classification 一种新的文字功能系统 例如通过选中一段http地址 在它弹出的popwindow中显示用浏览器打开 如果选中一段email格式的地址popwindow中显示跳转到email的item

3,支持Zawgyi font 字体的渲染

4,限制隐藏图标
android Q 要求所有app必须在Launcher 有个icon 除非如下几种情况
a,系统app 升级过的也算
b,It’s a managed profile admin (work profile owner).
c,这个app没有申请任何的权限
d,这个app不含有任何的组件例如( activities, content providers, broadcast receivers, and services).

Security features

1.支持面部识别
2,Android Q 使用OEMCrypto API 15
3,信任代理(手表 蓝牙耳机)
Smart Lock基于Android L的被称为信任代理(trust agents)的新特性。引用自相关文档,信任代理是一个”告知系统当前设备所处环境是否被信任“的服务。信任的具体先决条件由信任代理定义。当一个信任代理认为它可以信任当前环境,它会通过回调来告知系统,系统会决定如何去绕过设备的安全配置。当前Android的一个典型的范例是:当处于一个被信任的环境时,系统会授予用户绕过锁屏的能力。在Q中 信任代理不再能够解锁手机而且最多只能让一个手机四个小时之内处于不锁的状态。

Calling and messaging

1,Android Q优化了紧急拨号 在紧急情况下支持 IRadio HAL v1.4的设备可以发起紧急拨号 紧急号码包括报警 火警 救护车等

2,基于eMBMS 未apps提供了一套标准的群通话的api

3,Android Q支持通过蓝牙实现远程SIM卡功能

Doze mode

Android Q 可以在任何状态下enable

APEX file format

新支持的一种文件格式
在这里插入图片描述

system.img独立更新

用户可以从网上下载单独的system.img刷机 且不会有变砖的风险

targetSDK>=23

之前为了省事 不想适配新的权限等问题的app 现在要求必须targetSDK>=23 不然会向用户发出警告 让用户允许运行才能运行 也就是说必须 targetSDK>=23

参考资料:https://developer.android.google.cn/preview

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值