Android 11 来袭,一起来看看怎么适配

这篇具有很好参考价值的文章主要介绍了Android 11 来袭,一起来看看怎么适配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我的公众号程序员徐公,四年中大厂工作经验,回复黑马,领取 Android 学习视频一份,回复徐公666,可以获得我精心整理的简历模板,带你走近大厂。

作者:唯鹿
来源:https://juejin.cn/post/6948211914455384072

android11适配,Android 进阶,android
终于开始了Android 11的适配工作。记录一下,供需要的人参考。

1. 准备工作

老规矩,首先将我们项目中的 targetSdkVersion 改为 30。或者使用兼容性调试工具,后面我会说到。

2. 存储机制更新

Scoped Storage(分区存储)

具体适配方法和去年的Android 10
适配攻略中的没有太大区别。

不过需要注意的是,应用targetSdkVersion >= 30,强制执行分区存储机制。之前在AndroidManifest.xml中添加
android:requestLegacyExternalStorage="true"的适配方式已不起作用。

还有一个变化:Android 11 允许使用除 MediaStore API 之外的 API 通过文件路径直接访问共享存储空间中的媒体文件。其中包括:

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

如果你之前没有适配Android 10,这一点对你来说是个好消息。Android 10在AndroidManifest.xml中添加
android:requestLegacyExternalStorage="true"来适配,Android 11上直接使用File
API访问媒体文件。不得不说,等等党的胜利?

不过,使用原始文件路径直接访问共享存储空间中的媒体文件会重定向到 MediaStore
API,这次重定向会造成性能影响(随机读写慢一倍左右)。而且直接使用原始文件路径,并不会比使用 MediaStore API
有更多优势,因此官方强烈建议直接使用 MediaStore API。

MANAGE_EXTERNAL_STORAGE

当然还有一种简单粗暴的适配方法,获取外部存储管理权限。如果你的应用是手机管家、文件管理器这类需要访问大量文件的app,可以申请MANAGE_EXTERNAL_STORAGE权限,将用户引导至系统设置页面开启。代码如下:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />


public static void checkStorageManagerPermission(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
                !Environment.isExternalStorageManager()) {

        Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

android11适配,Android 进阶,android

需要注意的是即使你有了MANAGE_EXTERNAL_STORAGE权限,也无法访问Android/data/ 目录下的文件。

对于MANAGE_EXTERNAL_STORAGE权限,国内使用应该没有什么影响。但是在Google
Play上需要说明为什么已有的SAFMediaStore不满足你的应用需求,审核通过才允许上架使用。所以一般情况下,我个人不推荐你为了适配简单,直接申请使用MANAGE_EXTERNAL_STORAGE权限。

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

相关api变更及使用推荐郭霖大神的这篇:Android 11新特性,Scoped
Storage又有了新花样。

存储访问框架 (SAF)变更

Android 11对SAF添加以下限制:

  • 使用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT,无法浏览到Android/data/Android/obb/ 目录及其所有子目录。
  • 使用 ACTION_OPEN_DOCUMENT_TREE无法授权访问存储根目录、Download文件夹。

REQUEST_INSTALL_PACKAGES

在8.0的适配中,我们安装apk包之前需要申请“安装未知来源应用”的权限。一般来说首次是跳转到授权页面让用户手动开启,然后返回app进行安装。

在Android 11中当用户开启“安装未知来源应用”的权限,app就会被杀死。该行为与强制分区存储有关,因为持有
REQUEST_INSTALL_PACKAGES 权限的应用可以访问其他应用的Android/obb 目录。

好在用户授予权限之后,虽然app会被杀死,但是 安装页面依然会弹出

目前对于这一变更我没有发现可以适配处理的方式,详细介绍见:Android
11特性调整:安装外部来源应用需要重启APP


这里补充一下,因为其他应用无法访问应用的Android/data/
Android/obb/目录及其所有子目录。所以需要注意保存在这里面的文件是否会被其他程序访问。

比如我在用系统的裁切功能时,因为设置的MediaStore.EXTRA_OUTPUT文件是私有目录下的,导致裁剪后的图片无法正确生成。所以需要针对android
11进行适配:

String fileName = System.currentTimeMillis() + ".jpg";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // 裁剪无法访问App的私有目录,所以可以保存至公有目录
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Crop");
    Uri uri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
} else {
    ...
}

