Android 11 改变及适配攻略
总算开始了Android 11的适配作业。记载一下,供需求的人参看。

1. 预备作业

老规矩,首要将咱们项目中的 targetSdkVersion 改为 30。或许运用兼容性调试东西,后边shelly我会提到。

2. 存储机制更新

Scoped Storage(分区存储)

详细适配办法和上一年shell指令的Android 10 适配攻略中的没有太大差异。

不过需求留神的是,运用targetSdkVersion >= 30,强制实施分区存储机制。之前在AndroidMaShellnifest.xml中增加 android:requestLegacyExternalStorage="true"的适配办法已不起效果。

还有一个改变:Androshell脚本编程100例id 11 容许运安全期用除 MediaSto软件商铺装置re API安全 之外的 API 经过文件途径直接拜访同享存储空间中的媒体文件。其间包括:

  • File API。
  • 原生库,例如 fopen()

假定你之前没有适配Android 10,这一点对你来说是个好音讯。Androshell脚本编程100例id 10在AndroidManifandroid平板电脑价格est.xml中增加 android:requestLegacyExternalStorage="true软件开发"来适配,Android 11上直接运用File API拜访媒体文件。不得不说,等等党的成功?

不过,运用原始文件途径直接拜访同享存储空间中的媒体文件会重定向到 MediaStore API,这次appreciate重定向会构成功用影响(随机读写慢一倍左右)。而且直接运用原始文件途径,并不会比运用 MediaStore API 有更多优势,因而官方强烈主张直接运用 MediaStore API。

MANA安全期计算器GE_EXTERNAL_STORAGE

当然还有一种简略粗暴的适配办法,获取外部存储办理权限。假定你的运用是手机管家、文件办理器这类需求拜访大量文件的app,能够央求MANAGE_EXTshell脚本编程100例ERNAL_STORAGE权限,软件技术专业将用户引导至体系设置页面翻开。代码如下:安全出产法

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScshellyopedStorage" />
public stshelly-lanatic void checkStorageManagerPermission(Con软件技术专业text context) {
if (Build.VERSION.SDK_INT >= Build.VEandroid手机RSION_CODES.R &&
!Enandroid是什么手机牌子vironment.isExternalStorageManage软件开发r()) {
Intent intent = new Intent(Setandroid体系tings.ACTION_M安全教育ANAGE_ALL_FILES_ACCE安全教育SS_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TappleASK);
coandroid下载ntext.startActishellfishvity(intent);
}
}

Android 11 改变及适配攻略

需求留神的是安全手抄报即便你有了MANAGE_EXTERNAL_STORAGE权限,也无法拜访Android/daappearta/ 目录下的文件。

关于MANAGE_EXTERNAL_STORAGE权限,国内运用应该没有什么影响。可是在Google Play上需求说明为什么已有安全手抄报SAFMediaStore不满足你shelly-lan的运用需求,android什么意思审核经过才容许上架运用。所以一般状况下,我个人不推荐你为了适配简略,直接央求运用MANAGE_EXTERNAL_STORAGE权限。

其他细节改动见文档:Android 11 中的存储机制更新。

相关api改动及运用推荐郭霖大android平板电脑价格神的这篇:Android 11新特性,Scoped Storage又有了新花样。

存储拜访结构 (SA软件商铺F)改动

Android安全期计算器 11对SAF增加以下束缚:

  • 运用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUME软件商铺装置NT,无法阅读到Aandroid体系ndroid/dappearata/Android/obb/ 目录app装置下载及其悉数子目录。
  • 运用 ACTION_OPEN_DOCUMENT_TREE无法授权拜访存储根目录、Download文件夹。

REQUEST_INSTALL_PAC安全KAGES

在8.0的适配中,咱们设备apk包之前需求央求“设备不知道来历运用”的权限。一般来说初次是跳转到授权页面让用户手动翻开,然后回来app进行设备。

在Android 11中当用户打shell什么意思开“设备不知道来历运用”的权限,app就会被安全教育渠道登录进口杀死。该行为与强制分区存储有关,由于持有 REQUEST_INSTALL_PACKAGES 权限的运用能够拜访其他运用的Android/obb 目录。

