GVKun编程网logo

产品资讯 | mPaaS 完成 iOS 14 和 Android 11 适配

15

在本文中,我们将为您详细介绍产品资讯|mPaaS完成iOS14和Android11适配的相关知识,此外,我们还会提供一些关于AandroidP适配、Android''showAsAction''inp

在本文中,我们将为您详细介绍产品资讯 | mPaaS 完成 iOS 14 和 Android 11 适配的相关知识,此外,我们还会提供一些关于Aandroid P 适配、Android ''showAsAction'' in package ''android''错误解决、Android 10 和Android 11的适配、Android 10还没适配完,Android 11又要出了?的有用信息。

本文目录一览:

产品资讯 | mPaaS 完成 iOS 14 和 Android 11 适配

产品资讯 | mPaaS 完成 iOS 14 和 Android 11 适配

伴随 iOS 14 和 Android 11的正式发布,mPaaS 在 10.1.68 最新基线上已完成适配和测试,具体可扫描下方二维码查看相关说明文档。

  • 适配 iOS 14:https://help.aliyun.com/document_detail/183648.html
  • 适配 Android 11:https://help.aliyun.com/document_detail/184261.html

 

升级相关事项

1. 如果当前已经是 68 基线,需要升级到最新产品集:

  • Android 升级到 10.1.68.14 ;
  • iOS 升级到 10.1.68.17;

2. 使用了 Android 多 cpu 架构基线的用户,请升级到最新适配过 Android 11 的版本 ( cp_change_22487.8 ),

  • 参考文档:https://help.aliyun.com/document_detail/184285.html

3. 如果当前是60及以下版本基线,请先升级到最新68基线版本,再进行适配工作。参考文档:

  • Android:https://help.aliyun.com/document_detail/157018.html
  • iOS:https://help.aliyun.com/document_detail/155876.html

 

重要风险提示

1. 根据苹果应用商店审核规则,自 2020 年 12 月起将不再接受包含 UIWebview 代码的 App 更新或发版申请,使用 60、32 及以下基线版本的 App 届时将无法通过苹果审核;iOS 14 与 Android 11 适配也仅在 68 基线上进行。

  • 参考文档:https://help.aliyun.com/document_detail/155876.html

2. 进行相关升级时,请做好详细回归测试,以保障 App 整体的功能、兼容性与稳定性不受影响。

3. 如有定制部分,请联系售后支持获取新版本解决方案。

 


Aandroid P 适配

Aandroid P 适配

首先附上Android P系统变更:

https://blog.csdn.net/zhangbijun1230/article/details/79920606

 

然后再附上原文地址:

https://blog.csdn.net/baidu_37001358/article/details/82656448

 

因为我这边最直接的感受就是APP无法访问网络,所以适配上只是关注这一点,是否还有其他需要适配的点,我这里不太清楚,只能说是看自己需求了。

我加上了下方的操作之后,亲测mate 20等android 9.0的手机均可以使用正常,9.0以下的也无任何影响。

最后是修改过程:

在api上访问http协议被认为时不安全的所以需要配置: 
1.在res目录下创建xml文件夹,创建network_security_config.xml文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
在AndroidManifest文件中配置 

android:networkSecurityConfig=”@xml/network_security_config” 

Android ''showAsAction'' in package ''android''错误解决

Android ''showAsAction'' in package ''android''错误解决

将工程引入到eclipse里面, 发现这个错误:

No resource identifier found for attribute ''showAsAction'' in package ''android''。

 

解决办法:

删除两个文件values-v11、values-v14

删除了menu文件,因为没用menu。

 

 搞定,具体原因不清楚 不知道为什么这样可以

Android 10 和Android 11的适配

Android 10 和Android 11的适配

背景

最近在项目中着手做Android10Android11 适配时候,期间遇到了不少的坑。之前有专门写过qq、微信分享的适配。但是此次在针对偏业务侧适配工作的时候还是碰到了一些新的问题。记录下来,方便以后查阅,希望能帮到碰到此问题的相关同学。

一、 私有目录下资源访问

存在这样一个场景:我们要分享一张图片到qq或者微信,首先第一步是要是得到这个bitmap(通过本地生成或者网络加载),然后存储到本地sd卡上,最后把存储的图片的绝对路径传给qq或者微信即可。

在以上的场景中,涉及到了这些关键点:

  • 把图片存储到sd卡
  • 把绝对路径path传递给qq或者微信

1.1 直接访问sd卡的根目录