或者保存至Android/media共享文件目录,这样不用适配版本。

String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(this.getExternalMediaDirs()[0].getAbsolutePath() + File.separator + fileName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

当然如果你是自己实现的裁剪功能,那么不受影响。

3.权限变化

单次权限授权

从 Android 11
开始,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包含仅限这一次选项。如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。

android11适配,Android 进阶,android

单次权限授权的应用可以在一段时间内访问相关数据,具体时间取决于应用的行为和用户的操作:

  • 当应用的 Activity 可见时,应用可以访问相关数据。
  • 如果用户将应用转为后台运行,应用可以在短时间内继续访问相关数据。
  • 如果您在 Activity 可见时启动了一项前台服务,并且用户随后将您的应用转到后台,那么您的应用可以继续访问相关数据,直到该前台服务停止。
  • 如果用户撤消单次授权(例如在系统设置中撤消),无论您是否启动了前台服务,应用都无法访问相关数据。与任何权限一样,如果用户撤消了应用的单次授权,应用进程就会终止。

当用户下次打开应用并且应用中的某项功能请求访问位置信息、麦克风或摄像头时,系统会再次提示用户授予权限。

如果你之前就是使用权限时才请求相关权限,那么这一变更对于你的应用没有影响。

请求位置权限

这部分在Android 10的适配有过调整,当时规则如下:

请求ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION权限表示在前台时拥有访问设备位置信息的权限。在请求弹框中,选择“始终允许”表示前后台都可以获取位置信息,选择“仅在应用使用过程中允许”只表示拥有前台的权限。

在Android 11中,请求弹框中取消了“始终允许”这一选项。也就是说 默认不会授予你后台访问设备位置信息的权限
。如果尝试请求ACCESS_BACKGROUND_LOCATION权限的同时请求任何其他权限,系统会抛出异常,不会向应用授予其中的任一权限。

官方给出的适配建议及原因如下:

建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好地了解应用中的哪些功能需要后台位置信息访问权限。

总结一下得出两点:

  • 先请求前台位置信息访问权限,再请求后台位置信息访问权限。
  • 单独请求后台位置信息访问权限,不要与其他权限一同请求。

这里还需要注意不同目标平台应用在Android 11上的表现:

  • Android 10 为目标平台的应用 允许同时访问前后台的位置信息权限,但同样不会有“始终允许”这一选项。
  1. 没有前后台的位置信息权限时:

android11适配,Android 进阶,android

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

android11适配,Android 进阶,android

  • Android 11 为目标平台的应用
  1. 没有前后台的位置信息权限时,只能先请求前台的位置信息权限:

android11适配,Android 进阶,android

  1. 有前台的位置信息权限,请求后台的位置信息时系统会跳转到下面的设置页面。

android11适配,Android 进阶,android
选择“始终允许”表示具有前后台位置信息访问权限,如果用户拒绝两次应用定位访问请求(直接返回等),后面请求相同权限都会被直接提示请求失败。(这里就需要我们给用户以引导了)

这里解释一下“拒绝两次”,这是Android 11
上添加的权限对话框的可见性,以前我们点击了“不再询问”表示拒绝授权。现在还包含类似上面这种转到系统设置,然后点返回按钮,也算是拒绝授权。当然,用户按返回按钮关闭权限对话框,此操作不算。

总结一下,与Android 10的区别就是将后台权限的申请分离了出来,增加了用户“拒绝”的条件,避免了应用重复请求用户已拒绝的权限。

软件包可见性

软件包可见性是Android
11上提升系统隐私安全性的一个新特性。它的作用是限制app随意获取其他app的信息和安装状态。避免病毒软件、间谍软件利用,引发网络钓鱼、用户安装信息泄露等安全事件。

获取自动可见应用的列表,可以执行命令adb shell dumpsys package queries,找到 forceQueryable
部分。下面是在vivo iqoo手机的执行结果。

Queries:
  system apps queryable: 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.wapicertmanage,com.vivo.vms,co
m.android.providers.settings,com.vivo.upslide,com.vivo.assistant,com.vivo.vivokaraoke,com.vivo.fingerprintui,com.android.wallpaperbackup,com.bbk.facewake,com.vivo.faceunlock,com.vivo.doubleinstance,com.vivo.audiofx,com.iqoo.powersav
ing,com.bbk.SuperPowerSave,com.vivo.vibrator4d,com.vivo.smartunlock,com.vivo.globalanimation,com.vivo.appfilter,com.vivo.voicewakeup,com.vivo.minscreen,com.android.bbklog,com.mobile.cos.iroaming,com.vivo.networkstate,com.vivo.daemon
Service,com.vivo.smartshot,com.vivo.vtouch,com.android.networkstack.tethering.inprocess,com.android.localtransport,com.vivo.pem,com.vivo.wifiengineermode,com.android.server.telecom,com.vivo.gamecube,com.vivo.aiengine,com.vivo.multin
lp,com.vivo.smartmultiwindow,com.vivo.permissionmanager,com.qti.diagservices,com.vivo.bsptest,com.qti.snapdragon.qdcm_ff,com.vivo.dr,com.vivo.sps,com.android.dynsystem,com.vivo.setupwizard,com.vivo.gamewatch,com.android.keychain,com
.vivo.faceui,com.android.networkstack.inprocess,com.android.location.fused,com.android.inputdevices,com.android.settings,com.iqoo.engineermode,com.vivo.fuelsummary]
    [com.qualcomm.uimremoteserver,com.vivo.devicereg,com.qti.qualcomm.deviceinfo,com.volte.config,com.android.mms.service,com.android.ons,com.qualcomm.qcrilmsgtunnel,com.vivo.sim.contacts,com.qualcomm.qti.uimGbaApp,com.qualcomm.qti.
modemtestmode,com.android.stk,com.android.vendors.bridge.softsim,com.qualcomm.uimremoteclient,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,com.qti.dpmserviceapp,com.android.incallui]
    [com.android.vivo.tws.vivotws,com.android.bluetooth]
    com.android.nfc
    com.android.se
    com.android.networkstack.permissionconfig
    com.android.shell
    com.android.providers.media.module
    com.android.wifi.resources.overlay.common
    com.android.theme.icon_pack.filled.themepicker
    com.android.theme.icon_pack.circular.themepicker
    com.android.server.telecom.overlay.common
