AI如何在APP制作方面展现自己的能力?

AI如何在APP制作方面展现自己的能力?

  人员智能离我们的生活越来越近,只需一部手机,便能够有效解决社交沟通、交易支付、出行交通等一系列问题,从语音识别、声音模仿到机器学习、智能硬件,在移动端实现人员智能也已成为大势所趋。

这么怎么把握人员智能带来的新机遇,怎么在移动端建立能够广泛应用的
AI 技术力量并落实为产品,怎么利用技术创新提高研发效率和业务范围, 制作者个人又怎么向AI领域转变?

  为此,一门APP联合InfoQ共同主办二01八移动技术创新大会,邀请亚马逊、IBM、阿里、百度、腾讯等数十位技术专家,重新定义移动制作新生态,共同探讨AI时代的技术变革经验。

本次大会亮点如下:

  亮点一:移动端的AI技术落地

  移动AI带给手机的变化快速而多元,消费者很容易在手机终端上迅速感知到AI的存在和价值。

不过多年来,不少手机厂商多次尝试在手机内置入语音助手、聊天机器人或是虚拟助理,其效果仍不能让用户满意。

本专题旨在帮忙助力制作者缕清思路,探讨AI技术在移动领域扮演着怎样的角色?怎么建立完善的AI制作环境,提高运算和存储能力?怎么打造差异化、个性化、体系化的产品功能?

  亮点2:解读大UX制作工程师必备技能

  目前移动端各种终端设备崛起,已经超过了pc端,设备不同必然导致制作语言不统一,递增制作难度。

所以,大UX时代应运而生,一次制作适用所有官方,再也不用为一种app得做安卓和IOS两种模式而忧心了。

另一方面,云计算的迅猛崛起必然导致未来一切云端化,比如操作系统,各种应用程序未来都将云端化。

本次活动设置专场,侧重于大UX时代下的UX技术创新发展、应用程序的未来趋势等进行经验共享。

  亮点3:移动制作者生态是怎样的体验

  随着移动制作技术的不断革新,一款app构建与实现的过程,已不能从单一制作语言去认识,而官方化、生态化的模式赋予了这个行业更为高效的生命力;一门APP建立了包含跨官方app制作引擎、制作技术、云服务以及模块市场等完整的生态体系,届时我们将分享生态化理念为制作者带来的不同样体验。

  一门APP粉丝专享福利

  一波限量的免费体验票,扫下方2维码,免费领取体验票,数量有限,早领web桌面应用框架早得!

  01 出品人介绍

 

 

  惠新宸 ——链家网技术副总裁兼总架构师

  国内最有影响力的PHP技术专家PHP制作组主要成员 , PECL制作者 , Zevue开发app框架nd公司外聘顾问, 曾供职于雅虎,百度,新浪。

是PHP
七的主要制作者,PHP五.四,五.五的核心制作者。

也是Yaf (Yet another framework),Yar(Yet another RPC
framework) 以及Yac(Yet another Cache)、Taint等多个开源项目的作者,同时也是APC,Opcache
,Msgpack等项目的维护者。

  

  邹达——一门APP联合创始人兼首席技术官

  专注于浏览器及相关中间件技术,参加过多个浏览器引擎、Java引擎以及移动中间件引擎的制作工作,对Web App和Native
App都有丰富的实战经验,带领团队制作过上百款的各类移动App。

热爱新技术,对Node.js、MongoDB、Redis等都有深刻认识并付诸大量实践,对于大规模、高并发的云端服务制作有着丰富的实战经验,是多个大型项目的架构设计者和技术带头人。

  

  徐川——InfoQ中国主编

  二01五年加入极客邦科技,长期关注互联网前沿技术和一线实践,组织举办两届GMTC全球移动技术大会。

  0二 演讲嘉宾介绍

  费良宏 AWS首席云计算技术顾问

  拥有超过 二0 年在 IT 行业以及软件制作领域的工作经验。

在此之前他曾经任职于 Microsoft、Apple
等知名企业,任职架构师、技术顾问等职务。

擅长 Web
领域应用、APP以及机器学习等的制作,也从事过多个大型软件项目的设计、制作与项目管理。

现在他专注与云计算以及互联网等技术领域,致力于帮忙助力中国的制作者构建基于云计算的新一代的互联网应用。

  林咏华 IBM 全球技术考虑院院士,IBM 考虑院认知系统全球考虑负责人,技术总监

  林咏华是 IBM 考虑院认知系统全球考虑负责人,IBM 全球技术考虑院院士(Member of IBM Academy of
Technology),并在 IBM 中国考虑院担任认知系统及云计算技术总监。

她在 IBM 考虑院从事了 1五
年的系统架构、云计算、认知计算官方等领域的考虑。

她带领团队构建并运维了 IBM 的 Supervessel 创新云,在业界首次把
OpenStack、容器云、异构计算(GPU/FPGA)等关键技术进行整合,高效地支撑了大数据云服务、认知计算云服务等。

相关技术已经被使用到 IBM
Waston,IBM PowerAI 等关键的 AI 认知系统中,帮忙助力 IBM 持续引领着AI认知系统的技术潮流。

她本人有超过 四0
个全球专利,多篇学术文章发表在顶级国际会议和杂志。

与此同时,她热心推动科技界多元化文化的发展,她现在还担任了 IEEE Women in Engineering
北京的主席。

  刘鑫 一门APP创始人兼总经理

  自二00三年起见证了中国移动互联网从SP梦网到智能机时代的全过程。

专注于国内外App制作官方和API经济领域的考虑,系统地阐述过Web
App的挑战与Hybrid App的发展,以及中国企业互联网化和与API经济结合的应用实践。

  雷志兴 手机百度架构师

  雷志兴,0七 年加入百度UX团队,走过百度从 二0 名UX到千余名UX的历程。

Berg 关注UX基础技术和工程化,早年负责过百度UX基础库,后于
二011 年发起 FIS 项目并推广到 二0
多个百度业务;最近app开发文档两年核心工作是在工程中实践跨端解决方式。

他也曾在百度世界、Velocity、QCon、Hangjs、阿里技术嘉年华等会议中发表过主题演讲。

  刘彦东 网易传媒 技术VP

  现任网易传媒技术部副CEO,负责人员智能在新闻流中的应用。

此前Uber机器学习官方组担任Tech
Lead,领导Uber机器学习设计制作工作。

在Uber之前就职于雅虎硅谷考虑院担任资深考虑员,主持雅虎多个垂直搜索相关性的研发。

曾就读于山东大学计算机本科,
埃默里大学计算机硕士, 以及卡耐基梅隆大学计算机博士,在顶级学术会议/期刊上发表论文二0余篇,引用数超过十00次。

  洪强宁 爱因互动首席技术官,前豆瓣首席架构师、宜信大数据创新中心首席架构师

  十余年互联网从业经验,中国 Python
用户组(CPUG)的早期活跃者和创立者之一。

0六年加入豆瓣,后任首席架构师,负责豆瓣网站的基础架构,带领豆瓣的官方部门为公司各产品提供基础设施、制作过程、线上维护等基础服务,并推进了基础设施私有云化的进程。

1四年底加入宜信大数据创新中心和技术研发中心,负责云官方建设和安全相关事务。

核心关注方向在云计算、容器技术、微服务和安全技术上。

更多信息请关注www.yimenapp.com

错误码100013,APP拉起QQ实现授权登录返回错误码100013解决方案

错误码100013,APP拉起QQ实现授权登录返回错误码100013解决方案

https://wiki.connect.qq.com/%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E

 

100013 access token失效(用户取消授权或过期被回收)。

开发APP从一门开始www.yimenapp.com
APP打包:https://www.yimenapp.com/more.html
EXE打包:https://www.yimenapp.com/exe.html
商城APP:https://www.yimenapp.com/shop.html
IOS免签打包:https://www.yimenapp.com/iosmianqian.html
APP上架:https://www.yimenapp.com/iosup.html
APP软著申请:https://www.yimenapp.com/softpage.html
SSL申请:https://www.yimenapp.com/ssl.html
Discuz APP:https://www.yimenapp.com/discuz.html
教程汇总:https://www.yimenapp.com/jiaocheng.html

小米开发平台用户体验合规要求

小米开发平台用户体验合规要求

用户体验

做好用户体验、保障用户安全为小米一直以来所追求的目标。为保障用户权益,确保用户在应用下载、使用环节获得更安全、更可靠的使用体验,小米不允许应用或应用所提供的内容破坏用户对小米生态系统的信任,以及未经用户许可,进行安装(默认安装或默认勾选安装)或访问其他应用、游戏或软件(包括第三方提供的功能和体验)等行为。运行在小米设备上的应用所提供访问权限的所有内容,须符合本政策的各项条款且用户有权知晓。因此,开发者不得违反下述要求以及不得有其他损害用户权益及体验的行为,小米愿意与开发者共同努力,打造良好用户体验生态。

1、应用内容

基本要求

1、应用不得是简单打包的网站页面或套用模板、内容聚合、罗列链接、广告推广等,需具备实用价值及创意性,能为用户提供差异化、高质量的体验。

2、应用需为用户提供绿色、独特、高质量的应用内容,不得出现对用户有害或者不当的内容。

3、应用功能主要为应用分发(包括允许下载、更新、搜索应用/游戏等功能)的开发者,需提供所分发应用符合小米上架标准的检测证明、以及确保应用持续合规运营的保障方法,并通过小米合规检测后进行分发。

4、应用提供分发下载功能的,不得以提供“高速下载”、“安全下载”功能,捆绑下载其他应用分发平台或其他应用。用户主动启动应用时,应直接启动,不得附加其他应用分发平台或其他跳转的方式启动。

5、应用不得借助“辅助功能”等技术能力,在用户下载安装环节,通过自动点击安装、或仅通过确认隐私协议等方式,绕过用户对下载安装的确认,直接进行下载安装。

2、应用功能

安装与注册

1、应用不得出现无法正常安装、安装时提示解析失败、启动、卸载、运行崩溃或出现需借助第三方软件才可卸载的情况。

2、应用安装后至多能出现一个桌面快捷图标,不得出现多个桌面快捷图标。

基本功能与使用限制

1、基础功能

1.1 应用不得出现内容无法正常显示或无法获取等情况。

1.2 应用不得出现按钮或者链接点击无反应或报错。

1.3 应用不得安装或者运行前提示或者强制用户重启设备。

1.4 应用主功能不得无法使用,如应用功能有问题,小米有权在应用上添加必要的风险提醒或相关标识。