好在用户公布权限之后,尽管app会被杀死,可是设备页面仍然会弹出

现在关于Android这一改动我没有发现能够适配处理的办法,详细介绍见:Android 11特性调整:设备外部来历运用需求重启APP

3.权限改变

单次权限授权

从 Android 11 开始,每当运用央求与方位信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包括仅限这一次选项。假定用户在对话框中挑选此选项,体系会向运用公布暂时的单次授权。APP

Android 11 改变及适配攻略

单次权限授权的运用能够在一段时间内拜访相关数据,详细时间取决于运用的行为和用户的android体系操作:

  • 当运用的 Activity 可见时,运用能够拜访相关数据。
  • 假定用户将运用转为后台作业,运用能够在短时间内继Shell续拜访相关数据android手机
  • 假定您在 Activity 可见时主张了一项前台服务,而且用户随后将您的运appointment用转到后台,那么您的运用能够继续appointment拜访相关数据shelly-lan,直到该前台服务中止。
  • 假定用户撤消单次授权(例如在体系设置中撤消),不管您是否主张了前台服务,运用都无法拜访相关数据。与任何权限相同,假定用户撤消了运用的单次授权,运用进程就会安全中止。shellfish

当用户下次翻shell指令开运用而且运用中的某项功用央求拜访方位信息、麦克风或摄像头时,体系会再次提示用户公布权限。

假定你之前就是运用权限时才央求相关权限android下载装置,那么这一改动关于你的运用没有影application响。

软件工程求方位权限

这部分在Androi软件商铺装置d 10的适配有过调整,其时规则如下:

央求ACCESS_FINE_LOCATIONACCESS_安全教育渠道登录进口COARSE_LOCATION权限标明在前台时具有拜访设备方位信息的权限。在央求弹框中,挑选“一向容许”标明前后台都能够获取方位信息,挑选“仅在运用运用进程中容许”只标明具有前台的权限。

在Android 11中,央求弹框中取消了“一向容许”这appstore一选项。也就是说默许不会公布你后台拜访设备方位信息的权限。假定检验央求ACCESS_BACKGROUND_LOCATION权限的一同央求任何其他软件测验权限,体系会抛出失常,不会向运用公布其间的任一权限。

官方给出的适配主张及原因如下:

主张运用对方位权appstore限实施递加央求软件库,先央求前台方位信息拜访权限软件工程,再央求后台方位信息拜访权限。实施递加软件测验央求能够为用户供给更大的Shell控制权和透明度,由于他们能够更好地了解运用中的哪些功用需求后安全出产法台方位信息拜访权限。

总结一下得出appearance两点:

  • 先央求前台方位信息拜访权限,再央求后台方位安全出产法信息拜访权限。
  • 单独央求后台方位信息拜访权限,不要与其他权限一同央求。

这儿还需求留神不同方针途径运用在Androidandroid什么意思 11上的表现:

  • Android 10 为方针途径的运用
    容许一同拜访前后台的方位信息权限,但相同不会有“一向容许”这一选项。
  1. 没有前后台的方位信息权限时:

Android 11 改变及适配攻略

  1. 有前台的方位信息权限时:

Android 11 改变及适配攻略

  • Android 11 为方针途径的运用
  1. 没有前后台的方位信息权限时,只能先央求前台的方位信息权限:

Android 11 改变及适配攻略

  1. 有前台的方位信息安全期计算器权限,央求后台的方位信息时体系会跳转到下面的设置页面。

Android 11 改变及适配攻略
挑选“一向容许”标明具有前后台方位信息拜访权限,假定用户回绝两次运用定位拜访android/yunos央求(直接回来等),后边央求相同权限都会被直接提示央求失利。(这儿就需APP求咱们给用户以引导了)

这儿解释一下“回绝两次”,这是Android 11 上增加的权限对话框的可见性,从前咱们点击app装置下载了“不再问询”标明回绝授权。现在还包括相似上面这种转到体系设置,然后点回来按钮,也算是回绝授权。当然,用户按安全期是哪几天回来按钮封闭权限对话框,Shell此操作不算。