通过FileOutPutStream来完成,在Android10以下都没问题。路径如下:

/storage/emulated/0/demo/sharePicture/1637048769163_share.jpg

但是在Android10及以上,就会存在会报错:

java.io.FileNotFoundException: /storage/emulated/0/demo/sharePicture/1637048769163_share.jpg: open failed: EACCES (Permission denied)
//其实存储权限是同意了的

这是因为,我们被存储分区限制了,不能直接访问外部目录。因此,我们需要修改存储路径为scope的App-specific目录。

1.2 改为App-specific私有目录

该目录自己访问不需要权限,如果第三方访问需要权限! 因此,我们后面通过FileProvider去临时授权即可。 如果对 FileProvider 不熟悉,可参考篇头的文章。

/storage/emulated/0/Android/data/com.demo.test/files

当你再通过FileOutPutStream来存储图片时候,是成功的。

private fun saveImage(bitmap: Bitmap, storePath: String, filePath: String): Boolean {
        val appDir = File(storePath)
        if (!appDir.exists()) {
            appDir.mkdirs()
        }
        val file = File(filePath)
        if (file.exists()) {
            file.delete()
        }
        var fos: FileOutputStream? = null
        try {
            fos = FileOutputStream(file)
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
            fos.flush()
            return true
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } finally {
            fos?.close()
        }
        return false
    }

经过测试,在29的下和29 的设备下,分享qq、微信都成功了。

1.3 分享原理总结

分享的本质就是把图片路径qq或微信访问,让他们能够访问到我们的图片。分区之前是存储在外部sd卡,都没有问题。

分区后,qq或微信没法访问的我们的私有目录App-specific。因此,我们需要通过 fileprovider 转换成 content:// 格式去分享,临时授权给 qq或微信 来访问我们的图片。

qq是内部自己做了 fileprovider 适配,因此,我们只需要传入绝对路径 file:// 格式即可,而微信是需要接收 content:// 格式,所以需要我们外部自己来转换。

具体的适配逻辑参考篇头的文章~

二、公共目录下资源访问

Google建议我们采用 mediaStore 或者 SAF 去访问。在Android10 上公共目录下的图片无法通过file:// 格式去访问,提示找不到路径。如glide加载、图片选择库、裁剪框架等等都会收到影响。

但是,这里有个坑: 在Android10上不行,在Android11上又可以!!为什么?

因为Google改回来了,让Android11支持file://格式了。。。。 (wtf? 我谢谢你啊~~)

**我这里说的 Android10android 11 是指 targetSdkVersion 哦 **

2.1 往公共目录插入一张图片

只能通过mediaStore方式:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, "This is an image");
values.put(MediaStore.Images.Media.DISPLAY_NAME, "Image.png");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
values.put(MediaStore.Images.Media.TITLE, "Image.png");
values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/test");

Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver = context.getContentResolver();
//这里就能拿到这个insertUri
Uri insertUri = resolver.insert(external, values);
LogUtil.log("insertUri: " + insertUri);

OutputStream os = null;
try {
    if (insertUri != null) {
        os = resolver.openOutputStream(insertUri);
    }
    if (os != null) {
        final Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888);
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, os);
        // write what you want
    }
} catch (IOException e) {
    LogUtil.log("fail: " + e.getCause());
} finally {
    try {
        if (os != null) {
            os.close();
        }
    } catch (IOException e) {
        LogUtil.log("fail in close: " + e.getCause());
    }
}

2.2 content uri转file格式路径

public static String getFilePathFromContentUri(Uri selectedVideoUri,
                                                  ContentResolver contentResolver) {
       String filePath;
       String[] filePathColumn = {MediaStore.MediaColumns.DATA};

       Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
       cursor.moveToFirst();

       int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
       filePath = cursor.getString(columnIndex);
       cursor.close();
       return filePath;
   }

2.3 根据图片名来获取file格式路径

String imageName="test";

Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver = BaseApp.getContext().getContentResolver();
String selection = MediaStore.Images.Media.TITLE + "=?";
String[] args = new String[] {imageName};
String[] projection = new String[] {MediaStore.Images.Media._ID};
Cursor cursor = resolver.query(external, projection, selection, args, null);
// 这里的得到content 格式的uri 
Uri imageUri = null;
//content://media/external/images/media/318952
if (cursor != null && cursor.moveToFirst()) {
    imageUri = ContentUris.withAppendedId(external, cursor.getLong(0));
    cursor.close();
}