1.5 应用介绍或更新日志中介绍的功能不得与实际不符。

1.6 应用不得运行后提示更新版本,请确保应用为最新版本。

1.7 应用长时间停留(超过5秒)在闪屏/启动引导界面,无法进入功能页面。

1.8 应用界面必须保证清晰,不得出现模糊、拉伸、压缩、黑边等情况。

1.9 不能出现花屏、分辨率不匹配等分辨率异常。

1.10 正常网络下,不得出现不维护、无网络连接、无内容等无法使用的问题。

1.11 游戏类应用需保证画面清晰、音效清楚合理、操作体验流畅,不得出现画面内容模糊、中途切出游戏后声音仍不中断、实际触控区域与手机显示区域存在偏差等影响用户体验的情况。

2、广告规范

2.1 应用所提供的广告,须与应用使用的群体相适用。

2.2 面向儿童的广告内容,必须适合儿童观看,不得包含欺骗性内容,或极易导致儿童用户无意间触发行为的内容。

2.3 禁止出于广告目的,强制用户必须点击/观看广告,或提交个人数据才能完整使用应用的行为。

2.4 应用所提供的广告,不得出现干扰应用运行和设备功能的行为,以及直接或间接影响用户正常使用的情况。

2.5 应用不得伪装成系统、官方或其他第三方应用推送广告及活动,或进行匿名推送的行为。

2.6 应用不得在锁屏、桌面等设备功能页面,推送广告或其他活动内容。

2.7 应用在通知栏区域的广告和活动内容,应允许用户清除或关闭。

2.8 针对游戏类应用内广告:

2.8.1 游戏内广告需完美适应屏幕方向,如:横屏游戏不得接入和提供竖屏开屏广告。

2.8.2 横幅、插屏广告必须可以关闭,且关闭区域清晰明确,关闭后30s内不得再次弹出展示。

2.8.3 插屏广告不得在游戏进行中弹出,且不得在继续游戏或返回游戏场景切换时弹出广告。

2.8.4 不得使用插屏视频广告作为激励视频广告。

2.8.5 激励视频广告必须由用户主动触发,在视频结束后必须可关闭且关闭区域清晰明确,对应奖励必须在游戏内发放兑换,不得出现奖励不到账、或实际奖励与承诺存在不一致的情况。

3、应用内付费

1、 在充值场景下,用户支付完成须即时到账,到账金额需与实际支付金额一致。

2、对用户已支付费用,但应用未提供对应服务的情况,须及时退费。

3、用户在付费环节支付失败或无法调起支付,须明确告知用户。

4、在应用内或信息介绍中,须注明付费未到账的反馈渠道(客服电话或联系邮箱)或处理方式。

5、应用不得在支付失败、取消支付后,出现无法运行、或强制付费才能使用的情况。

6、应用须合理定价,不得出现定价过高或价格欺诈的行为,实际展示的支付金额,必须与用户在支付环节所需支付的金额一致。

7、应用不得含有不正当吸费行为,包括但不限于:未经用户二次确认主动扣费(即用户需要对购买和支付分别进行一次确认)、隐形扣费行为,未明确、明显提示用户(例如收费协议嵌套在应用引导页内),以误导或诱导方式实现用户付费。

8、应用内容不得含有引导、要求用户进行异常交易,包括但不限于客服引导充值或添加QQ/微信开通VIP等非应用内直接交易形式。

9、应用所有付费项目,须明示用户付费后能使用的功能,在用户已完成付费后,不得二次收费。

10、儿童类应用内支付功能不得存在诱导儿童支付内容(除非其保留在受家长监控的指定区域中),如短代支付,外链接支付等无需输入密码的快捷支付功能。

4、广告标识符规范

1、应用或SDK在使用广告标识符时,只能用于广告分析,以及用户行为和身份分析。

2、不得通过获取系统没有提供撤回能力的,可关联用户的信息,用于广告和用户分析。包括但不限于:CPUID、BOOT_ID、SN、MAC地址、IMEI等。

3、应用每次使用“设备标识”和“虚拟身份ID”时,都必须验证MIUI系统的“虚拟身份管理”状态(是否允许使用设备标识),如果用户已开启“虚拟身份保护”,您不得基于“设备标识”和“虚拟身份ID”收集和使用数据。

4、广告标识符重置后,在未获得用户明确许可的情况下,新的广告标识符不得与先前的广告标识符或由其衍生的数据相关联。

5、应用若因业务所需而与任何第三方共享广告标识符,对方也必须遵守广告标识符相关条款。

5、损害用户权益的行为

影响用户正常使用

1、流氓行为

1.1 应用在用户不知情或未授权的情况下,长期占用移动终端中央处理器计算资源。

1.2 应用在用户不知情或未授权的情况下,长期驻留系统内存。

1.3 应用在用户不知情或未授权的情况下,自动添加、修改、删除收藏夹、快捷方式。

1.4 应用无法正常退出,或应用安装后无法卸载。

1.5 应用不得含有隐藏或不被用户感知或发现的功能。

2、干扰

应用对其他应用程序进行干扰、屏蔽或弹窗等,导致其他应用程序无法正常使用,其中包括含有修改其他应用数据,游戏存档等功能的应用。

3、第三方安装来源应用

针对第三方安装来源的应用,在无法确认安装包体安全合规、安装动作为用户主观意愿的情况下,会通过验证手机密码等方式,证明此次安装行为是用户自主操作且符合用户预期。

非正常扣费或损害用户利益

1、非正常扣费

1.1 在用户不知情或未授权的情况下,应用自动订购付费服务或自动扣费。

1.2 应用通过非正常手段直接进行扣费,如模拟系统窗口/提示、替换系统功能按钮诱导用户、隐藏关键订购协议诱导用户同意付费。

1.3 用户付费后未完整履行付费服务,或提供的付费服务与承诺存在偏差。

1.4 应用造成用户财产损失且有持续、大范围扩散的风险,且应用开发者不介入解决用户损失问题的情况。

2、资源消耗

2.1 应用在用户不知情或未授权的情况下,自动拨打电话。

2.2 应用在用户不知情或未授权的情况下,自动发送短信。

2.3 应用在用户不知情或未授权的情况下,自动发送彩信。

2.4 应用频繁连接或尝试连接网络,产生异常数据流量,造成用户财产损失。

3、违规下载器

具备分发应用能力的应用,分发存在违法违规风险的应用,或未经过用户允许、诱导用户产生下载行为。

欺骗或误导用户

1、 通过破解或未经授权的使用行为,或伪装或盗用其他应用名称、icon的行为,或实际界面伪装成其它正常应用的行为,误导用户执行对原始受信任应用程序的相关操作。

2、通过伪造、篡改、劫持,如短信、彩信、邮件、通讯录、通话记录、收藏夹、桌面或其他常用应用等,诱骗用户从而达到不正当目的。

3、 应用利用变号软件进行机身电话号码伪装,对用户进行诈骗或用于其他违法违规行为。

攻击/破坏系统或设备运行

1、应用存在如导致系统崩溃、系统重启、无响应等系统破坏行为。

2、应用导致移动终端硬件无法正常工作,如黑屏、耗电异常等。

3、应用导致移动终端其它非恶意软件无法正常运行。

4、应用导致运营商通信网络无法正常工作,或资源消耗异常。

5、在用户不知情或未授权的情况下,对系统设置进行修改(辅助功能、设备管理器、系统时间、系统角标等)导致用户无法再进行正常设置或运行正常功能。

6、在用户不知情或未授权的情况下,对用户文件、系统文件或其它非恶意软件进行病毒感染、劫持、篡改、删除、卸载、或限制运行等。

7、应用强制索取ROOT权限,或提示部分/全部应用功能非ROOT手机无法使用。

8、利用系统已知安全漏洞、或私自调取未发布的系统能力,用于实现商业目的或导致用户信息安全和使用体验受到影响。

小米开发平台应用隐私检测问题查询-“隐私合规”模块使用教程

小米开发平台应用隐私检测问题查询-“隐私合规”模块使用教程

为协助开发者在开发、运营APP的过程中,更好履行个人信息保护责任与义务,保障平台用户的合法权益,为用户和开发者提供更多更好的服务,小米应用商店新增隐私问题查询和复测功能。本文档为“隐私问题查询和复测页面”的使用教程,您可在了解文档内容后进行功能使用。

一、隐私问题查询路径

如果您提交的应用类型为:游戏,请参考路径 2、开发者首页“隐私合规”入口进行查询。

1、隐私检测弹窗提示

当开发者旗下的应用,在隐私检测过程中发现问题,我们将通过邮件、开发者站弹窗公告的方式进行提醒,告知开发者关注检测出的问题,届时开发者可通过弹窗直接跳转查看问题。如开发者旗下多个应用均检测出问题时,我们也将仅发布一个弹窗公告来提醒。

2、开发者站首页“隐私合规”入口

开发者站首页增加隐私检测入口,点击可进入隐私合规页面。在此可浏览开发者旗下在架应用的隐私检测状态,及存在的具体问题报告详情。(注:隐私合规页面中,仅对当前状态为“在架”的应用进行检测)

3、应用详情页“隐私合规”入口

同样,在各个应用的管理详情页—“应用服务”模块下,也增加了隐私问题查询入口,点击后可进入对应应用的隐私问题检测报告页。(注:部分非在架状态的应用无法检测,因此无问题报告详情)

二、隐私问题查询操作指南

1、检测情况查询

开发者进入“隐私合规”模块页面后,开发者旗下的应用将按照检测情况进行排列,不同检测状态定义如下:

1)检测情况显示“已通过”:代表该应用本次检测中,未发现问题;

2)检测情况显示“未通过”:代表该应用在本次检测中,发现存在隐私问题;

3)检测情况显示“未检测”:代表该应用目前在检测排队中,未进行检测;

4)检测情况显示“检测中”:代表开发者在“问题报告”页面,提交修改后的apk,正在复测中。

(注:因检测易受到环境差异或时间节点影响,已通过应用不代表绝对安全,未来还将不定期复测)

开发者可点击“隐私合规”模块页面上方的《隐私合规问题修改指引》,查询隐私问题的修改方法,或参照标准来进行问题的自查。

2、隐私问题报告查询

点击各个应用的“查看报告”入口可进入报告详情页,查看应用存在的相关问题及问题产生的详细介绍。对无法复现或定位的问题,报告详情页中将提供检测期间问题页面的截图供开发者参考,并且可以通过详情页中“查看报告”入口可以下载报告查看详细的检测问题项及其整改建议。

