欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android 11 新功能 抢先体验

程序员文章站 2022-03-31 08:22:42
新功能和API应用进程退出原因获取应用近期任何进程终止原因ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List list = activityManager.getHistoricalProcessExitReasons(getPackageName(), 0, 5); Log.d(TAG, "...

新功能和API

应用进程退出原因

获取应用近期任何进程终止原因

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
List<ApplicationExitInfo> list =activityManager.getHistoricalProcessExitReasons(getPackageName(), 0, 5); 
Log.d(TAG, "info size = " + list.size()); 
for (ApplicationExitInfo info : list) { 
    Log.d(TAG, " info " + info.toString() + "code = " + info.getReason());
 }

 

相机

在打开相机设备时可以关闭系统震动、铃声

CameraDevice device; 
device.setCameraAudioRestriction();
 device.getCameraAudioRestriction();
 AUDIO_RESTRICTION_NONE; AUDIO_RESTRICTION_VIBRATION;
 AUDIO_RESTRICTION_VIBRATION_SOUND;

并发使用相机

CameraManager cameraManager; 
Set<Set<String>> cameraIds = cameraManager.getConcurrentCameraIds();
Map<String, SessionConfiguration > cameraIdAndSessionConfig; 
cameraManager.isConcurrentSessionConfigurationSupported(cameraIdAndSessionConfig);

行为变更:所有应用

一、隐私设置

1、强制分区储存:在android 10 中开始使用分区储存,但是可以在配置文件中通过设置requestLegacyExternalStorage  设为  true  以停用分区存储的应用,在 android 11 开始强制使用分区储存。

2、单次授权:每当应用请求与位置信息、麦克风或者相机相关权限时,面向用户的权限对话框会包含仅限这一次选项。如果用户在对话框中选择此选项,系统会向应用授予临时的单次权限,具体时长取决于应用的行为和用户的操作:

a、应用的Activity可见时,应用可以访问相关的数据。

b、如果用户将应用转为后台运行,应用可以在短时间内继续访问相关数据

c、如果您在 Activity 可见时启动了一项前台服务,并且用户随后将您的应用转到后台,那么您的应用可以继续访问相关数据,直到该前台服务停止

d、如果用户撤消单次授权(例如在系统设置中撤消),无论您是否启动了前台服务,应用都无法访问相关数据。与任何权限一样,如果用户撤消了应用的单次授权,应用进程就会终止。

3、自动重置未使用的应用的权限:如果用户数月未使用授予的权限,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。此操作与用户在系统设置中查看权限并将应用的访问权限级别更改为拒绝的做法效果一样。如果应用遵循了有关在运行时请求权限的最佳做法,那么您不必对应用进行任何更改。这是因为,当用户与应用中的功能互动时,您应该会验证相关功能是否具有所需权限。

4、权限对话框的可见性:一再拒绝某项权限表示用户希望“不再询问

5、软件包可见性

Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用 <queries> 元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向您的应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。此外,此元素还可帮助 Google Play 等应用商店评估应用为用户提供的隐私权和安全性。

需要注意的是除了利用<queries>定义需要查询的应用之后,有些类型应用对本应用天然是可见的,这些类型应用包含以下:

a、应用本身

b、系统的一些应用,比如媒体提供者,提供一些基础服务的应用。(使用命令adb shell dumpsys package queries 可以查询)

c、安装本应用的应用。

d、绑定或者开启应用里面的服务的应用。

e、使用应用里面的内容提供者的应用。

f、应用被授予 URI 权限去访问有内容提供者的应用(例如:B 应用有内容提供者, A 应用被授予相应的 URI访问 B应用的内容提供者, 那么B应用对 A应用来说是可见的)

g、接收你是应用输入的应用,例如:输入法。

 

 

功能和API

一:设备控件:Android R 新增加了ControlsProviderService,可用于提供连接外部设备的控件,这些控件显示在电源菜单的设备控制器下。

更新了媒体控件的显示方式。媒体控件显示于快捷设置旁。来自多个应用的会话排列在一个可滑动的轮播界面中,其中包括在手机本地播放的会话流、远程会话流(例如在外部设备上检测到的会话或投射会话)以及可继续播放的以前的会话(按上次播放的顺序排列)。

 

二、用户无需启动相关应用即可在轮播界面中重新开始播放以前的会话。当播放开始后,用户可按常规方式与媒体控件互动。

媒体控制:

 

三、屏幕:

更好地支持瀑布屏

Android 11 提供了一些 API 以支持瀑布屏,这是一种无边框的全面屏。这种显示屏被视为刘海屏的变体。现有的 DisplayCutout.getSafeInset…() 方法现在会返回能够避开瀑布区域以及刘海的安全边衬区。如需在瀑布区域中呈现您的应用内容,请执行以下操作:

 

调用 DisplayCutout.getWaterfallInsets() 以获取瀑布边衬区的精确尺寸。

 

将窗口布局属性 layoutInDisplayCutoutMode 设为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以允许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。您必须确保刘海或瀑布区域中没有重要的内容

 

合页角度传感器和可折叠设备(折叠屏?)

使用 Android 11,可以通过以下方法使运行在采用合页式屏幕配置的设备上的应用能够确定合页角度:提供具有 TYPE_HINGE_ANGLE 的新传感器,以及新的 SensorEvent,后者可以监控合页角度,并提供设备的两部分之间的角度测量值。您可以使用这些原始测量值在用户操作设备时执行精细的动画显示。

 

四、5G

在需要用到网络来上传数据时,通过监听网络的状况来选择合适的数据策略,android 11 中增加了对5G 网络的支持

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(
){
    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        //如果值为 true,则网络视为不按流量计费。
       boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) ||
                networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED);
       
       networkCapabilities.getLinkDownstreamBandwidthKbps();
       networkCapabilities.getLinkUpstreamBandwidthKbps();
    }
});

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new PhoneStateListener(){
    @Override
    public void onDisplayInfoChanged(@NonNull TelephonyDisplayInfo telephonyDisplayInfo) {
        super.onDisplayInfoChanged(telephonyDisplayInfo);
        int type = telephonyDisplayInfo.getNetworkType();
        boolean is5G = type == OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO
                || type == OVERRIDE_NETWORK_TYPE_NR_NSA
                || type == OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE;

    }
}, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED);

通过以上代码可以检测当前网络是否按流量计费、网络的带宽(上行、下行)、以及是否是 5G 网络。

 

本文地址:https://blog.csdn.net/johndon_forever/article/details/109367886

相关标签: android