......

可以看到都是系统应用包名,所以我们的三方应用默认是不可见的。此项变更影响比较多的是分享支付一类需要与其他应用交互的功能。下面举一个简单的例子:

private static boolean hasActivity(Context context, Intent intent) {
    PackageManager packageManager = context.getPackageManager();
    return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
}

public void test() {
    Intent intent = new Intent();
    intent.setClassName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
	Log.d("hasActivity:", hasActivity(this, intent) + "");
}

hasActivity方法中通过queryIntentActivities来判断此页面是否存在。但是在targetSdkVersion >= 30中,这些三方默认都是不可见的。所以都会返回false。类似方法getInstalledPackagesgetPackageInfo也受到相应的限制。

解决方法很简单,在AndroidManifest.xml 中添加queries元素,里面添加需要可见的应用包名。

<manifest package="com.example.app">
    <queries>
        <package android:name="com.tencent.mm" /> <- 指定微信包名
    </queries>
    ...
</manifest>

我在适配中用到的还有下面的包名,我们可以按需添加:

<queries>
    <!-- 微博 -->
    <package android:name="com.sina.weibo" />
    <!-- QQ -->
    <package android:name="com.tencent.mobileqq" />
    <!-- 支付宝 -->
    <package android:name="com.eg.android.AlipayGphone" /> 
    <!-- AlipayHK -->
    <package android:name="hk.alipay.wallet" />
</queries>

除了直接添加包名的方式外,我们可以按intent和provider来添加:

<manifest package="com.example.app">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>

		<provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

具体的规则参见:管理软件包可见性