总结一下,与Android 10的差异就软件技术专业是将后台权限的央求分离了出来,增加了用户“回绝”的条件,避免了运用重复央求用户已回绝安全教育渠道的权限。

软件包可见性

软件包可见性是Android 11上提高体系隐私安全性的一个新特性。它的效果android下载装置是束缚app随意获取其他app的信息和设备状况。避免病毒软件、间谍软件利用,引发网络垂钓、用户设备信息走漏等安全事情。android下载装置

获取主动可见运用的列表,能够实施指令adb shell dumpsys package queries,找到 forceQueryable 部分。下面是在vivo iqoo手机的实施效果。

Queries:
system apps quer软件工程yable: false
forceQueryable:
[com.android.BBKCrontab,com.vivo.fingerprint,com.vivo.epm,com.vivo.abe,com.vivo.fingerprintengineer,com.vivo.contentcatcher,com.vivo.floatingball,com.vivo.agent,com.vivo.nightpearl,android,com.wapi.wapicertmanag软件开发e,com.vivandroid是什么手机牌子o.vms,co
m.android.providers.sett软件技术是学什么ings,com.vivo.upslide,com.vivo.assistant,com软件.vivo.vivokaraoke,com.vivo.fingerprintui,com.android.wallpaperbackup,cappstoreom.bbk安全手抄报.facewak安全教育e,com.vivo.faceunlock,approachcom.vivo.doubleinstance,appearcom.vivo.audiofx,com.iqoo.powersandroid下载av
ing,com.bbk.SuperPowerSave,com.vivo.vibrator4d,com.vivo.smartunlock软件开发,com.vivo.globalanimation,com.vivo.appfilter,com.vivo.voicappearanceewakeup,com.vivo.minscreen,com.android.bbappreciateklog,com.mobile安全期.coapp装置下载s.iroaming,com.vivo.networkstaandroid什么意思te,com.vivo.daemon
Service,com.vivo.smartshot,com.vivo.vtouch,cAndroidom.android.networkstac软件库k.tethering.inprocess,com.android.localtranspoappstorert,com.vivo.pem,com.vivo.wifiengineermode,com.android.server.telecom,com.vivo.gamecube,com.viapproachvo.aienshell脚本编程100例gine,c软件工程om.vivo.multin
lp,com.vivo.smartmultiwin软件商铺dow,com.vivo.permissionmanager,com.qti.diagservices,com.vivo.bsptest,com.qti.sna安全pdragon.qdcm_ff,com.vivo.dr,com.vivo.sps,candroid是什么手机牌子om.android.dynsystem,com.vivo.setupwizard,com.vivo.gamewatch,com.android.安全教育渠道登录进口keychaishell脚本根本指令n,com
.vivo.faceui,com.android.networkstack.inprocess,com.androishell指令d.location.fused,com.android.inputdevices,com.android.settings,com.iqoo.engineermode,com.vivo.fuelsummarandroid是什么手机牌子y]
[com.qualcomm.uimremoteserver,com.vivo.devicereg,com.qti.qualandroid手机comm.deviceinfo,com.volte.config,com.android.mapplems.service,com.android.ons,com.qualcomm.qcrilmsgtunnel,com.vivo.sim.contacandroid什么意思ts,com软件商铺.qualcomm.qti.uimGbaApp,comshell脚本编程100例.qualcomm.qti.
modemtestmode,coandroid平板电脑价格m.软件技术是学什么androiapproved.stk,com.android.vendors.bridge.sofappstoretsim,com.qualcomm.uiandroidstudio装置教程mremoteclient,com.qti.qualcomm.datastatusnotification,com.qualcomm.qti.uim,com.android.phone,com.qualcomm.qti.dynamicddsservice,com.qualcomm.qti.telepho
nyservice,com.android.cellbroadcastservice,com.android.providers.telephony,appointmentcom.安全教育渠道登录进口qti.dpmserviceapp,com.android.incallappearui]
[com.android.vivo.tws.vivotws,com.android.bluetooth]
com.android.nfc
com.android.se
co软件商铺装置m.android.networkstack.permissionconfig
coandroid手机m.android.shell
com.安全期计算器android.providers.media.module
com.android.wifi.resources.overlay.common
com.android.theme.appleicon_pack.filled.themepicker
comshell什么意思.android.theme.icon_pack.软件技术circular.themepicker
com.android.server.telecom.overlay.candroid/yunosommon
......