三、修改后的apk提交隐私复测操作指南

1、提交APK进行复测

如开发者将应用存在的隐私问题修改完成,开发者可在“问题报告详情页”中,点击右上角的“检测修改后的apk”,提交修改后的包体进行隐私合规的复测,提交复测的apk,无需修改apk的版本号。

复测apk上传后,将会对“包名、hash值、MD5”等信息进行校验,避免开发者不小心提交未修改的apk或错误的apk。(注:开发者上传未修改过的apk,或上传其他应用的apk,会进行弹窗提醒)

2、提交APK复测后状态查询

当开发者提交修改后的apk进行复测,问题报告详情页中的提交复测按钮将置灰,页面将暂时保持上一次的检测结果,待复测完成后,页面检测结果将更新为最新状态。(注:复测需要1~2个工作日)

若应用检测通过,问题详情页将显示以下状态。(注:检测通过的详情页,不提供apk复测入口)

小米开发平台开发者账号资料修改操作指南

小米开发平台开发者账号资料修改操作指南

本文档介绍了开发者账号管理基本资料的修改指南,您可在了解文档内容后,自行对开发者账号进行管理操作。

开发者账号密码修改

适用场景:

公司人员交接,开发者账号绑定的手机号码及邮箱可正常接收查看验证码。

操作方法/路径:

1、登陆小米账号管理页面(https://account.xiaomi.com);

2、完成对账号密码的修改(安全邮箱、安全手机号码等均可进行修改)。

企业开发者账号更换登录邮箱

适用场景:

原注册员工离职,无法找回账号;需要更改开发者管理应用;注册或者更改公司名称提示“已存在”。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式提供相关信息,申请协助处理。

工单主题:【企业开发者账号更换登录邮箱】

工单问题描述:

  • 贵公司企业名称:
  • 贵公司营业执照扫描件:
  • 需要绑定到小米账号的新的登录邮箱(公司必须使用企业邮箱且该邮箱未注册开发者账号):
  • 需要绑定到的新登录邮箱所对应的小米账号ID(非手机号码):
  • 原账号下应用的名称和包名:(未上传过应用,请填写“无”)
  • 信息变更申请表:点击下载模板(请加盖公章)
  • 公司座机和联系人手机:

注:登录邮箱和小米账号必须是一对一绑定的,且没有注册过小米开发者,

请您先和公司内部同事进行确认贵司的企业营业执照是否已被其他部门注册了企业开发者,如果是,请贵司内部进行协商后确认账号是否统一管理。

注:以上解决方式仅限于仅开通开发者且未开通广告商的账号,如旧账号同时开通了开发者账号和广告商账号(开发者需自行内部核实),请先按照以上邮件信息格式联系ad-audit@xiaomi.com,进行核实账号资质,以同步推广账号和资金。因未先联系广告邮箱带来的后续问题,需开发者自行承担。

开发者账号注销

适用场景:

员工离职账号无法找回、账号不再使用、账号需注销重新注册。

注:开发者账号注销后,其下的应用及已接入服务将一并删除,请谨慎选择。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式进行反馈:

问题描述主题:【开发者账号注销申请】

问题描述内容:

  • 贵公司企业名称:(个人开发者可不提供)
  • 企业营业执照扫描件:(个人开发者可不提供)
  • 加盖企业公章或个人开发者签名的注销申请书:(申请内容自拟,无明确要求)
  • 注册邮箱账号:
  • 注销原因:

2、收到反馈后,我们会在1-2个工作日内为您处理完成。

个人开发者账号转换为企业开发者账号

适用场景:

原有开发者账号无法满足上传应用需求,需要转换开发者账户类型。

注:不支持企业开发者账号转换为个人开发者账号;开发者账号类型转换后,其下的应用数据无任何影响。

操作方法/路径:

1、登录小米开放平台,点击右上角用户名“资料修改”;

2、点击基本资料账户类型处“升级为企业开发者”,按后续提示操作即可。

企业开发者账号主体、认证信息修改

适用场景:

公司营业执照更新、公司名称变更。

注:修改完主体信息的开发者账户,需在应用apk包中修改开发者名称,才可以在应用中显示最新主体名称。

操作方法/路径:

1、方式一:登录开发者账号,进入右上角资料修改界面,在该页面即可修改主体信息。

修改开发者账号主体信息是需要提交审核的,审核时间是1-3个工作日,审核期间不会影响到账号内的应用状态的,最终审核结果会通过邮件的方式发送到开发者邮箱。

注:务必保证填写的公司名称、公司注册名称等信息与营业执照内公司名称等相应信息保持一致以及应用信息内有关开发者信息与开发者账号主体信息一致。

2、方式二:通过认领的方式来实现应用主体的迁移。

在小米开放平台创建开发者账号后,再通过认领流程将该应用转移至开发者新的账号下管理。

企业开发者账号注册流程https://dev.mi.com/distribute/doc/details?pId=1145

应用认领操作指南 :https://dev.mi.com/distribute/doc/details?pId=1076

注:小米ID获取方式:

访问网址https://account.xiaomi.com登录小米账号,如下图所示红框内即为小米ID。

Android 13 应用适配指南3,安卓13新功能和API

Android 13 应用适配指南3,安卓13新功能和API

3.1.1.3 豁免

系统会针对特定类型的应用提供几种级别的豁免,下面几部分将介绍这些豁免。

豁免针对的是应用而不是进程。如果系统豁免了应用中的一个进程,则该应用中的所有其他进程也会被豁免。注意

:即使是设备上预装的应用,也必须至少满足下面一个部分中的条件才能获得豁免。

a. 完全不会显示在 FGS 任务管理器中

以下应用可以运行前台服务,而完全不会显示在任务管理器中:

b. 免于被用户停止当以下类型的应用运行前台服务时,它们会显示在 FGS 任务管理器中,但应用名称旁边没有可以供用户按的停止按钮:

3.1.1.4 测试

如需测试应用在用户停止应用的过程中和之后的行为是否符合预期,请在终端窗口中运行以下 adb 命令:

adb shell cmd activity stop-app PACKAGE_NAME

3.1.2 使用 JobScheduler 改进预提取作业处理

利用 JobScheduler,应用可使用JobInfo.Builder.setPrefetch()将特定作业标记为“预提取”作业,这意味着,理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。

在 Android 13 中,系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。

3.1.2.1 代码示例
JobScheduler mJobScheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder mBuilder = new JobInfo.Builder(mJobId++, new ComponentName(this,MyJobService.class));
mBuilder.setPrefetch(true) //赋值为true
mJobScheduler.schedule(mBuilder.build());

3.1.3 电池资源利用率

Android 13 引入了以下省电措施:

  • 更新了有关系统何时将您的应用放入“受限”应用待机模式存储分区的规则
  • 对于您的应用在以下情况下可以执行的操作制定了新限制:用户因您应用的后台电池用量过高而将其置于“受限”状态。
  • 新增了系统通知,用于就后台电池用量过高长时间运行的前台服务向用户发出警告。
3.1.3.1 关于应用何时会进入“受限”应用待机模式存储分区的规则更新

除非您的应用符合豁免条件,否则当您的应用出现以下任何行为时,系统就会将其放入受限存储分区:

  • 用户有 8 天没有与您的应用互动。如果用户与另一个绑定到您应用的服务的应用互动,系统也会将您的应用视为“使用过”。

注意

:设备处于关闭状态的时间不会计入互动限制。

  • 您的应用在 24 小时内调用了过多的广播绑定
  • 您的应用在 24 小时内消耗了大量的设备电池电量。对于低 RAM 设备,此阈值可能会有所不同。

在衡量应用对设备电池续航时间的影响时,系统会考虑应用在几个不同方面执行的操作,包括:

  • 作业(包括加急作业)
  • 广播接收器
  • 后台服务
  • 系统是否已缓存应用的进程

用户互动可让您的应用退出“受限”存储分区:

当用户与您的应用互动时(包括通过以下几种方式互动),系统会将应用从受限存储分区中移出,并放入另一个应用待机模式存储分区

  • 用户点按您的应用发送的通知。

注意

:如果用户在不点按通知的情况下滑开通知,系统不会

将该操作视为与您的应用“互动”。

  • 用户在属于您应用的 widget 中执行操作。
  • 用户通过按媒体按钮影响您应用的前台服务。
  • 用户在与 Android Automotive OS 互动时连接到您的应用(您的应用在此过程中使用了前台服务或CONNECTION_TYPE_PROJECTION)。
  • 您的应用在画中画 (PiP) 模式下可见。
  • 您的应用是屏幕上当前运行的应用之一。(主要适用于大屏设备。)
3.1.3.2 关于受限后台电池用量的新限制

注意

:只有在您的应用以 Android 13 为目标平台时,此变更才会生效。

使用现有 Android 版本的用户能够调整应用在后台运行时可以执行的工作量。系统设置中的电池用量页面上会显示以下选项:

  • 无限制:允许后台工作,这可能会消耗更多电量。
  • 优化(默认):根据用户与应用互动的方式,优化应用执行后台工作的能力。
  • 受限:更注重延长设备的电池续航时间,而不是实现应用的全面功能。对于应用可以在后台执行的操作施加了更多限制。

注意

:如果用户在将您的应用置于“受限”状态之后启动了该应用,系统会暂时将该应用视为处于“优化”状态。当用户停止与您的应用互动并开始与另一个应用互动时,系统会将您的应用重新置于“受限”状态。

自 Android 9(API 级别 28)起,处于“受限”状态的应用具有以下限制:

  • 无法启动前台服务
  • 现有的前台服务会从前台移除
  • 不会触发闹钟
  • 不会执行作业

当您的应用以 Android 13 为目标平台时,除非应用因其他原因启动,否则系统不会传送以下任何广播:

  • BOOT_COMPLETED
  • LOCKED_BOOT_COMPLETED
3.1.3.3 与后台电池用量过高相关的系统通知

Android 13 引入了一个新的系统通知,当您的应用在 24 小时内消耗了大量设备电池电量时,就会显示该通知。这个新通知会针对搭载 Android 13 的设备上的所有应用显示,无论应用采用何种目标 SDK 版本都不例外。注意

:如果系统在应用显示与前台服务相关的通知时检测到应用的电池用量较高,系统会等到用户关闭通知,或前台服务完成,并且仅在您的应用继续消耗大量设备电池电量时才会显示该通知。

在衡量应用对设备电池续航时间的影响时,系统会考虑应用在几个不同方面执行的操作,包括:

如果针对您的应用显示了此通知,则至少在 24 小时后,才会再次在同一设备上显示该通知。

3.1.3.4 与长时间运行的前台服务相关的系统通知

如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与前台服务 (FGS) 任务管理器互动。该通知包含以下内容:

 APP is running in the background for a long time. Tap to review.

注意

:如果系统针对您的应用显示了此通知,则至少在 30 天后才会再次显示类似通知。如果前台服务的类型为FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK或FOREGROUND_SERVICE_TYPE_LOCATION

,系统将不会显示此通知。

此外,如果您的应用在 24 小时内运行超过 4 小时的前台服务属于FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK或FOREGROUND_SERVICE_TYPE_LOCATION类型,则系统不会针对您的应用启动的任何前台服务发送长时间运行通知。

3.1.3.5 豁免

存在以下情况的应用不会受到 Android 13 中引入的任何省电措施的影响:

在以下情况下,您的应用可以免于进入“受限”应用待机模式存储分区,并可以绕过“8 天无活动”触发器:

在以下情况下,您的应用可以不受 Android 13 中引入的大多数省电措施的影响,但系统仍然会发送针对长时间运行的前台服务的通知

3.1.3.6 测试

以下几个部分将介绍几种测试 Android 13 中引入的省电措施会对应用产生何种影响的方式。

禁止在后台使用

如需禁止您的应用在后台运行,请在终端窗口中运行以下命令:

adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND deny

将应用放入受限存储分区

如需强制系统将您的应用放入受限存储分区,请在终端窗口中运行以下命令:

adb shell am set-standby-bucket PACKAGE_NAME restricted

3.2 行为变更:以Android 13为目标平台的应用

3.2.1 通知运行时权限

Android 13 中引入了新的运行时权限,用于从应用发送非豁免通知:POST_NOTIFICATIONS。此更改有助于用户专注于最重要的通知。

强烈建议您尽快以 Android 13 为目标平台,以获享此功能提供的额外控制和灵活性。如果您继续以 12L(API 级别 32)或更低版本为目标平台,您将失去在应用功能环境中请求权限

的机会。

应用的影响总结如下:

Target SDK应用权限弹窗临时授权
Android 13 pre新安装创建第一个通知渠道时
现有首次启动Activity一直有效,直到权限弹窗中明确选择
Android 13新安装应用自行控制
现有应用自行控制首次启动Activity为止
3.2.1.1 使用新权限

如需向应用请求新的通知权限,请将应用更新为以 Android 13 为目标平台,并完成与请求其他运行时权限类似的流程,如以下几个部分所述。需要在应用的清单文件中声明的权限会显示在以下代码段中:

<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>    <application ...>
        ...
    </application>
</manifest>
3.2.1.2 应用功能取决于用户在权限对话框中所做的选择

在此对话框中,用户可执行以下操作:

注意

:如果用户点按不允许

,即使仅点按一次,系统也不会再次提示用户,除非他们卸载并重新安装您的应用。

下面几个部分介绍了根据用户操作的不同,应用会有哪些不同的行为表现。

a. 用户选择“允许”如果用户选择允许选项,您的应用可以执行以下操作:

b. 用户选择“不允许”如果用户选择不允许选项,您的应用将无法发送通知。除了几个特定角色之外,所有通知渠道都会被屏蔽。这类似于用户在系统设置中手动关闭应用的所有通知后发生的行为。

c. 用户滑开对话框

如果用户滑开对话框(即他们既没有选择允许,也没有选择不允许),会发生以下行为:

3.2.1.3 对新安装的应用的影响

如果用户在搭载 Android 13 的设备上安装您的应用,应用的通知默认处于关闭状态。在您请求新的权限且用户向您的应用授予该权限之前,您的应用都将无法发送通知。

权限对话框的显示时间取决于应用的目标 SDK 版本:

  • 如果您的应用以 Android 13 或更高版本为目标平台,应用将可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。
  • 如果您的应用以 12L(API 级别 32)或更低版本为目标平台,系统会在您创建第一个通知渠道时显示权限对话框。这通常是在应用启动时。
3.2.1.4 对现有应用更新的影响

注意

:请考虑下面这种情形,即应用安装在搭载 12L 或更低版本的旧设备上,用户在该设备上允许接收通知,但想淘汰该设备。用户现在使用的是搭载 Android 13 的新设备,并通过备份和恢复功能恢复了应用。

在这种情况下,系统会将您的应用视为“现有应用”,因此该应用会获得发送通知的临时权限。

为最大限度地减少与新通知权限相关的中断,系统会自动向系统升级到 Android 13 之前用户设备上已安装的所有符合条件的应用临时授予新通知权限。此临时授权的持续时间取决于应用的目标 SDK 版本:

  • 如果应用以 Android 13 或更高版本为目标平台,则临时授权将持续到应用首次启动 activity 为止。

您的应用可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

  • 如果您的应用以 12L 或更低版本为目标平台,则临时授权将一直有效,直到用户在通知权限运行时对话框中明确选择一个选项。也就是说,如果用户在未做出选择的情况下关闭了权限提示,系统会保留应用的临时授权。
3.2.1.5 获得临时授权的资格要求

您的应用要获得临时授权必须满足以下条件:应用必须已具有通知渠道,并且用户未在搭载 12L 或更低版本的设备上明确停用应用的通知。

如果用户在搭载 12L 或更低版本的设备上停用了应用的通知,当设备升级到 Android 13 或更高版本后,该停用会继续有效。

3.2.1.6 豁免

媒体会话有关的通知不受此行为变更的影响。

3.2.1.7 最佳做法

本部分将介绍几种在应用中最有效地使用新通知权限的方式。

a. 更新应用的目标 SDK 版本

为了让应用更灵活地显示权限对话框,请将应用更新为以 Android 13 为目标平台。

b. 等待一段时间再显示通知权限提示

等到用户熟悉您的应用之后,再请求他们授予任何权限。

新用户可能想要探索您的应用,并切身体会每项通知请求可以带来的好处。您可以通过用户操作触发权限提示。下面列举了几个适合显示通知权限提示的时机:

  • 用户点按“提醒铃铛”按钮时。
  • 用户选择关注他人的社交媒体帐号时。
  • 用户提交外卖订单时。

下图显示了请求通知权限的建议工作流程。或者,您也可以设置一个请求以在应用启动时显示,但仅在应用第 3 次或第 4 次启动后才显示。

c. 在上下文中请求权限

在应用内请求通知权限时,请在正确的上下文中请求,以便用户明确了解通知的用途以及应该选择接收通知的原因。例如,电子邮件应用可能包含为每封新邮件发送通知的选项,或仅为用户是唯一收件人的邮件发送通知的选项。

借此机会明确向用户表明您的意图,有助于鼓励用户向您的应用授予通知权限。

d. 检查您的应用能否发送通知

用户必须为您的应用启用通知,您的应用才能发送通知。要确认用户是否已启用通知,请调用areNotificationsEnabled()

e. 以负责任的方式使用权限

获得发送通知的许可后,请负责任地使用该权限。用户可以查看您的应用每天发送的通知数量,并且可以随时撤消该权限

3.2.2 针对附近 Wi-Fi 设备的新运行时权限

Android 13 引入了NEARBY_WIFI_DEVICES运行时权限,该权限属于NEARBY_DEVICES权限组,适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。借助此权限,您可以更轻松地说明应用为何访问附近的 Wi-Fi 设备;在以前的 Android 版本中,这类应用需要声明ACCESS_FINE_LOCATION权限。

如果您的应用以 Android 13 为目标平台并调用多个不同的 Wi-Fi API,则必须从用户处获得这项新权限。

如果您的应用尝试在未获得适当权限的情况下调用 Wi-Fi API,则会发生SecurityException

3.2.2.1 受影响的用例

这项新权限会影响几个不同的 Wi-Fi 用例,包括以下用例:

  • 查找或连接到附近的设备,如打印机或媒体投射设备。通过该工作流,您的应用可以完成以下类型的任务: 通过带外方式(例如通过 BLE)接收 AP 信息。
  • 使用仅限本地使用的热点,通过 Wi-Fi 感知和连接功能发现并连接到设备。
  • 通过 Wi-Fi 直连发现和连接到设备。
  • 发起与已知 SSID(例如汽车或智能家居设备)的连接。
  • 开启仅限本地使用的热点。
  • 连接到附近的 Wi-Fi 感知设备。
3.2.2.2 该权限属于“附近的设备”权限组

NEARBY_WIFI_DEVICES权限是附近的设备

权限组的一部分。此权限组在 Android 12(API 级别 31)中添加,还包含与蓝牙和超宽带相关的权限。如果您的应用请求此权限组中的多项权限,用户会看到一个运行时对话框,其中会请求用户批准您的应用访问附近的设备。在系统设置中,用户必须以组的形式启用和停用附近的设备权限;例如,针对给定应用,用户无法既停用其 Wi-Fi 访问权限,但又保持启用其蓝牙使用权限。

3.2.2.3 坚定地声明您的应用不会推导物理位置

在以 Android 13 为目标平台时,请考虑您的应用是否会通过 Wi-Fi API 推导物理位置;如果不会,则应坚定声明此情况。如需做出此声明,请在应用的清单文件usesPermissionFlags属性设为neverForLocation,如以下代码段所示。此过程类似于您声明绝不会将蓝牙设备信息用于获取位置信息时的过程:

<manifest ...>
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"                     android:usesPermissionFlags="neverForLocation" />    <application ...>
        ...
    </application>
</manifest>
3.2.2.4 保持后向兼容性

由于NEARBY_WIFI_DEVICES权限仅适用于 Android 13 或更高版本,因此您应保留对ACCESS_FINE_LOCATION的所有声明,以便在您的应用中提供向后兼容性。不过,只要您坚定声明应用不会使用 Wi-Fi API 推导物理位置信息,就可以将此权限的最高 SDK 版本设为32,如下以下代码段所示:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="32" />    <application ...>
        ...
    </application>
</manifest>
3.2.2.5 某些 API 仍需要位置信息权限

有几个 Wi-Fi API 仍然需要ACCESS_FINE_LOCATION权限才能获取位置信息,就像它们在 12L 及更低版本上的一样。示例包括WifiManager类中的以下方法:

3.2.2.6 检查需要新权限的 API

如果您的应用以 Android 13 或更高版本为目标平台,您必须声明NEARBY_WIFI_DEVICES权限才能调用以下任何 Wi-Fi API:

3.2.3 在后台使用身体传感器需要新的权限

Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。此访问模式与Android 10(API 级别 29)系统为位置信息引入的模式非常相似。

如果您的应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的BODY_SENSORS权限外,您还必须声明新的BODY_SENSORS_BACKGROUND权限。注意

:这是受到“硬性限制”的权限,除非设备的安装程序针对您的应用将该权限列入了许可名单,否则您的应用将无法获得此权限。如需了解详情,请参阅有关受限权限的指南。

3.2.4 intent 过滤器会屏蔽不匹配的 intent

当您的应用向以 Android 13 或更高版本为目标平台的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的<intent-filter>元素匹配时,系统才会传送该 intent。换言之,系统会屏蔽所有不匹配的 intent,但以下情况除外:

  • 发送给其他应用的未声明任何 intent 过滤器的组件的 intent。
  • 发送给您应用中的其他组件的 intent。
  • 由系统发送的 intent。
  • 由具有根级特权的用户发送的 intent。

3.2.5 更安全地导出上下文注册的接收器

为了帮助提高运行时接收器的安全性,Android 13 允许您指定您应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向您的应用发送不受保护的广播。此导出配置在以 Android 13 或更高版本为目标平台的应用中可用,有助于防止一个主要的应用漏洞来源。

在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。

要实现此安全增强措施,请执行以下操作:

a. 启用DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED兼容性框架更改。

b. 在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播,如以下代码段所示:

// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
    RECEIVER_EXPORTED);
// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,
    RECEIVER_NOT_EXPORTED);

注意

:如果启用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

兼容性框架更改,则必须

为每个广播接收器指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED。否则,当您尝试注册广播接收器时,系统会抛出SecurityException

为了帮助检测这种情况,Android Studio 将会采用一个 lint 规则,而即将发布的ContextCompat将会检查接收器配置是否正确。

Android 13 应用适配指南2,安卓13新功能和API

2.新功能和API

2.1 照片选择器

Android 13 包含对新照片选择器工具的支持。此工具为用户提供了一种安全的内置媒体文件选择方式,让其无需向应用授予对整个媒体库的访问权限。注意

:即将发布的 Google Play 系统更新预计会包含与照片选择器有关的新功能。在一项此类更新中,该库将增加对以 Android 11(API 级别 30)或更高版本为目标平台的应用(不包括 Android Go 设备)的支持。

2.1.1 选择媒体

照片选择器提供了一个可浏览、可搜索的界面,其中按日期(从最近到最早)顺序向用户呈现其媒体库中的文件。您可以指定用户只能看到照片或只能看到视频,并且默认情况下,允许的媒体选择量上限设置为 1。

2.1.2 定义分享限制

应用可以声明android.provider.extra.PICK_IMAGES_MAX的值,该值表示在向用户显示时照片选择器中显示的媒体文件数量上限。例如,如果您提示用户为其帐号选择要求的个人资料照片,请将一张照片设置为分享要求上限。注意

:如果您选择的上限为 1 张,照片选择器会以半屏模式打开。

如需在单选模式下启动照片选择器,请执行以下操作:

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);

2.1.3 选择多张照片或多个视频

如果应用的用例需要用户选择多张照片或多个视频,您可以使用EXTRA_PICK_IMAGES_MAX extra 指定照片选择器中应显示照片的数量上限,如以下代码段中所示:

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);

请注意,可指定为文件数量上限的最大数字存在平台限制。如需访问此限制,请调用MediaStore#getPickImagesMaxLimit()。

2.1.4 处理照片选择器结果

照片选择器启动后,使用新的ACTION_PICK_IMAGES intent 来处理结果。该选择器会返回一组 URI:

// onActivityResult() handles callbacks from the photo picker.
@Override
protected void onActivityResult(
    int requestCode, int resultCode, final Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
        return;
    }
    switch(requestCode) {
        case REQUEST_PHOTO_PICKER_SINGLE_SELECT:
            // Get photo picker response for single select.
            Uri currentUri = data.getData();
            // Do stuff with the photo/video URI.
            return;
        case REQUEST_PHOTO_PICKER_MULTI_SELECT:
            // Get photo picker response for multi select
            for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                Uri currentUri = data.getClipData().getItemAt(i).getUri();
                // Do stuff with each photo/video URI.
            }
            return;
    }
}

默认情况下,照片选择器会既显示照片又显示视频。您还可以在 setType() 方法中设置 MIME 类型,以便按“仅显示照片”或“仅显示视频”进行过滤。例如,如需在照片选择器中仅显示视频,请将video/*传入setType():

// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");
startActivityForResult(intent, );
// Apps can also change the mimeType to allow users to select
// images only - intent.setType("images/*");
// or a specific mimeType - intent.setType("image/gif");

注意:您的应用不能持续访问从此 intent 返回的 URI。当应用的进程结束后,该应用将无法访问 URI。

2.2 应用内语言选择器

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。这些新的 API 还有助于减少样板代码的编写。

为了向后兼容以前的 Android 版本,我们还会从Appcompat 1.6.0-alpha01开始在 AndroidX 中提供这些 API。

  • 允许用户为每个应用选择首选语言的系统设置

不支持多种语言的应用不受这些变更的影响。

2.2.1 API 实现

对于当前未使用自定义应用内语言选择器的应用,无需执行任何其他操作。

对于具有或想要使用应用内语言选择器的应用,请使用这些新 API(而非应用的自定义逻辑)来处理相关设置和获取用户对应用的首选语言设置。

使用 AndroidX 支持库来实现

为了向后兼容以前的 Android 版本,建议使用 AndroidX 支持库来实现应用内语言选择器。使用Appcompat 1.6.0-alpha01或更高版本中提供的setApplicationLocales()方法。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY");
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale);

使用 Android 框架 API 来实现

您还可以通过setApplicationLocales()getApplicationLocales()方法,使用 Android 框架 API 来实现应用内语言选择器。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its localem
Context.getSystemService(LocaleManager.class).setApplicationLocales(newLocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language

如需获取用户当前的首选语言以显示在语言选择器中,您的应用可以从系统中取回该值:

// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales = mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user

2.2.2 面向用户的系统设置

用户可以通过新的系统设置为每个应用选择首选语言。他们可以通过以下两种方式访问这些设置:

  • 通过系统设置访问

设置 > 系统 > 语言和输入法 > 应用语言 >(选择应用)

  • 通过应用设置访问

设置 > 应用 >(选择一款应用)> 语言

已知问题

在测试应用时,有一些已知问题需要注意。

  • 可用语言列表中可能不包含您的应用支持的语言。
  • 如果您的应用使用拆分 APK,当应用语言区域发生变化时,系统不会自动下载这些 APK。
  • 现在的界面只是一个初步版本,在后续版本中会不断更改。

2.2.3 DEMO演示

2.3 可由开发者降级的权限

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。

如需撤消特定运行时权限,请将该权限的名称传入revokeSelfPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入revokeSelfPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。具体而言,当有应用组件仍在前台运行,或者有另一个应用正在访问您应用的组件(如 content provider)时,不会发生撤消。如果您想立即撤消权限,可以调用exit()。但是,对exit()进行此类调用可能会导致当前正在访问您应用的其他应用出现未定义的行为或崩溃。注意

:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有

权限。在这种情况下,调用revokeSelfPermissionsOnKill()

会很有帮助。

2.4 可编程的着色器

Android 13 添加了对可编程RuntimeShader对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。改写自此GLSL 着色器的 AGSL 动画着色器:

基于可编程着色器实现的一个简单的绘制效果如下:

2.5 更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在TextView中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在setHyphenationFrequency()中使用新的fullFastnormalFast频率。

2.5.1 API变化

Android 13在已有断字模式基础上新增两种Fast模式:fullFastnormalFast,在原有基础上测量更快。

2.5.2 使用建议

在布局中添加属性android:hyphenationFrequency:

<!--少量快速断字模式-->
<TextView android:hyphenationFrequency="fullFast"/>
<!--标准快速断字模式-->
<TextView android:hyphenationFrequency="normalFast"/>

代码中直接设置:

//标准快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL_FAST)
//少量快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL_FAST)

3.影响应用的行为变更

3.1 行为变更:所有应用

3.1.1 前台服务 (FGS) 任务管理器

无论应用采用何种目标 SDK 版本,Android 13 都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为前台服务 (FGS) 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用。每个应用旁边都有一个停止按钮。

下图说明了搭载 Android 13 的设备上的 FGS 任务管理器的工作流程:

3.1.1.1 用户操作会停止您的整个应用

当用户在 FGS 任务管理器中按您应用旁边的停止按钮时,系统会停止您的整个应用,而不仅仅是正在运行的前台服务。

比较“向上滑动”用户操作和“强行停止”用户操作的行为:

请参见下表中 FGS 任务管理器与现有功能的比较:从最近用过屏幕“向上滑动”和“强行停止”出现异常的应用

用户从 FGS 任务管理器停止应用时,不会发送任何回调。

当用户按停止按钮时,系统不会向您的应用发送任何回调。当应用启动备份时,建议您检查一下现有ApplicationExitInfoAPI 中的新REASON_USER_REQUESTED原因,这可能会很有帮助。

3.1.1.2 与长时间运行的前台服务相关的系统提示

如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与 FGS 任务管理器互动。详细了解就长时间运行的前台服务提醒用户的新系统通知

Android 13 应用适配指南

1.获取Android 13

1.1 小米手机升级Android13

如果您已错过小米社区发布的关于MIUI基于Android 13的升级公开招募,可前往开发者内测申请权限,或请您联系自己公司商务或运营同学,联系我们,我们会为您开通有关权限并指导升级。

目前支持升级Android 13的MIUI开发版的机型有(有序更新中):

小米:小米12、小米12 Pro(高通平台)

Redmi: K50G(电竞版)、K40S、Note 11T Pro/Pro+

1.2 小米云测平台已上线

今年我们提供了足量的云测设备来供开发者适配,小米云测平台

提示:如果发现云测平台没有权限,可以通过小米云测平台权限申请

1.3 Google原生机升级Android 13

开发者持有Pixel系列的机器可以直接ota升级,或者下载镜像升级,具体见链接:https://developer.android.com/about/versions/13/download

1.3 Android 模拟器

在 Android Studio 中,您可以按如下方式安装 Android 13 SDK:

  • 依次点击 Tools > SDK Manager。
  • 在“SDK Platforms”标签页中,选择 Android 13。
  • 在 SDK Tools 标签页中,选择 Android SDK Build-Tools 33。

点击OK安装 SDK。

如需访问 Android 13 API 并测试您的应用与 Android 13 的兼容性,请打开模块级build.gradle或build.gradle.kts文件,并使用 Android 13 所对应的值对它们进行更新:如何设置这些值的格式取决于您所使用的 Android Gradle 插件 (AGP) 版本。

注意:如果您尚未准备好完全支持 Android 13,您仍然可以使用可调试的应用、Android 13 设备和兼容性框架来执行应用兼容性测试,而无需更改应用以使其与预览版 SDK 兼容或以此为目标平台。

小米开放平台屏幕圆角适配说明

小米开放平台屏幕圆角适配说明

1.背景

目前大部分小米手机的屏幕都是圆角,如下示意图所示。四个黑色角表示屏幕缺失部分。

2.参数说明

MIUI提供以下两个值分别表示屏幕上下方圆角的半径:

  • rounded_corner_radius_top 
  • rounded_corner_radius_bottom

3.使用方法

例如需要取得rounded_corner_radius_top的值,可以参考如下代码:

public static int getCornerRadiusTop(Context context) {
         int radius = 0;
         int resourceId = context.getResources().getIdentifier("rounded_corner_radius_top", "dimen", "android");
         if (resourceId > 0) {
              radius = context.getResources().getDimensionPixelSize(resourceId);
       
         return radius;
}

小米开发平台全面屏及虚拟键适配说明

小米开发平台全面屏及虚拟键适配说明

1. 前言

自2016年小米 Mix 全面屏手机推出时,得到了业界和用户的双重认可,小米也引领了“全面屏”手机的风潮。作为全面屏手机的引领者,小米将推出更多的全面屏手机,追求更大的屏幕比例,更高的屏占比。

这些变化也影响了手机软件的设计,最值得开发者关注的,是以下两点:

  • 更大的屏幕高宽比
  • 虚拟导航键

2. 更大的屏幕高宽比

大部分全面屏设备都是18:9,从下图可以看到,在 1080P 的分辨率下,比标准的 16:9 屏幕,足足多了240像素。开发者需要作一些优化,以充分利用更大的显示空间。

2.1. 声明 Maximum Aspect Ratio

Android 标准接口中,支持应用声明其支持的最大屏幕高宽比(maximum aspect ratio)。具体声明如下,其中的 ratio_float 被定义为是高除以宽,以 16:9 为例,ratio_float = 16/9 = 1.778 (18:9则为2.0)。

<application>
    <meta-data android:name="android.max_aspect" android:value="ratio_float" />
</application>

若开发者没有声明该属性,ratio_float 的默认值为1.86,小于2.0,因此这类应用在全面屏手机上,默认不会全屏显示,屏幕底部会留黑。考虑到将有更多 19.5:9 甚至更长的手机出现,建议开发者声明 Maximum Aspect Ratio ≥ 2.2 或更多。值得一提的是,如果应用的 android:resizeableActivity 已经设置为 true,就不必设置 Maximum Aspect Ratio 了。详见 Android 官方文档 Declaring maximum aspect ratio

2.2. 避免内容拉伸/变形

从16:9变成18:9甚至更长的比例,图片往往被会拉伸变形,此问题常见于应用开屏图。开发者应使用更灵活的布局,以适应不同的屏幕比例。

2.3. 充分利用屏幕空间

开发者应充分利用全面屏显示更多内容。如下图,王者荣耀已修改了 Maximum Aspect Ratio,在全面屏有更宽阔的游戏视野。

3. 虚拟导航键(Navigation bar)优化

3.1. 虚拟导航键样式

为了实现更高的屏占比,屏幕内的虚拟导航键就成了标准功能,如何让其应用界面在视觉上统一,同样需要开发者的积极适配。Android 已经有相关接口允许开发者自定义虚拟键的样式,以下是可供选择的样式。

关于使用哪种样式,我们有以下建议:

建议1:如果页面含有复杂背景/纹理,建议设置为透明,如下图中的桌面和通话界面。

建议2:含「底部Tab」的页面,建议将虚拟键设置为「底部Tab」的颜色,如 MIUI 的相机和小米商城。

建议3:不含「底部Tab」的页面,建议使用背景颜色,如多看阅读。

由于一个应用内含有多种不同的页面,我们希望开发者能当前页面的情况,来选择合适的虚拟键样式,以保证视觉的统一美观。

3.2. 如何修改虚拟键样式

Android 有标准的实现方式, 调用以下接口即可 window.setNavigationBarColor (int color)。在调用该接口时,还需要设置一些flag,详见该接口的注释说明(即下文):

/**
 * Sets the color of the navigation bar to {@param color}.
 *
 * For this to take effect,
 * the window must be drawing the system bar backgrounds with
 * {@link android.view.WindowManager.LayoutParams#FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS} and
 * {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION} must not be set.
 *
 * If {@param color} is not opaque, consider setting
 * {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and
 * {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}.
 * <p>
 * The transitionName for the view background will be "android:navigation:background".
 * </p>
 */