当然,还有一种简单粗暴的方式,可以直接申请权限QUERY_ALL_PACKAGES。如果你的应用需要上架Google Play,那么可能要注意相关政策。为了尊重用户隐私,建议我们的应用按正常工作所需的最小软件包可见性来适配。

有一点需要说明一下,我们日常使用的startActivity
方法不受系统软件包可见性行为的影响,即使hasActivity为false,一样可以跳转。如果我们在做跳转前,进行类似hasActivity的判断,那么会受影响。

最后需要注意的是 ,使用queries元素需要Android Gradle 插件版本是 4.1及以上
,因为旧版本的插件并不兼容此元素,出现合并 manifest 的错误。

前台服务类型

Android 10中,在前台服务访问位置信息,需要在对应的service中添加 location 服务类型。

同样的,Android 11中,在前台服务访问摄像头或麦克风,需要在对应的service中添加cameramicrophone 服务类型。

<manifest>
    ...
   <service 
       android:name="MyService"
       android:foregroundServiceType="microphone|camera" />
</manifest>

这一限制的变更,使得程序无法在后台启动服务访问摄像头和麦克风。如需使用,只能是前台开启前台服务。除非有如下情况:

  • 服务由系统组件启动。
  • 服务是通过应用小部件启动。
  • 服务是通过与通知交互启动的。
  • 服务是PendingIntent启动的,它是从另一个可见的应用程序发送过来的。
  • 服务由一个应用程序启动,该应用是一个DPC,且在设备所有者模式下运行。
  • 服务由一个提供VoiceInteractionService的应用启动。
  • 服务由一个具有START_ACTIVITIES_FROM_BACKGROUND权限的应用启动。

权限自动重置

如果应用以 Android 11 或更高版本为目标平台并且数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。如下图所示:

android11适配,Android 进阶,android

注意上图中有一个启动自动重置的开关。如果我们的应用有特殊需要,可以引导用户关闭它。示例代码如下:

public void checkAutoRevokePermission(Context context) {
	// 判断是否开启
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
            !context.getPackageManager().isAutoRevokeWhitelisted()) {
        // 跳转设置页    
        Intent intent = new Intent(Intent.ACTION_AUTO_REVOKE_PERMISSIONS);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.fromParts("package", context.getPackageName(), null));
        context.startActivity(intent);
    }
}

SYSTEM_ALERT_WINDOW权限

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

在 Android 11 中,系统会根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限:

  • 系统会自动向具有 ROLE_CALL_SCREENING 且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING,就会失去该权限。
  • 系统会自动向通过 MediaProjection 截取屏幕且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限,除非用户已明确拒绝向应用授予该权限。当应用停止截取屏幕时,就会失去该权限。此用例主要用于游戏直播应用。

这些应用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDOW
权限,它们只需直接请求 SYSTEM_ALERT_WINDOW 即可。

MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至系统权限屏幕

从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION intent
始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW 权限。intent 中的任何 package:
数据都会被忽略。

在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION intent
可以指定一个软件包,它会将用户转至应用专用屏幕以管理权限。从 Android 11
开始将不再支持此功能,而是必须由用户先选择要授予或撤消哪些应用的权限。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。

读取手机号

如果你是通过TelecomManagergetLine1Number方法,或TelephonyManagergetMsisdn方法获取电话号码。那么在Android
11中需要增加READ_PHONE_NUMBERS权限。使用其他方法不受限。

<manifest>
    <!-- 如果应用仅在 Android 10及更低版本中使用该权限,可以添加 maxSdkVersion="29" -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

4.其他行为变更

自定义view的Toast

Android 11 为目标平台的应用,从后台发送自定义view的Toast消息系统会进行屏蔽。 前台使用不受影响
Toast相应的setViewgetView也已经废弃不建议使用。

如果要在后台使用,推荐使用默认的toast或Snackbar替代。

APK签名

Android 11 为目标平台的应用,仅通过v1 签名的应用无法在Android 11的设备上安装或更新。必须使用v2或更高版本进行签名。

同时Android 11 添加了对 APK 签名方案
v4 的支持。

AsyncTask

AsyncTask在Android 11已经不建议使用,建议迁移至kotlin的协程。