能够看到都是体系运用包名,所以咱们的三方运用默许是不行见的。此项改动影响比较多的是共享支付一类需求与其他运用交互的功用。下面举一个简略的比如:


privashell指令te static boolean hasA软件工程ctivity(Contex软件库t context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
return packageManageandroidstudio装置教程r.quer安全期是哪几天yIntentActivities(intent, PackageAndroidManager.MATCH_DEFAULT_ONLY).Shellsize软件测验() > 0;
}
puappreciatebliappstorec void test() {
Intent intent = new Intent();
intent.setClassName("com.tencent.mm", "com.tencent.mm.shell什么意思ui.toandroid的drawable类ols.ShareImgUI");
Log.d("hasActivity:", hasshell是什么意思中文Activity(this, intent) + "");
}

hasActivity办法中经过queryIntentActivities来判别此页面是否存在。可是android下载targetSdkVersion >= 30中,这些三方默许都是不行见的。所以都会android下载装置回来false。相似办法getInstalledPackagesgetPackageInfo也遭到相应的束缚。

解决办法很简略,在AndroidManifest.xml 中增加queries元素,里面增加需求可见的运用包名。

<manifest package="com.example.app">
<queries>
<package软件商铺 android:name="com.tencent.mm" /&gtAndroid; <- 指定微信包名
</queries>
...
</manifest>

我在适配中用到的还有下面的包名,咱们能够按需增加:

<queries>
<!-- 微博 -->
<package android:name="软件工程com.sina.weibo" />
<!-- QQ -->
<package android:name="comappearance.tencent.mobileqq" />
<!-- 支付宝 --&appeargt;
<package android:name="com.eg.android.AlipayGphone" />
<!-- AlipayHK -->
<package androiandroid体系d:name="hk.alipandroid手机ay.wallet" />
</queriesshell脚本编程100例>

除了直接增加包名的办法外,咱们能够按intent和pr软件测验ovider来增加:

<manifest package="com.example.app">
&appearlt;queries>
<intent>
<action andshell指令roid:name="andr安全手抄报oid.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent&shell是什么意思中文gt;
<pro软件技术是学什么vider ashell是什么意思中文ndroid:authorities="com.example.settings.applicationfiles" />
</queries>
...
</manifest>

详细的规则拜见:办理软件包可见性

当然,还有一种简略粗暴的办法,能够android下载直接appreciate央求权限QUERY_ALL_PACKshellfishAGES。假定你的运用需求上架Goappreciateogle Play,那么或许要留神相关方针。为了尊重用户隐私,主张咱们安全的运用按正常作业所需的最小软件包可见性来适配。

有一点需求说明一下,咱们日常运appear用的startActivity 办法不受体系软件测验软件包可见性行为的影响,即便hasActivity为false,相同能够跳转。假定咱们在做跳转前,进行相似hasActiandroid下载vity的判别,那么会受影响。

最终需求留神的是,运用queries元素需求Android Gradle 插件版别是 4.1及以上,由于旧版其他插件并不兼容此元素,出现合并 manifest 的过错。

前台服务类型

Androidshellfish 10中,在前台服务拜访方位信息,需求在对应的service中增加 location 服务类型。

相同的,Android 11中,在前台服务拜访摄像头或麦克风,需求在对应的service中增加cameramicrophone 服务类型。

<manifest>
...
<service
andappleroid:name="MyService"
android:foreandroid体系groundServshell什么意思iceType="micrandroid下载装置ophone|camera"appstore /&gt软件技术是学什么;
</manifest>