拿到绝对路径后,在Android11上都 glide、qq分享、第三方的图片选择框架等都可以正常访问。

三、终极适配方案

  • 在Android10上

开启标志位 :android:requestLegacyExternalStorage="true"来开启兼容模式,关闭分区适配,相当于targetSdkVersion=29的时候还是以旧的方式运行,完全没问题。完美避开无法访问公共目录的坑!!!

  • 在Android11上

以上标志会自动失效。因此,应用存储的东西还在放在App-specific目录下。分享私有目录可以通过fileprovider 方式适配。 要分享公共目录,因为支持File api直接访问公共目录,因此,可以直接把content格式转成file格式即可,具体可回看文中的第二部分。

最后,我还想问两个问题:

1. targetSdk=30,android:requestLegacyExternalStorage="false"运行在Android10的设备上 会咋么样?

答: 肯定会碰到权限问题。因为,Android10的设备还是以Android10的兼容模式运行的。所以要改成true

2. targetSdk=30,android:requestLegacyExternalStorage="false"运行在Android11的设备上 会咋么样?

答: 如果按照上面正常适配,肯定完全没得问题!

以上是自己适配经验,难免有疏忽之处,如果文章有问题或者更好的建议,欢迎评论指正~

相关教程

Android基础系列教程:

Android基础课程U-小结_哔哩哔哩_bilibili

Android基础课程UI-布局_哔哩哔哩_bilibili

Android基础课程UI-控件_哔哩哔哩_bilibili

Android基础课程UI-动画_哔哩哔哩_bilibili

Android基础课程-activity的使用_哔哩哔哩_bilibili

Android基础课程-Fragment使用方法_哔哩哔哩_bilibili

Android基础课程-热修复/热更新技术原理_哔哩哔哩_bilibili

本文转自 https://juejin.cn/post/7032525748686553095,如有侵权,请联系删除。

Android 10还没适配完,Android 11又要出了?

Android 10还没适配完,Android 11又要出了?

在谷歌的内部峰会视频中出现了一页幻灯片,其中明确给出了Android 11正式版将于9月8日(周二)正式发布的消息。

去年Android 10是9月3日正式上线的,这次Android11在9月8日推出也并不令人奇怪。预计届时,系统源码会上传到AOSP中、  同时国内手机厂商会第一时间推出最新系统版本的手机

国内的手机厂商oppo, 小米 , vivo其实早在去年年底,已经开展适配Android11的工作。预计Android11推出来后,手机厂商会第一时间换上Android11的系统。毕竟会促进一波销售

Android11主要更改了哪些内容呢

  • 强制执行分区存储机制

  • 一次性权限申请

  • 自动重置权限

  • 查询已安装应用

  • 其中对开发者影响最大的莫过于分区存储了,分区存储影响几何呢?我们细细道来

    分区存储机制对Android开发者息息相关。意味着开发者不能通过File使用外置卡的目录了、同时File类的操作也会大大的受到限制。如果不适配Android11 ,app恐怕不能运行在最新系统的设备上

    在Google官方文档中这样描述

    不过不要紧,我特别邀请了前华为、OPPO 、阿里资深架构师 David 老师为大家带来 《Android 11最新技术合集》 系列直播分享。


    帮你理清 Android 11 最新版本适配问题,让你了解最新Android技术。从底层重新审视Android内核。


    原价299元的Android 11训练营,现在限时优惠只需要0.1元即可加入学习(限量100个名额


    下面的内容带你轻松适配Android 11.0下技术合集,其中就含有分区存储,刘海屏 ,异形屏,全面屏适配。如果你想成为一名技术大牛,千万不要错过!


    识别下方图中二维码,马上学习最新技术。

    并且,报名后还将附赠一套系统的Android开发进阶资料,帮助大家在技术的道路上更进一步。

    扫码获取资料,开启你的学习之旅(如遇扫码频繁+VX:mm14525201314)


    本文分享自微信公众号 - Android群英传(android_heroes)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    今天的关于产品资讯 | mPaaS 完成 iOS 14 和 Android 11 适配的分享已经结束,谢谢您的关注,如果想了解更多关于Aandroid P 适配、Android ''showAsAction'' in package ''android''错误解决、Android 10 和Android 11的适配、Android 10还没适配完,Android 11又要出了?的相关知识,请在本站进行查询。

    本文标签:

    上一篇js判断设备是ios还是android(js判断是安卓手机还是苹果手机)

    下一篇Android RadioButton使用(android中radiobutton控件)