此外Handler未指定Looper的构造方法也已不建议使用。
android11适配,Android 进阶,android

建议明确指定Looper

private Handler handler = new Handler(Looper.myLooper());
// 或
private Handler handler = new Handler(Looper.getMainLooper());

状态栏高度

发现系统为Android 11的手机上targetSdkVersion
是30时获取状态栏高度为0,低于30获取值正常。。。因此需要使用WindowMetrics 适配一下:

public static int getStatusBarHeight(Context context) {

 	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
        WindowInsets windowInsets = windowMetrics.getWindowInsets();
        Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());
        return insets.top;
    }       
	
	....
}

WindowMetrics是Android
11新增的类,用于获取窗口边界,同样可以用来获取导航栏高度。

5.新增工具

兼容性调试工具

以往我们做适配的时候,需要先将我们项目中的 targetSdkVersion
修改为对应版本。这就导致你适配过程中有可能受到其他变更的影响,而这个新增的兼容性调试工具可以让你在不升级targetSdkVersion的情况下,针对每项变更逐个开启适配。

使用方法:

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

android11适配,Android 进阶,android
上面第一行DEFAULT_SCOPED_STORAGE就是启用分区储存,这些常量详细的含义见:Android 11
变更列表。

对于兼容性调试工具详细的使用方法见:兼容性框架工具,这里限于篇幅就不展开说了。

无线调试

Android 11的开发者选项中添加了一个无线调试的功能。类似于连接蓝牙耳机功能,可以无需USB连接线进行日常开发调试工作。(区别于以前的Android
WIFI ADB,这个是真无线,哈哈)

android11适配,Android 进阶,android

使用方法:

  • 开发者选项中找到无线调试并打开。
  • 首次配对需点击“使用配对码配对设备”
  • 运行 adb pair ipaddr:port后输入配对码进行连接。

注意事项:

  • 保持电脑和手机在一个网络。
  • Platform Tools 版本需大于30.0。可使用adb --version查看。

android11适配,Android 进阶,android

不过我自己体验下来,感觉连接不是很稳定,不知是AS的问题还是手机问题。同时锁屏后也会断开连接,体验不是很好。。。期待后续的优化吧。


本篇内容有点多。总结一下,Android
11在权限上的变更比较多,但如果你一直遵守申请权限相关的最佳做法,那么基本上不需要额外的适配工作。

最后强调一下,对于 单次授权,权限对话框的可见性,SYSTEM_ALERT_WINDOW 权限,安装apk 这些变更只要在Android
11上就会生效,不论你是否适配Android
11。对于其他变更和API(相机、5G、瀑布屏、键盘等),因为我暂时没有遇到,也就没有列出,有需要的可以点击文末的官方文档链接查看。

截止发这篇博客时,我手机上只发现哔哩哔哩已经适配了Android 11。大多数停留在28、29,更有甚者还在26(Android 8.0
国内上架的最低适配标准)。

所以我顺便附上之前写的Android 9、10的适配攻略:

  • Android 9.0 适配指南
  • Android 10 适配攻略

android11适配,Android 进阶,android

可能本篇你暂时也用不上,你可以不用,但是不能没有。点赞收藏一波不过分吧~~

参考

  • Android 11官方文档
  • Android 11 中的存储机制更新
  • 微信开发平台 - Android 11 系统策略更新
  • OPPO - Android 11 应用兼容性适配指导

如果觉得对你有所帮助的话,可以关注我的微信公众号程序员徐公

  1. 公众号程序员徐公回复黑马,获取 Android 学习视频
  2. 公众号程序员徐公回复徐公666,获取简历模板,教你如何优化简历,走进大厂
  3. 公众号程序员徐公回复面试,可以获得面试常见算法,剑指 offer 题解
  4. 公众号程序员徐公回复马士兵,可以获得马士兵学习视频一份

android11适配,Android 进阶,android文章来源地址https://www.toymoban.com/news/detail-722871.html