这一束缚的appstore改动,使得程序无法在后台主张服务拜访摄像头和麦克风。如需运用,只能是前台翻开前台服务。除非有软件技术是学什么如下状况:

  • 服务由体系组件主张。
  • 服务是经过运用小部件主张。
  • 服务是经过与告知交互主张的。
  • 服务是Pen软件工程专业dingIntent主张的,它是从另一个可见的运用程序发送过来的。
  • 服务由一个运用程序主张,该运用是一个DPC,且在设备悉数者形式下作业。
  • 服务由一个供给VoiceIntera安全期ctionService的运用主张。
  • 服务由一个具有START_ACTIVITIES_FROM_BACKGROUND权限的运用主张。

权限主动重置

假定运用以 Anandroid平板电脑价格droid 11 或更高版别为方针途径而且数月未安全教育运用,体系会经过主动重置用户已公布运用的作业时活络权限来保护用户数据。如shell脚本下图所示:

Android 11 改变及适配攻略

留神上图中有一个主张主动重置的开关。假定咱们的运用有特别需求,能够引导用户封闭它。示例代码如下:

public void checkAutoR安全教育渠道登录进口evokePermission(Context context) {
// 判别是否翻开
if (Build.VERSION.SDK_I安全期计算器NT >= Build.VERSION_CODES.R &&安全期计算器
!context.getPackageManager(android什么意思).isAutoRevokeWhitelisted()) {
// 跳转设置页    
Intent intent = new Intent(Intent.ACTION_AUTO_REVOKE_PERMISSIONS);
int安全期是哪几天ent.addFlagsshell是什么意思中文(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.fromParts("package", context.getPackageName(), null))安全期计算器;
context.startActivity(intentshellfish);
}
}

SYSTEM_ALERT_WINDOW权限

这部分我在适配中没有用到,直接照搬文档:

在 An安全droid 11 中,体系会依据央求主意向某些类型的运用公布 SYSTEM_ALERT_WINDOW 权限:

  • 体系会主意向具有 ROLE_CALL_SCREENING 且央求 SYSTEM_ALERT_WINDOW 的悉数运用公布该权限。假定运用失掉 ROLE安全教育渠道_CALL_SCREENING,就会失掉该权限。

  • 体系会主意向经过 MediaProjection 截取屏幕且央求 SYSTshell脚本根本指令EM_ALERT_WINDOW 的悉数approve运用公布该权限,除非用户已清楚回绝向运用公布该权限。当运用中止截取屏幕时,就会失掉该权限。此用例首要用于游戏直播运用。

这些运用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDandroid下载OW 权限,它们只需直接shell指令央求 SYSTEM_ALERT_WINDOW 即可。

MANAGE_OVERLAY_PERMISSION intent 一向会将用户转至体系权限屏幕

从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION intent 一向会将用户转至顶级设置屏幕,用户可安全在其间公布或撤消运用的 SYST安全教育渠道登录EM_ALERT_WINDOW 权限。intent 中的任何 package: 数据都会被疏忽。

在更低版其他 Android 中,AappearanceCTION_MANAGE_OVERLAY_PERMISSION intent 能够指定一个软件包,它会将用户转至运用android手机专用屏幕以办理权限。从 Android 11 开始将不再支撑此功用,而是有必要由用户先挑选要公布或撤消哪些运用的权限。此改动能够让权限的公布更有目的性,然后达到保护用户的目的。Android

读取手shell指令机号

假定你是经过TelecomManagergetLshellfishine1Number办法,或TelephonyManagergetMsisdapplicationnandroid/yunos法获取电话号码。那么在Android 11中需求增加READ_PHONE_NUMBERS权限。运用其他办法不受限。

<manifest>
<!-- 假定运用仅在 Anappointmentdroid 10及更低版别中运用该权限,能够增加 maxSdkVersiappreciateon="29" -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-pershell什么意思mission android:name="andro软件工程id.permission.READ_PHONE_NUMBERS" /&gt软件测验;
</manifestshell编程>

4.其他行为改动

自定shell什么意思义view的Toast

Android 11 为方针途径的运用,从后台发送自定义view的Toast音讯体系会进行屏蔽。前台运用不受影shell指令Toast相应的setViewgetView也现已扔掉不主张运用。

假定要在后台运用,推荐运用默shell什么意思许的toast或Snackbar替代。

APK签名

