一、可变的屏幕刷新率
在 Android R 中,增加了对可变屏幕刷新率的支持,为了提高用户的体验和节省电量。
通过 WindowManager API 中添加了新的 API,应用可以查询显示器是否支持可变的刷新率,如果支持,应用可以请求不同的刷新率。例如,如果应用正在播放视频,则可以请求高刷新率,如果应用主要是显示静止内容,可以请求低刷新率。显示器会根据应用的请求调整刷新率,以达到更好的用户体验和能源效率。
Display.Mode mode = display.getMode(); if (mode.getPhysicalRefreshRate() >= 90) { // If refresh rate is sufficiently high, switch to 90Hz refresh rate mode = new Display.Mode(mode.getModeId(), 1080, 2340, 90); display.requestMode(mode); } else { // If refresh rate isn't good enough, switch to 60Hz refresh rate mode = new Display.Mode(mode.getModeId(), 1080, 2340, 60); display.requestMode(mode); }
二、全新的权限管理
在之前的版本中,应用开发者可以在应用安装时就申请所有需要的权限。然而这可能会导致用户被迫授权一些他们不想给予的权限,或者在必要时缺乏对权限的掌控。在 Android R 中,全新的权限管理功能可以授予用户更多的控制权。
如果应用需要使用敏感权限,如访问位置或相机,应用将必须要经过用户授权才能使用这些权限。此外,Android R 引入了“一次性权限”,这是一种一次性的,用完即销毁的权限,使得应用能够获得临时访问适当数据的权限,但接下来不再需要这个权限。
// 申请 ACCESS_FINE_LOCATION 权限 if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 如果没授权,那么就需要申请授权 if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION)) { // 给出提示信息,告诉用户没有这个权限时 APP 不能正常使用 } else { // 否则直接申请授权 ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } }
三、无限的无线连接
在 Android R 中,Google 引入了一种名为“连接感知”的新技术,它可以让 Android 设备更好地管理多种无线连接的同时,提供了更好的连接质量和保障用户隐私。
例如,当你正走在街上,Wi-Fi 信号强度正在不断变化。如果你正在通过这些 Wi-Fi 网络进行数据传输,这可能会导致应用程序的延迟和停顿。 Android R 可以识别这些变化,并在连接更好的 Wi-Fi 网络时自动转换到该连接。
ConnectivityManager cm = getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) .build(); cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { // 在这里处理网络变更的操作,例如:更新 WebView 连接 } });
四、增强的隐私保护
Android R 中增强了隐私保护功能。例如,应用程序现在需要使用一个新的读取外部存储权限,以访问用户外部存储中的文件,这意味着应用程序不能更轻易地访问用户的个人数据。此外,Android R 还支持应用程序访问私有区域中的共享文件。
Android R 还包括一个应用程序许可来限制应用于特定数据的访问。例如,如果一个音频应用需要访问用户电话状态,这不再需要使用 READ_PHONE_STATE 权限,但内部 API 可以通过使用应用程序许可权进行访问。
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_PHONE_STATE)) { // 给出提示信息,告诉用户没有这个权限时音频应用的功能可能会受限 } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); } } else { // 音频应用可以直接访问电话状态 }
五、更好的企业设备管理
企业设备的安全性是个很大的话题,并且在 Android R 中得到了一些重大的改进。Android R 减少了许多攻击点,例如,至少需要设备锁来访问企业资产和 Quick Settings 权限。Android R 也支持针对企业定制的自定义设置、应用列表和网络管理。
Android R 通过增加 Admin API,使得企业可以对设备进行更好的管理。企业管理员可以限制工作个人数据的访问,或在用户退出企业时清空容器,这些都为企业设备管理提供了更多的选择。
private static final String TAG = "PolicyManagerSample"; private DevicePolicyManager mDpm; private ComponentName mProfileOwner; public void createProfile(View view) { Intent intent = new Intent(); intent.setAction(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE); intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, getPackageName()); intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, new ComponentName(this, PolicyManagerReceiver.class)); startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE); } public void enableCameras(View view) { mDpm.setCameraDisabled(mProfileOwner, false); Log.i(TAG, "Cameras enabled"); } public void disableCameras(View view) { mDpm.setCameraDisabled(mProfileOwner, true); Log.i(TAG, "Cameras disabled"); }
总结
Android R 提供了许多新的功能和改进,以满足不断变化的用户需求和进步的技术趋势。其中一些功能包括可变的屏幕刷新率、全新的权限管理、无线连接和隐私保护的增强。企业设备管理方面也得到了很大的改进。开发者和用户都有了更好的体验和保障。