public abstract void setNavigationBarColor(@ColorInt int color);​

4. FAQ

4.1. 这些改动是仅针对 MIUI 系统吗

不是。上述提及的均是 Android 标准接口,且早在几年前就已经存在。因此开发者的任何改动,可以在其余 Android 手机中直接生效。我们相信全面屏会是往后手机设计的趋势,做好相关的适配工作,对于开发者来说是非常值得的。

4.2. 如何测试

目前市面上的小米新机均为全面屏手机,测试方法如下:

  • 升级至 MIUI 9.5 及以上版本
  • 前往「设置 > 全面屏 > 应用全屏运行设置」,找到相关应用,然后打开开关,就可以在全面屏比例下运行应用,以观察应用的表现。

有任何问题可以邮件给我们的项目组 miuishell@xiaomi.com ,会有同事解答相关疑问。

小米开放平台相机各场景下3A操作适配说明

小米开放平台相机各场景下3A操作适配说明

1.Preview

在预览时AF可以由App控制触发对焦,也可以底层自动对焦,推荐使用底层自动对焦。

1.1.App手动对焦设置

  • CONTROL_AF_MODE_AUTO并不是AF自动模式,根据Google定义,是由App进行手动触发。App控制触发对焦逻辑是设置AF为Auto,然后App主动触发对焦。
  • App使用CONTROL_AF_TRIGGER触发对焦。CONTROL_AF_TRIGGER使用建议,CANCEL – START – IDLE;App何时触发对焦由App决定,比方App检测到加速度计和陀螺仪变化达到一定的阈值或者app为扫码软件,检测扫码一直无法解析扫码结果等(因为出现这种场景时物距发生了变化或者焦点模糊),具体场景具体调整。对于扫码等APP还可以设置AF测量区域,CONTROL_AF_REGIONS,尽量使用中心区域作为对焦点。

1.2.AF自动对焦设置

可以先检测AF有效模式,如果支持CONTINUOUS_PICTURE,设置即可,具体如下:

mCharacteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES),CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE))。

CONTROL_AF_MODE设置为CONTROL_AF_MODE_CONTINUOUS_PICTURE。

2.Video

  • 可以先检测AF有效模式,如果支持CONTINUOUS_VIDEO,设置即可,具体如下:
mCharacteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES),CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO))。

CONTROL_AF_MODE设置为CONTROL_AF_MODE_CONTINUOUS_VIDEO。

  • 注释

CONTROL_AF_MODE_CONTINUOUS_PICTURE和CONTROL_AF_MODE_CONTINUOUS_VIDEO的区别是前者在AF时会快速收敛,后者在AF时慢速收敛,因为录制视频时为了防止图像抖动,收敛过程需要慢一点,共同点是二者都为自动对焦。

3.Touch

Touch是为了在预览时对特定的区域进行3A权重提高,以便于得到预期的图像。当touch预览窗口某区域时,通用的操作流程是设置CONTROL_AF_REGIONS,CONTROL_AF_TRIGGER的流程还是CANCEL – START – IDLE。

4.Flash

Flash的实用场景通常在Touch,拍照和录像情况下使用,flash有两种操作模式,手动模式和自动模式,具体操作如下:

4.1.手动模式,即Torch模式

当需要打开flash时,设置CONTROL_AF_MODE为OFF/AUTO模式,同时设置FLASH_MODE为torch即可。

4.2.自动模式

自动模式是flash交给底层AE算法控制,具体如下两种常用模式:

ON_AUTO_FLASH:设置AF_Mode为此模式表示flash由AE根据当前亮度进行打开,关闭。

ON_ALWAYS_FLASH:设置AF_Mode为此模式表示flash每次操作都会打开。

5.拍照

拍照操作流程通常为触发3A,等待3A收敛,获取到3A收敛结果,进行拍照请求。

5.1.触发3A操作

CONTROL_AE_MODE根据是否需要闪光灯设置为ON_AUTO_FLASH,ON_ALWAYS_FLASH,ON。

CONTROL_AE_PRECAPTURE_TRIGGER设置建议 CANCEL-START-IDLE。

CONTROL_AF_MODE设置为AUTO,CONTINUOUS_VIDEO都可以。

CONTROL_AF_TRIGGER设置建议CANCEL-START-IDLE。

5.2.等待3A状态收敛

根据CaptureResult的metadata获取3A状态,如果3A都收敛了即可请求拍照

result.get(CaptureResult.CONTROL_AF_STATE);   //AF_State

result.get(CaptureResult.CONTROL_AE_STATE);   //AE_State

result.get(CaptureResult.CONTROL_AWB_STATE); //AEB_State 

5.3进行拍照请求

CONTROL_AE_MODE根据是否需要闪光灯设置为ON_AUTO_FLASH,ON_ALWAYS_FLASH,ON。

CONTROL_AF_MODE设置为AUTO,CONTINUOUS_VIDEO都可以。

最终下发拍照请求:

mCaptureSession.capture(request, mCaptureCallback, mBackgroundHandler); 

6.参考

https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics
https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
https://github.com/googlearchive/android-Camera2Raw

MIUI Widget适配建议及示例

1.MIUI Widget布局自适应方案建议及示例

1.1.概述

背景见:《MIUI小部件技术规范与系统能力说明》中「小部件技术规范和要求」第八项。

本模块介绍了常用的几类Widget布局实现自适应的方案。

1.2.方案与示例

1.2.1.快捷卡片的自适应方案实践