到了这里,关于Android 11 来袭,一起来看看怎么适配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568-android11-适配ov13850摄像头

    参考链接 相关概念 相关接口 相关协议 图像格式

    2024年02月09日
    浏览(54)
  • Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11

    Android上进行文件选择或操作的第三方库,自动申请存储权限,支持 Android4.4 ~ 13,再也不用为了适配各种版本而苦恼了,快速集成,一句代码搞定,完善的文档,支持无root权限访问和操作Android/data和Android/obb目录(适配Android 13),支持SD卡,高度自定义UI满足你的所有需求,使用非常

    2024年02月04日
    浏览(28)
  • 基于RK3399 Android11适配OV13850 MIPI摄像头

      从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤MCLK使用的是GPIO3_B7 ⑥需要保证红色框框的供电电源正常。   结合RK提供的文档,如下摄像头数据采集拓扑图所示,我们

    2024年03月14日
    浏览(36)
  • 20230313用友善之臂的Android11跑起来ROC-RK3399-PC(U-boot)

    20230313用友善之臂的Android11跑起来ROC-RK3399-PC 2023/3/13 12:30 SDK:友善之臂的Android11:rk3399-android-11-r20211216.tar.xz https://pan.baidu.com/share/init?surl=XL6x7CGzG03zR238TcBSAA 提取码:1234 【小知识】:ROC-RK3399-PC开发板,TYPE-C0接电脑一般就可以用了! 如果【用鼠标】经常出现莫名其妙的死机,请

    2024年02月08日
    浏览(28)
  • RK3288 Android11 RTL8723DS WiFi 和 蓝牙Bluetooth 适配

      瑞芯微RK系列对“REALTEK瑞昱公司”的wifi、蓝牙双模的模组都有内置适配的,因此HAL层、Framework层、协议栈及库文件都不需要移植适配,只需修改设备树和一些配置文件即可。 补充: RTL8723DS时钟输入源讲解   RTL8723DS模组的第24号引脚是模组的时钟输入源,需要给此提供

    2024年02月07日
    浏览(55)
  • Android强行进阶:为何大厂APP如微信、支付宝、淘宝、手Q等只适配了armeabi-v7a-armeabi?,看这一篇就够了

    // 适配指定CPU架构 ndk { abiFilters ‘arm64-v8a’, ‘x86_64’ } } } 效果如下: 可以看到,只生成了我们指定CPU架构的so文件,包的大小也减少了 5.3MB 。 这时候,你可能会有一个疑问,Android 共支持7种CPU架构,那么,我们在实际项目中该适配哪些CPU架构能保证最好的兼容,同时又最

    2024年04月17日
    浏览(57)
  • Android OpenCV(七十五): 看看刚”转正“的条形码识别

    2021年,我们写过一篇《OpenCV 条码识别 Android 平台实践》,当时的条形码识别模块位于 opencv_contrib 仓库,但是 OpenCV 4.8.0 版本开始, 条形码识别模块已移动到 OpenCV 主仓库,至此我们无需自行编译即可轻松地调用条形码识别能力。 Bar code detector and decoder moved from Contrib to main re

    2024年02月12日
    浏览(26)
  • android 布局 横屏 android横屏适配

    一、刘海屏适配 1、layoutInDisplayCutoutMode属性 Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 这是一种默认的属性,在不进行明确指定的情况下,系统会自动使用这种属性。这种属性允许应用程

    2024年02月09日
    浏览(28)
  • 快一起来看看如何把音频转化为文字吧

    有没有小伙伴经常遇到过在重要会议或者采访的过程中因对方讲话速度过快,而导致自己会议记录或者采访记录跟不上的情况呢。其实我们可以在这个过程中先把内容进行录音,然后再将其转换成文字,这样子的话就不会出现遗漏一些内容的情况。那么小伙伴们知道如何把音

    2024年02月16日
    浏览(49)
  • android8、android13自适应图标适配

    前言:为了解决应用图标在不同android手机上的外观样式问题,google官方在android8和android13两个版本做了变更(这2个版本都提供了向下兼容),下文介绍适配方法以及 注意事项(此处有彩蛋) 。 一、android8(API27)适配 1、找到资源文件夹:mipmap-anydpi-v26(若旧的as里没有默认生成,

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包