Android 11 为政appearance策途径的运用,仅经过v1 签名的运用无法在Android软件测验 11的设备上设备或appear更新。有必要运用v2或更高版别进行签名。

一同Android 11 增加了对 APK 签名方案 v4 的支撑。

AsyncTandroid下载装置ask

As安全期yncTask在Android 11现已不主张运用,主张迁移至kotlin的协approach程。

此外Handler未指定Looper的结构办法也已不主张运用安全手抄报
Android 11 改变及适配攻略

主张清楚指定Looper

private Handler handler = new Handler(Loapplicationoper.myLooper(android是什么手机牌子));
// 或
p软件商铺装置rivate Handler handandroid的drawable类ler = new Handler(Looper.getMainLooper());

5.新增android/yunos东西

兼容性调试东西

以往咱们做适配的时分,需求shell脚本根本指令先将咱们项目中的 targ软件库etSdkVersion 修改为对应版别。这就导致你适配进程中有或许遭到其他改动的影响,而这个新增的兼容性调试东西能够让你在不晋级targetSdkVersion的状况下,针对每项改动逐一翻开适appreciate配。

运用办法:

  • 开发者选项中找到运用兼容性改动选项。
  • 点击进入找到你需求调试的运用
  • 在改动列表中,找到想要翻开或封闭的改动,然后点击相应的开关。

Android 11 改变及适配攻略
上面榜首行DEFAULT_Sandroid平板电脑价格COPED_STORAGE就是启用分区储存,这些常量详细的意义见:Androidappointment 11 改动列表。

关于兼容性调试东西详细的运用办法见:兼容性结构东西,这儿限于篇幅就不打开说了。

无线调试

Android安全期 11的开发者选项中增加了一个无线调试的功用。相似软件测验于联接蓝牙耳机功用,可软件技术以无需USB联接线进行日常开发调试作业。(差异于从前的Android WIFI ADB,这个是真无线,哈哈)

Android 11 改变及适配攻略

运用shell脚本根本指令办法:

  • 开发者选项中找到无线调试并翻开。软件工程专业
  • 初次安全期配对需点击“运用配对码配对设备”
  • 作业 adb pair ipaddr:port后输入配对码进行联接。

留神事项:

  • 坚持电脑和手机在一个网络。
  • Platform Tools 版别需大于30.0。可android体系运用ashell脚本db --version检查。

Android 11 改变及适配攻略

不过我自己领会下来,感觉联接shelly-lan不是很安稳,不知是AS的问题仍是手机问题。一同锁屏apple后也会断开联接,领会不是很好。。。等候apple后续的优化吧。


本篇内容有点多。总结一下,Andappleroid 11在权限上的改动比较多,但假定你一向恪守央求权限相关的最佳做法,那么根本上不需androidstudio装置教程求额定的适配作业。

最终侧重一下,关于单次授权,权限对话框的可见性,SYSTEM_ALERT_WINDOW 权限,设备apkshell什么意思些改动shell脚本根本指令只要在Anandroid的drawable类droid 11上就会收效,不管你是否适配Android 11。关于其他改动和API(相机、5G、软件技术瀑布安全期计算器屏、键android是什么手机牌子盘等),由于我暂时没有遇androidstudio装置教程到,也就没有列出,有需求的能够点击文末的软件工程官方文档链接检查。

shell脚本编程100例止发这篇博客时,我手机上只发现哔哩哔哩现已适配了An安全教育渠道droid 11。大多数停留在28、29,更有甚者还在26(安全出产法Android 8.0 国内上架的最低适配标准)。

所以我趁便附上之前写的Android 9、1软件技术0的适配攻略:

  • Anshell脚本根本指令droid 9.0 适配攻略
  • Android 10 适配攻略

Android 11 改变及适配攻略

或许本篇你暂时也用不上,你能够不必,可是不能没有软件商铺装置。点安全期计算器赞保藏一波不过火shell指令吧~~

参看

  • Android 11官方文档
  • Android 11 中的存储机制更新
  • 微信开发途径 – Android 11 体系战略更新
  • OPPO – Android 11 运用兼容性适配教训