快捷功能卡片中每个icon的大小是固定的,但是在widget中无法获取具体显示大小,因此如果只写死一套尺寸,在某些模式下,icon会显示不全。

目前采用的方案是,使用2套布局资源,在布局中写死大小,根据Google小部件开发指南中提到的,使用OPTION_APPWIDGET_MIN_WIDTH或者OPTION_APPWIDGET_MAX_WIDTH返回的数值决定使用哪套布局:

先定义2套不同尺寸的layout资源:

//layout_shortcut_large
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/shortcut_icon"
        android:layout_width="53dp"
        android:layout_height="53dp"
        android:layout_gravity="center"
        android:scaleType="centerCrop" />

    <TextView
        android:id="@+id/shortcut_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="@dimen/dp_4"
        android:textSize="24sp" />
</LinearLayout>


//layout_shortcut_small
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/shortcut_icon"
        android:layout_width="28dp"
        android:layout_height="28dp"
        android:layout_gravity="center"
        android:scaleType="centerCrop" />

    <TextView
        android:id="@+id/shortcut_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="@dimen/dp_4"
        android:textSize="14sp"/>
</LinearLayout>

在代码中动态判断使用哪一套布局:

class SimpleWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
    context: Context,
    appWidgetManager: AppWidgetManager,
    appWidgetIds: IntArray) {
        appWidgetIds.forEach { appWidgetId ->
        updateAppWidget(context, appWidgetManager, appWidgetId)
        }
    }

    fun updateAppWidget(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetId: Int,
    ) {
        val appWidgetManager = AppWidgetManager.getInstance(context)
        val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
        if (options == null) {
            return null
        }
        val minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
        val widgetLayoutRes = if (minWidth >= 300)R.layout.layout_shortcut_large else R.layout.layout_shortcut_small
        val remoteViews = RemoteViews(context.packageName, widgetLayoutRes)
        appWidgetManager.updateAppWidget(appWidgetId, remoteViews)
    }
    
    /**
     * 任何option的更改都会触发,无法通过newOptions来判断是否是大小发生了变化
     * 需要将本次的MAX_HEIGHT/MAX_WIDHT记录下来,在下一次触发时比对
     */
    @CallSuper
    override fun onAppWidgetOptionsChanged(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetId: Int,
        newOptions: Bundle
    ) {
        //需要在options change通知里判断,min和max是否发生了变化,如果发生了变化,需要更新布局
    }
}

1.2.2.股票卡片的自适应方案实践

RemoteViews无法动态设置宽高,但是可以在布局中设置宽高,为了实现卡片的自适应,我们不建议在布局中给layout_width和layout_height设置固定值,但是可以通过设置最大和最小宽高来达到自适应的效果;

例如股票通过调整ListView中每个item的maxHeight和maxHeight,来实现自适应(以下按1080*2340分辨率为例):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/stock_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="43.64dp"
    android:minHeight="40.97dp"
    android:background="@drawable/pa_bg_stock_widget_item"
    android:paddingHorizontal="@dimen/dp_7">

    <include layout="@layout/pa_widget_stock_item" />
</RelativeLayout>
  • android:minHeight计算:(418-40*2)/ 3 / 2.75=40.97
  • android:maxHeight计算:(440-40*2)/ 3/ 2.75 = 43.64

计算过程:

在MIUI小部件设计规范中,列出了Widget Host在不同模式下的尺寸:

如表格所示,4*2规格的卡片,其最小显示高度是418px,最大显示高度是440px,我们要求内容区距离卡片外边距最小是40px,因此,对于4*2widget的内容区的最小显示高度为418-40*2;

股票4*2最多显示3条数据,因此每条数据的最小显示高度为(418-40*2)/ 3,换算成dp为40.97dp;最大显示高度类似;

1.2.3.其他方案建议

使用LinearLayout等分布局:

疫情卡片的一种自适应布局实现:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="40px">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="bottom">

        <LinearLayout
            android:id="@+id/item1"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_marginEnd="10dp"
            android:layout_weight="1">

        </LinearLayout>

        <LinearLayout
            android:id="@+id/item2"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_marginEnd="10dp"
            android:layout_weight="1">

        </LinearLayout>

        <LinearLayout
            android:id="@+id/item3"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_marginEnd="10dp"
            android:layout_weight="1">

        </LinearLayout>

        <LinearLayout
            android:id="@+id/item4"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_weight="1">

        </LinearLayout>
    </LinearLayout>

</FrameLayout>

利用LinearLayout的android:layout_height属性,动态分配每个item的尺寸;

注:股票卡片也可以采用该方案进行适配,事实上,所有使用ListView或者GridView的卡片布局,都可以用该方案代替,来达到自适应效果,但是相应地需要进行更多自定义的封装,开发成本更高,但是效果比较理想;

使用RelativeLayout相对布局:

手机管理卡片的一种自适应布局实现:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="40px">

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/score_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentBottom="true"
            android:text="手机很安全,继续保持"/>

        <TextView
            android:id="@+id/score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="100"/>
    </RelativeLayout>


    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="手机垃圾"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="内存占用"/>
    </LinearLayout>

</LinearLayout>

1.3.总结

  • 以上各个方案只是目前为止,可能的部分自适应实践建议,业务需要根据自身情况来判断如何适配
  • 以上各个方案,部分方案可以通过组合的方式,来实现更多效果
  • 以上示例代码中的数值和布局,只具有演示效果,业务需要根据具体情况调整,请勿原样复制

2.小部件加载态建议及示例

2.1.概述

背景见:《MIUI小部件规范》中「无内容场景」。没有配置加载态手机重启或者桌面/负一屏重启会呈现空白卡片,影响整体体验,本模块介绍了推荐的加载态实现方案。

2.2.方案

默认展示加载态(initialLayout指定加载态布局资源),当收到update广播时更新为实际的布局

# 工程结构
.
└── src
    ├── main
    │   └── java
    └── res
        ├── drawable
        │   └── loading.webp
        ├── drawable-night
        │   └── loading.webp
        ├── layout
        │   ├── layout_example.xml
        │   └── layout_loading.xml
        └── xml
            └── app_widget_simple.xml

layout_example.xml 正常的布局资源

...

layout_loading.xml 加载态布局资源

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="fitXY"
    android:src="@drawable/loading.webp" />

app_widget_simple.xml 小部件配置资源

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="xxx"
    android:minHeight="xxx"
    ...
    android:initialLayout="@layout/layout_loading.xml"/>

AppWidgetProvider 使用正常布局文件创建RemoteViews

public class ExampleWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        for (int appWidgetId : appWidgetIds) {          
            // 正常布局文件创建RemoteViews 
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
            R.layout.example);
            ...        
        }
    }
}

备注:以上方案仅做参考。

如何修改小米开发者账号密码与账号信息

开发者账号密码修改

适用场景:

公司人员交接,开发者账号绑定的手机号码及邮箱可正常接收查看验证码。

操作方法/路径:

1、登陆小米账号管理页面(https://account.xiaomi.com);

2、完成对账号密码的修改(安全邮箱、安全手机号码等均可进行修改)。

企业开发者账号更换登录邮箱

适用场景:

原注册员工离职,无法找回账号;需要更改开发者管理应用;注册或者更改公司名称提示“已存在”。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式提供相关信息,申请协助处理。

工单主题:【企业开发者账号更换登录邮箱】

工单问题描述:

  • 贵公司企业名称:
  • 贵公司营业执照扫描件:
  • 需要绑定到小米账号的新的登录邮箱(公司必须使用企业邮箱且该邮箱未注册开发者账号):
  • 需要绑定到的新登录邮箱所对应的小米账号ID(非手机号码):
  • 原账号下应用的名称和包名:(未上传过应用,请填写“无”)
  • 信息变更申请表:点击下载模板(请加盖公章)
  • 公司座机和联系人手机:

注:登录邮箱和小米账号必须是一对一绑定的,且没有注册过小米开发者,

请您先和公司内部同事进行确认贵司的企业营业执照是否已被其他部门注册了企业开发者,如果是,请贵司内部进行协商后确认账号是否统一管理。

注:以上解决方式仅限于仅开通开发者且未开通广告商的账号,如旧账号同时开通了开发者账号和广告商账号(开发者需自行内部核实),请先按照以上邮件信息格式联系ad-audit@xiaomi.com,进行核实账号资质,以同步推广账号和资金。因未先联系广告邮箱带来的后续问题,需开发者自行承担。

开发者账号注销

适用场景:

员工离职账号无法找回、账号不再使用、账号需注销重新注册。

注:开发者账号注销后,其下的应用及已接入服务将一并删除,请谨慎选择。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式进行反馈:

问题描述主题:【开发者账号注销申请】

问题描述内容:

  • 贵公司企业名称:(个人开发者可不提供)
  • 企业营业执照扫描件:(个人开发者可不提供)
  • 法人或个人开发者手持身份证:
  • 加盖企业公章或个人开发者签名的注销申请书:(申请内容自拟,无明确要求)
  • 注册邮箱账号:
  • 注销原因:

2、收到反馈后,我们会在1-2个工作日内为您处理完成。

个人开发者账号转换为企业开发者账号

适用场景:

原有开发者账号无法满足上传应用需求,需要转换开发者账户类型。

注:不支持企业开发者账号转换为个人开发者账号;开发者账号类型转换后,其下的应用数据无任何影响。

操作方法/路径:

1、登录小米开放平台,点击右上角用户名“资料修改”;

2、点击基本资料账户类型处“升级为企业开发者”,按后续提示操作即可。

企业开发者账号主体、认证信息修改

适用场景:

公司营业执照更新、公司名称变更。

注:修改完主体信息的开发者账户,需在应用apk包中修改开发者名称,才可以在应用中显示最新主体名称。

操作方法/路径:

1、方式一:登录开发者账号,进入右上角资料修改界面,在该页面即可修改主体信息。

修改开发者账号主体信息是需要提交审核的,审核时间是1-3个工作日,审核期间不会影响到账号内的应用状态的,最终审核结果会通过邮件的方式发送到开发者邮箱。

注:务必保证填写的公司名称、公司注册名称等信息与营业执照内公司名称等相应信息保持一致以及应用信息内有关开发者信息与开发者账号主体信息一致。

2、方式二:通过认领的方式来实现应用主体的迁移。

在小米开放平台创建开发者账号后,再通过认领流程将该应用转移至开发者新的账号下管理。

企业开发者账号注册流程https://dev.mi.com/distribute/doc/details?pId=1145

应用认领操作指南 :https://dev.mi.com/distribute/doc/details?pId=1076

小米开放平台应用发布常见问题

1、如何修改应用名称?

如果应用已被审核驳回,您可以重新提交版本更新时在应用信息重新填写相关信息;

如果应用已经审核通过,在提交应用版本更新时是可以修改应用名称的;

如果应用存在较大改动建议您可以先申请下架后再重新提交审核。

注:应用名称半年内修改不得超过三次。

注:安装在手机上显示的应用名称读取自您提交的apk,请您务必保证在提交应用时填写的应用信息内应用名称与安装在手机上显示的应用名称保持完全一致。

注意:任何显示应用名称的地方(资质文件内、应用信息内、安装在手机上显示的等等)都需要保持一致的。

2、应用相关材料如软著等,可以授权吗?

所有资质文件的所属主体信息需与提交应用审核使用的开发者账号主体信息保持一致。

注意:小米同学不建议您使用授权书面说明文件。(授权证明、合作协议都是没有具体模板的,需要开发者自拟,需写明具体授权内容及授权方,并加盖授权双方公章;子母公司之间可以提供授权使用书面证明并加盖双方公章) 。

具体特殊行业类应用资质要求请参见文档:特殊行业资质要求:https://dev.mi.com/distribute/doc/details?pId=1139

提交位置:资质文件提交在特殊资质代理证书一栏即可。

注意:在行业资质处提供的材料是无法删除的,如果您在原材料的基础上提交新材料,若未附带原材料一起提交,新材料会将原材料替换掉。

3、怎么能更改应用的账号管理?

1、全新认领功能已上线,您可以参考以下流程提交认领申请将应用从一个开发者账号转移至其他开发者账号管理(此方式您需要两个开发者账号) 。

应用认领操作说明:https://dev.mi.com/distribute/doc/details?pId=1076

2、您可以通过开发者账号的重新绑定来更换账号的管理权,变更绑定注册邮箱的本质是将开发者账号从旧小米账号换绑至新小米账号(该小米账号从未注册过开发者账号)。

开发者账号更换注册邮箱/重新绑定注册邮箱:https://dev.mi.com/distribute/doc/details?pId=1068

注: 小米开发者账号是通过小米账号内绑定邮箱注册的,所以一个手机号只能注册一个小米账号,一个小米账号只能注册一个开发者账号,一个邮箱只能绑定一个小米账号,

变更绑定注册邮箱的本质是将开发者账号从旧小米账号换绑至新小米账号的,所以必须提供新小米账号(未注册开发者账号)对应的小米id和绑定邮箱账号,否则是无法成功更换绑定的。

4、创建新应用时,提示包名被占用,怎么办?

包名一旦创建后是无法修改且应用一旦删除所有数据将清空,如:下载量、评论,

小米应用商店系统逻辑要求,同一个包名仅可使用一个账号创建,

如您在创建过程中提示包名已被占用,可以参照以下两种方案:

1、应用认领操作说明将应用认领至新账号下管理。请您参考应用认领操作指南文档:应用认领操作指南

2、如果无法进行应用认领并且不清楚登录账号的,建议您可通过侵权流程维护您的权益:侵权文档

5、应用无法提交,提示“APK解析签名错误!”,如何解决?如何修改签名文件?

小米应用商店上传的应用包都必须经过签名,且更新版本时签名需保持一致;如果没有签名或者签名不一致就会提示“APK解析签名错误!”,我们建议您首先自行比对签名,如比对后仍未发现问题,可以提供应用名称,应用包名,apk包和错误的视频或者截图到工单问题工单系统,与我们取得联系。

应用上架后签名无法更改或找回,请自行与贵司技术仔细核查确认,如果签名丢失或者需要更换,需要申请删除原应用后,再重新提交上传新apk。

6、应用如何进行同版本更新?

根据小米应用商店系统逻辑要求,将apk_hash改变后,即可进行同版本更新。

7、应用认领到新账号下,原有应用数据等信息会丢失吗?

应用认领后下载数据等信息将一并同步至新账号下,数据等信息不会丢失,原账号不做保留。

8、如何进行版本回滚?如新版本产生严重BUG。

您可以选择进行版本回滚,或者修复BUG发布新版本。

目前小米应用商店仅支持回滚至上一版本,如果需要回滚,请您提供以下信息至工单:

1、应用名称、应用包名、应用id

2、应用所在应用管理界面截图和该应用所在开发者账号资料截图

3、申请内容(如您的具体问题、您的需求、完整问题截图等材料)

9、应用驳回但是不能编辑资料,是什么原因?

应用驳回状态无法编辑资料,如果需修改,建议您可在重新提交发布应用的时候修改。

10、可以管理自己的应用评论吗?想添加评论置顶、删除。

小米应用商店设计了反垃圾程序、算法和人工审核评论机制,以防护恶意评论。

我们已知悉您的反馈,并会对相应机制进行优化升级,但目前开发者站暂不支持开发者对于用户评论的管理(置顶、删除等),还请知悉。


11、应用创建时选择定时上线如何更改约定时间?

如您需取消定时发布,则需撤销应用审核后重新发布或发送以下内容至工单系统才能取消或更改发布时间:

1、应用名称

2、应用包名

3、应用所在应用管理界面截图和该应用所在开发者账号资料截图

4、 申请内容(请确定是取消还是更换时间,若为更换时间请告知新的上线时间)

以上内容为应用发布与管理常见问题集合,我们将会不断更新此文档。如您仍有问题,可进入问题工单系统,与我们取得联系。

为什麽要进行线上问答移动应用制作

线上咨询问答服务在互联网时代下日益流行起来,对此,充分结合大众对于咨询问答模式的需求,线上问答移动应用制作在时代的需求下日益成为一个趋势,让大众的咨询方案只想要在网络上进行就能够实现。

一、为什麽要进行线上问答移动应用制作?
1、能够迎合大众对于知识解析方面的需求
当前社会上的咨询服务日益流行,这些咨询服务所涉及的范围也比较广泛,即有包括教育方面的知识点、也有关注大学生学业规划以及职场规划、以及成年人职场发现等等方面的内容,对此,进行线上问答移动应用制作能够解决用户在这方面的一些问题需求,假设说可以解决用户关于这一方面的问题,这么也就能够取得大众对于该官方的喜爱,借此机会将该用户群体发展为官方的高粘性用户。
二、线上端的操作渠道为用户提供便捷
现在大众都会喜欢通过移动端进行线上操作,这么进行线上问答移动应用制作恰好能够迎合大众的行为习惯,让大家对于想要了解的问题内容能够在手机端进行操作,围绕着大众的行为方案来提供功能板块能够提升用户在官方的整体使用体验感

;并且线上问答移动应用制作面向线上市场用户,要知道现在线上用户的规模可是处于一种持续扩大的过程,这么也能够为线上问答移动应用制作提供更多的发展机遇。
2、线上问答移动应用制作提供哪些便捷服务?
1、问答咨询模式展示
线上问答移动应用软件为大众展示关于问答咨询模式的流程以及相关注意事项,方便用户进行了解。
二、问答区域分类
关于不同的问答区域,线上问答移动应用软件会为用户进行细致的区分,帮忙助力用户查看。
三、专家资历查询
用户通过线上问答移动应用软件能够对不同领域的专家资历进行查看了解,保障问答成果的可行性。
四、在线问答服务发布
用户只想要在移动应用客户端上进行问答服务需求发布以及相关设置即可完成该流程。

以上便是线上问答移动应用制作的相关信息内容介绍,假设有系统制作、移动应用制作或者是小程序制作需求,欢迎咨询我们。

类似京东移动应用制作可以为用户提供什麽便捷

电商官方正在现在的互联网时代下迅速发展,对此,也让类似京东移动应用软件制作应运而生,为有想要的用户搭建了一种综合性的电商服务官方。

一、类似京东移动应用软件制作概述
现在的类似京东移动应用软件制作对于企业本身来看,也是一个关键的工程,毕竟为了带动官方的发展,想要更为多方面的融合线上互联网市场,以达到更大规模的市场销量。类似京东移动应用软件制作符合当前企业的发展趋势,可以结合官方来完善企业的各项机制体制,具有关键的意义。
2、类似京东移动应用软件制作可以为用户提供什麽?
1、官方信息内容管理功能
官方自身也是具有很多的信息内容想要处理,并且从信息的多元化方向来说,类似京东移动应用软件制作可以建立数据管理官方,也就是可以更为准确的管理各方面数据信息,能够进一步提升官方在管理方面的整体效率,符合官方建立系统化官方个性化需求。
二、商品信息资讯推送功能
类似京东移动应用软件制作能够将各类信息内容进行管理

,包括对于优惠的资讯或者是对于一些商品的促销信息等等,都能够通过官方来推送给用户,以便于用户对这些商品的优惠资讯进行了解,官方也能够借此来提升用户的引流程度。
三、具体信息内容查看
类似京东移动应用软件制作能够将商品的具体信息进行整合,以便于用户端能够通过官方来对之这些数据信息进行了解,参考商品的性价比,这样就能够判断该商品现在的费用是否具有购买性价比
四、线上咨询官方
官方能够方便用户进行线上咨询,以客服的方案来解决用户在消费过程中所遇到的各类问题,优化用户在官方的整体购物体验,方便发展用户的粘性。

网购模式的流行,使得类似京东移动应用软件制作在现阶段日益备受瞩目,通过建立一种综合性的电商服务官方,能够为有想要的用户提供便捷购物服务,优化用户的购物体验感。

小米开放平台选择邮寄纸质材料方式认证,这些材料具体是哪些?

您在填写完成企业信息后选择邮寄纸质材料,我们将会在审核通过后短信通知您提供相应材料。

使用纸质材料审核的企业,要求提供字迹清晰并加盖公章的材料:

  • 企业认证申请表(在您填写完企业信息后,选择点击寄材料,会自动生成该申请表)。
  • 三证合一的营业执照副本复印件
  • 法定代表人身份证正反面复印件
  • 账户管理人身份证正反面复印件(如果法人亲自管理,则提交法人的即可)

小米开放平台海外开发者如何注册开发者账号?

针对海外开发者账号及应用分发问题我们拥有专门海外开发者支持专员Xiaomi App Store Overseas Developer Support Team,请您将问题反馈至邮箱overseas-dev@xiaomi.com,海外开发者账号后台入口:https://dev.mi.com/en

海外版应用商店目前暂不支持pc端查看应用,请您使用海外版手机查看。