android云打包工具常用的推荐

Android云打包工具是一种在线应用打包工具,它可以将开发者上传的应用源代码自动打包成APK文件并提供下载。相比传统的本地打包方式,云打包工具具有操作简便、速度快、无需安装环境等优势。本文将从原理和详细介绍两个方面来介绍Android云打包工具。

一、原理

Android云打包工具的原理是将开发者上传的应用源代码通过一定的算法进行编译、打包和签名,并生成APK文件,最终提供给用户下载。其主要流程如下:

1. 用户上传应用源代码

开发者需要将自己的应用源代码上传至云打包工具平台,支持多种上传方式,例如Git、SVN、FTP等。

2. 云打包工具进行编译打包

上传完成后,云打包工具会将应用源代码进行编译、打包和签名。这一过程需要一定的时间,具体时间长短取决于应用复杂度和云打包工具的性能。

3. 生成APK文件

编译打包过程完成后,云打包工具会生成APK文件,并将其提供给用户下载。用户可以在下载完成后进行安装和使用。

二、详细介绍

1ipa打包. 功能介绍

Android云打包工具主要提供以下功能:

(1)支持多种上传方式,例如Git、SVN、FTP等。

(2)支持多种开发语言,例如Java、Kotlin等。

(3)支持多种打包方式,例如Release、Debug等。

(4)支持多种证书类型,例如自签名证书、第三方证书等。android应用开发 页面布局

(5)提供打包进度和结果反馈。

(6)提供APK文件下载链接。

2. 优势介绍

相比传统的本地打包方式,Android云打包工具具有以下优势:

(1)操作简便:用户只需要上传应用源代码,云打包工具会自动进行编译、打包和签名,无需安装环境和配置开发工具。

(2)速度快:云打包工具采用高性能服务器和优化算法,可以大幅缩短打包时间。

(3)多样性:云打包工具支持多种上传方式、开发语言、打包方式和证书类型,可以满足不同开发者的需求。

(4)安全性:云打包工具采用多重安全措施保护用户数据和应用源代码,例如SSL加密、访问控制等。

(5)稳定性:云打包工具采用高可靠性的服务器和备份机制,可以保证打包过程的稳定性和可靠性。

综上所述,Android云打包工具是一种非常实用的在线应用打包工具,可以提高开发效率、简化操作流程、保障数据安全

和提高打包质量。

网站封装成电脑软件怎么实现的?

在数字化时代,越来越多的企业投入大量资源开发网站以吸引用户。然而,另一种趋势也在逐渐崛起,那就是将网站封装成电脑软件。这种方式能够通过在用户电脑上提供一个独立的应用程序来改善用户体验。在本文中,我们将详细介绍这一技术的原理和实现方法。

原理:

将网站封装成电脑软件的过程又称为”Web封装”。其核心原理是将网站的内容和功能融合到一个独立的桌面应用程序中,通过利用操作系统的资源来提高性能和交互。

这种技术的基础是一种称为”WebView”的组件,它可以在轻量级的窗口环境中渲染和展示网站内容。WebView通常采用了与浏览器相同的引擎(如Chrome的Blink引擎、Firefox的Gecko引擎等),因此能够保持与浏览器平台的一致性。在软件内运行网站也意味着开发者可以更自由地控制整个界面的展示方式,为用户创造一个全新的交互体验。

实现方法:

1. 选择技术栈

将网站封装成电脑软件需要选择合适的技术栈。当前主流的Web封装技术包括:

– NW.js:基于Chromium和Node.js的桌面应用开发工具。

– Electron:由GitHub开发的基于Chromium和Node.js的跨平台桌面应用开发框架,具有丰富的插件和社区支持。

选择合适的技术栈主要取决于项目需求和开发团队的掌握情况。

2. 开发桌面应用程序

使用所选技术栈根据项目需求开发桌面应用程序。这一阶段主要包括:

– 设定窗口大小、位置等属性。

– 嵌入WebView组件,并设置其加载的网站地址。

– 针对不同的平台(如Windows、macOS、Linux)进行适配。

3. 集成设备功能和API

虽然Web应用程序可以在桌面应用程序内运行,但它们默认不能直接访问操作系统资源和功能。这时候需要在基座应用程序中集成对应设备功能和API,然后将它们暴露给内部的Web应用程序。这样一来,Web应用程序就可以访问操作系统资源,如文件系统、网络、硬件等。

4. 进行性能优化

由于网站需要在一个独立的程序中运行,通常会出现一些性能问题。为了提高桌面应用程序的性能,开发者需要对其进行优化,这可以通过以下措施:

– 优化Web应用程序代码,减少不必要的库和插件。

– 利用多进程和多线程特性,实现任务并行处理,提高性能。

– 使用硬件加速功能,减少资源占用。

5. 打包和发布

在完成桌面应用程序开发和优化后,需要将其打包成各个平台的可执行文件,然后进行发布。对于跨平台的桌面应用程序,需要分别打包成Window网页封装为apps、macOS和Linux等平台的可执行文件。在打包过程中,需要注意包含所有依赖库和资源文件。

总结:

将网站封装成电脑软件带来了许多优势,如改进用户体验、更好地控制界面展示、访问本地系统资源等。要实现这一

苹果app打包

目标,需要选择合适的技术栈、开发桌面应用程序、集成设备功能和API、进行性能优化和打包发布。遵循这些步骤,我们可以将网站成功地封装成电脑软件。

在线平台app开发比较好的推荐

随着移动互联网的迅猛发展,手机应用程序也成为了人们生活中不可或缺的一部分。在线平台app成为了人们生活和工作中的重要组成部分,这种类型的app应运而生。那么,什么是在线平台app?在线平台app的开发原理和详细介绍是怎样的呢?下面将对这些问题进行解答。

什么是在线平台app?

在线平台app是一种提供在线服务的手机应用程序,用户可以通过这种应用程序使用各种在线服务。例如,网络购物平台app、社交媒体平台app,还有在线学习平台app等等。在线平台app可以说是实现“一切皆可在线”的工具,让人们不必出门就可以享受各种服务,方便快捷。

在线平台app开发原理

在线平台app的开发原理可以概括为以下四个步骤:

1.需求分析和设计

在开发在线平台app时,首先需要对用户的需求进行分析。在分析用户需求的基础上,进行界面设计和功能设计。这样能够确保最终开发

出的在线平台app能够满足用户需求,同时界面美观、易用。

2.开发前端和后端

在线平台app中,前端负责界面展示和交互,后台负责数据处理和存储。前端通常使用HTML、CSS和JavaScript等技术进行开发,后端则使用不同的语言和框架进行开发。例如,Python、Java、PHP等,框架包括Spring、Django等等。

3.数据存储和服务调用

在开发完前端和后端之后,需要对数据进行存储和服务进行调用。在线平台app的数据通常分为用户信息和应用程序信息两种。存储数据可以使用关系型数据库和分布式存储系统等技术。调用服务可以使用RESTful等API接口。

4.测试和发布

开发完在线平台app之后,需要进行测试和发布。测试主要包括功能测试和性能测试,保证应用程序的稳定性和安全性。发布则需要将应用程序上传到应用商APP在线封装店,例如苹果商店和安卓市场等。

在线平台app的详细介绍

在线平台app的使用者是非常广泛的,包括了商家、个人、学生、教育机构、政府机构、组织等。以下列举几个比较常见的在线平台app介绍:

1.淘宝

淘宝是国内最大的在线购物平台,是一个综合性的C2C电子商务网站。淘宝提供了丰富的商品和服务,用户可以在上面购买各种各样的商品,还可以通过淘宝店铺进行个性化定制、代购等服务。淘宝app提供了安全便捷的移动购物体验,随时随地购物便捷。

2.微信

微信是一款社交聊天软件,也是国内最大的社交媒体平台。用户可以在微信中聊天、分享新闻、图片、视频、音乐等,订阅公APP在线开发众号、加入群组、进行语音视频通话等。同时,微信还提供了支付功能,用户可以在微信上进行转账、支付账单、购买商品等服务。

3.知乎

知乎是一个知识共享和传播平台,在知乎上用户可以提问、回答、分享知识。知乎上的问题涉及各种领域,例如科学、技术、文化、艺术等,而且都是高质量的内容。在知乎app上,用户可以随时随地学习知识、交流思想。

总结

随着移动互联网的发展,在线平台app已经成为了人们生活和工作中的必备工具。通过对在线平台app的开发原理和详细介绍,我们可以更好地理解在线平台app的构成和实现方式,也可以更好地选择符合自己需求的在线平台app。

app开发不是仅涉及部分领域?

移动应用程序(或称为APP)开发是一项广泛而复杂的领域,涉及多个方面的技术和知识。在开发一个APP时,需要技术人员、设计师、测试人员和项目管理人员合作来实现,以确保应用达到最佳效果。

其中,最基本的技术就是编程语言。在开发移动应用程序时,最常用的编程语言是Java和Swift。Java用于开发Android应用程序,Swift用于开发iOS应用程序。除此之外,还有像C、C++和Python等编程语言也被应用于移动应用程序开发。

另外,移动应用程序开发也需要掌握移动设备的操作系统(OS)。Android和iOS是目前最广泛使用的移动操作系统,开发人员需要对它们的API和SDK非常熟悉,才能充分发挥移动应用程序的能力。

在开发移动应用程序时,还需要考虑应用程序的用户界面(UI)和用户体验(UX)。良好的UI和UX可以提高应用程序的可用性、易用性和用户满意度。这一方面需要设计师和可用性专家的协作,其中包括界面设计、颜色选择、字体使用、用户交互、导航模式等等。

移动应用程序的开发还必须考虑应用程序的功能性需求和性能。尤其在今天,随着人们对应用程序速度和性能的要求越来越高,程序开发人员必须掌握移动应用程序开发的最佳实践,并优化代码、测试和调试,以确保用

户获得最好的APP体验。

安全也是移动应用程序开发中不可忽视的一个重要方面。开发人员需要考虑应用程序的数据安全、安装程序的安全、开发工具和服务器的安全等等。特别是当应用程序涉及个人敏感信息时,安全问APP开发题更是不容忽视。

最后,移动应用程序开发还需要考虑应用程序营销和推广。开发一款出色的应用程序是一回事,但如何让人们知道它、使用它并喜欢它是另一回事。因此,行销人员和项目管理人员必须制定全面的市场推广策略,包括用户调查、定价、广告投放、社交媒体推广等等。

综上所述,移动应用程序开发是一个快速发展、高度复杂的领域,需要开发人员熟悉多种编程语言、掌握移动设备的OS、专注于UI和UX设计、优化性能和安全、以及制定市场推广计划,这些都是可以极大地影响应用程序的成功。

app开发roadmap需要注意哪些细节?

App开发的roadmap指的是一APP个app开发从初始概念到最终发布的完整路线图,包括需求分析、设计、开发、测试、部署和维护等各个阶段,如下所示:

1. 需求分析阶段

在这个阶段中,你需要明确你的app的目标用户、他们的需求和使用场景。通过调研市场和用户,了解他们的诉求和需求。你还需要考虑

app的特性、功能以及其它需求,以便为设计和开发流程做好准备。

2. 设计阶段

一旦经过需求分析阶段,你就应该开始图形化的设计app的界面和用户体验(UI/UX)。这个过程通常包括手绘草图、线框图、低保真和高保真原型等。你要考虑到如何最大限度地提高用户的易用性、使得app易于导航、以及如何使app界面清晰明了。

现在,设计师们可以使用为设计师专门开发的app或者平台来处理这些需求,例如 Sketch、 Figma 等。

3. 开发阶段

一旦确定了app的设计,下一步是开发。这通常需要程序员使用编程语言,如Java、Swift等构建应用程序。需要提前明确如何组织代码,在哪里储存应用程序数据以及如何完成逻辑。也可以在这个阶段构建服务器架构等。

4. 测试阶段

在开发的每个阶段,你都需要测试应用程序的功能。在这个阶段,得益于您提前编写了单元测试,您现在需要确保所有的编码符合要求。

5. 部署阶段

最后一步是将你的app部署到相应的应用程序商店或者发布到你自己的服务器上。确保你的App符合苹果的App Store和Google Play等应用程序商店的要求。确保您的app符合最终用户的需求,同时提供应用程序)的数据管理和集成,例如社交网络和支付系统等。

6. 维护阶段

最后,你需要不断地更新你的应用程序来满足用户需求。确保你的app能够在常见的操作系统和设备上运行,并解决与新操作系统版本和设备的兼容性问题。你需要不断跟进和优化运行性能,保障用户体验。

总结:

App 开发是一个综合而复杂的过程,其中各个阶段需要经过认真考虑和充分准备。以上就是一个app开发的roadmap流程介绍,如果您有兴趣进一步学习和深入了解如何开发app,可以参加使用相关的应用程序开发工具或平台,例如 Xcode 和 Android Studio 等APP开发

智微开卡软件打包是什么意思?

把页面封装成app

智微开卡软件打包:原理与详细介绍

智微开卡软件打包是一种在互联网领域中广泛使用的软件,旨在使用户能够轻松创建和管理智能卡。智能卡是一种便携式存储设备,可以存储数字信息,如电话号码、密码、银行帐户等。智微开卡软件打包可让用户在无需专业知识的情况下轻松制作和管理智能卡。下面将详细介绍这一技术的原理和应用。

一、智微开卡软件打包原理

1. 数据读取与存储

智微开卡软件的核心功能是读取和存储数据。与传统的物理卡片相比,智能卡具有更高的存储容量,可容纳大量数据。通过智微开卡软件,用户可以将数据输入到程序中,然后将其编码到智能卡上。编码后的智能卡可用于各种应用程序,如手机支付、电子门禁等。

2. 加密与安全

数据的保密和安全至关重要。智微开卡软件打包采用加密技术,确保用户数据的安全。一旦数据被编码到智能卡上,它将受到高度保护,只有具备相应权限的人员才能访问和解密。这样,用户可以确保他们的数据不会被未经授权的人窃取或篡改。

3. 用户友好的界面

智微开卡软件打包提供直观、易于使用

的界面。用户可以通过简单的操作,如拖放或点击,轻松完成智能卡的创建和管理。清晰的图形界面还可以帮助用户轻松定位到所需功能,从而节省时间和精力。

二、智微开卡软件打包详细介绍

1. 应用领域

智微开卡软件打包广泛应用于多个领域,如:

– 金融行业:如银行卡、信用卡、会员卡等

– 公共交通:如公交卡、地铁卡等

– 餐饮服务:如餐厅优惠卡、会员卡等

– 企业和政府部门:门禁卡、员工身份卡等

2. 功能特点

以下是智微开卡软件打包的一些主要功能特点:

– 支持多种智能卡类型:如接触式卡、非接触式卡等。

– 支持页模板:用户可以选择预定义的模板,快速创建智能卡。

– 可定制化设置:用户可根据自己的需求,调整卡片的颜色、字体、背景等。

– 密码保护:保护用户的私人数据不被未经授权的人访问。

– 批量操作:便于用户同时处理多张智能卡。

总之,智微开卡软件打包作为一款强大的智能卡制作和管理工具,无论是企业还是个人用户,app后台都能从中受益匪浅。通过该软件,用户可以方便地定制和管理智能卡,满足各种应用需求。同时,其加密技术和用户友好的界面也为用户提供了安全、高效的操作体验。

全网公敌ipa是什么意思?

全网公敌ipa,是近年来互联网上出现的一种新型网络攻击手段。它可以通过篡改DNS服务器的方式,将用户的访问请求指向恶意的IP地址,从而实现对用户数据的窃取、篡改和监控等行为。全网公敌ipa的出现,给互联ios自签网的安全带来了巨大的威胁,下面就来详细介绍一下其原理和特点。

一、原理

全网公敌ipa的攻击原理非常简单,其核心是通过篡改DNS服务器的方式,将用户的访问请求指向恶意的IP地址。DNS服务器是域名系统(Domain Name System)的核心组成部分,它的作用是将用户输入的域名转换成相应的IP地址,从而实现访问网站的功能。而全网公敌ipa攻击者,则是通过攻击DNS服务器,篡改其中的解析记录,将用户的请求指向自己的服务器,从而实现对用户数据的窃取、篡改和监控等行为。

具体来说,全网公敌ipa攻击者会利用各种手段,比如DNS劫持、DNS缓存投毒等,来篡改DNS服务器的解析记录。当用户在浏览器中输入网址时,DNS服务器会将其解析成相应的IP地址,并将请求发送到该IP地址对应的服务器上。而攻击者则利用篡改后的解析记录,将用免签安装iOS户的请求指向自己的服务器,从而实现对用户数据的窃取、篡改和监控等行为。

二、特点

1. 隐蔽性强:全网公敌ipa攻击者通过篡改DNS服务器的方式,将用户的请求指向自己的服务器,而用户并不知情。因此,攻击者的行为很难被发现。

2. 影响面广:全网公敌ipa攻击可以影响到任何一个使用DNS服务器的用户,因此其影响面非常广泛。

3. 攻击手段多样:全网公敌ipa攻击者可以利用各种手段来实现攻击,比如DNS劫持、DNS缓存投毒等,攻击手段非常多样化。

4. 危害严重:全网公敌ipa攻击者可以通过篡改DNS服务器的方式,窃取用户的敏感信息,比如账号密码、信用卡信息等,从而造成严重的财产损失和个人隐私泄露等问题。

三、防范措施

为了防范全网公敌ipa攻击,用户可以采取以下措施:

1. 使用可靠的DNS服务器:用户可以选择使用可靠的DNS服务器,比如Google DNS、OpenDNS等,这些DNS服务器有较强的安全性

和稳定性,可以有效防范全网公敌ipa攻击。

2. 安装杀毒软件:用户可以安装杀毒软件,及时发现和清除恶意软件,提高系统的安全性。

3. 更新系统补丁:用户需要及时安装系统补丁,修复系统漏洞,提高系统的安全性。

4. 加强密码安全:用户需要加强密码的安全性,采用复杂的密码,并定期更换密码,避免密码被攻击者窃取。

总之,全网公敌ipa攻击是一种非常危险的网络攻击手段,用户需要采取有效的防范措施,提高自身的网络安全性。

我们公司要开发一款APP,需要提前准备哪些前期事项呢?

我们公司要开发一款APP,需要提前准备哪些前期事项呢?

  很多企业在不断发展的过程中,都会有一种移动应用的梦。

不过做一种移动应用可不是一件容易的事情,要想运营好移动应用更不是一种轻松的事情,这么选用定制移动应用的企业应该怎么制定合理的计划?作为APP制作专家,一门APP总结上万家企业定制制作经验,明确企业在制作一款移动应用之前应该做一种具体的规划,其内容包含以下几点:

  一.转换思维,将传统的营销思维转换成互联网思维

  互联网思维这个概念喊了好几年,真正能摸透它的人早已经成功了。

移动应用就是典型的属于互联网市场下的产物。

一门APP发现,随着智能手机的普及,手机成为链接人们之间最紧密的工具。

移动应用恰巧可以进入其中,打开每一种人的防线,轻而易举的获取用户关注度,实现下载使用的双赢。

所以这样的市场大环境下诉求企业使用互联网思维去定制制作、运营移动应用。

  二.明确自己的移动应用定位,知道今后运营方向

  第一在制作移动应用之前,很多企业都要知道,制作的这个移动应用可以做什麽?给用户提供了什麽功能?而且分析市面上现有的解决方式,了解我们将要提供的解决方式对比先有的方式优势在什麽地方?给用户一种选用移动应用的理由。

采集大量的数据之后,更能够将数据汇成图表以便可以明确直观的分析。

  三.确认项目整体方式,对移动应用整体进行系统的规划

  一种移动应用项目在进行系统的制作之前,第一要确认项目整自己搭建app体方式,整个项目的规划,大体框架,也就是说第一要确立产品原型,进入项目评审阶段。

经过企业与移动应用制作定制团队反复确定之后,最终形成一种初步的产品模板。

  四.有钱不过不任性,定制制作移动应用合理,今后运营舍得花钱

  企业的流动资金很宝贵,所以软件打包每一分钱都要花在刀刃上。

一门APP意

见每一种制作移动应用的企业,可在一期制作时,精简移动应用功能,上架发布之后获得市场积极反馈时,立马进行2次制作。

当然在制作的时候,要对UIUX设计、产品运行等方面进行针对性的测试。

在移动应用制作完成之后企业可针对市场情况加大力度去推广和运营。

通过各种手段,递增下载量和使用量,这样一种移动应用就可以运转起来了。

  五.做好口碑,分享内容,提升同质化情况下的品牌竞争力

  目前广告做的越来越精致,可人们内心对于口碑传播信息的信任度依旧是偏高。

不论是口口vue打包成app相传还是朋友圈微博的更新,都在证明这一件事情。

口碑来源于先前用户的体验感,这么企业在运营移动应用的时候,是否能够提升用户的体验度,制造可供用户分享的内容呢?例如达到成就分享、分享可递增经验值等等。

通过这样更为能够递增用户黏性,在同质化严重的市场下获得关键的竞争力。

  当然也有不少企业有许多自己的想法,对于移动应用定制制作的诉求和愿望也不尽相同。

不可否认的是,许多成功的移动应用就因为有了这样的清晰的规划才能成功,不过也有少数的移动应用不做规划也能成功。

不过可以用个例去代表整个行业情况吗?还是可以确认自己的移动应用就是少数的那一种?激烈的市场中,为什麽不给自己增添一些保障呢?这么选用做一份细致的规划,选用一门APP,就是一种明智的选用。

我们公司要开发一款APP,需要提前准备哪些前期事项呢?

更多资讯请关注www.yimenapp.com

为APP实现QQ分享能力、为APP实现QQ登录能力,一门APP推荐QQ互联模块接入

为APP实现QQ分享能力、为APP实现QQ登录能力,一门APP推荐QQ互联模块接入

QQ登录、分享如何做?
相信一门APP能够让您制作变得很轻松。

这里分享一种demo供大家参考。

一.使用模块

二. 编译自定义loader

三. 在腾讯自由官方管理中心创建应用,提交审核,拿到appkey和appId

四. 在项目代码中找到config.xml

添加代码

复制代码

五.拼接urlScheme和appkey

urlScheme =》tencent加上您的appId

Appkey =》appkey

填入第4步的位置

六. 能够在他的代码里边找相应的方法代码……

七.备注:腾讯自由官方项目未审核通过,有些功能会出问题,分享操作先登录,登录先验证安装。

附图:

代码:

QQ

将网页链接打包成app

检测安装

QQ登录

获取用户信息

分享文本

分享图片

分享新闻

分享音乐

分享视频

分享说说

apiready = function() {

qq = api.require(‘QQPlus’);

};

function fnEvent(tag) {

switch (tag) {

case 1:

fnInstalled();

break;

case 二:

fnLogin();

break;

case 三:

fnGetUserInfo();

break;

case 四:

fnShareText();

break;

case 五:

fnShareImage();

break;

case 六:

fnShareNews();

break;

case 七:

fnShareMusic();

break;

case 八:

fnShareVideo();

break;

case 九:

fnShareMood();

break;

default:

break;

};

}

/**

* 检测安装

*/

function fnInstalled() {

qq.installed(function(ret, err) {

if (ret.status) {

api.toast({msg: “已安装QQ”});

} else {

api.toast({msg: “没安装QQ”});

};

});

};

/**

* QQ登录

*/

function fnLogin() {

qq.installed(function(ret, err) {

if (ret.status) {

qq.login(function(ret, err) {

if (ret.status) {

console.log(“登录成功”);

console.log(JSON.stringify(ret));

} else {

console.log(JSON.stringify(err));

}

});

};

});

};

/**

* 获取用户信息

*/

function fnGetUserInfo() {

qq.getUserInfo(function(ret, err) {

if (ret.status) {

console.log(JSON.stringify(ret.info));

info = ret.info.replace(/[\\]/g,”);

console.log(info);

} else {

console.log(JSON.stringify(err));

}

});

};

/**

* 分享文本

*/

function fnShareText() {

api.prompt({

title:”输入要分享的文本”,

buttons: [‘确认’,”取消”]

}, function(ret, err) {

var index = ret.buttonIndex;

var text = ret.text;

console.log(index);

if(index != 1 ){

api.toast({msg:”用户取消!
“});

}else if(index == 1 && $api.trimAll(text) == ”){

api.toast({msg:”请输入分享内容”});

}else if(index == 1 && $api.trimAll(text) != ”){

_fnShareText($api.trimAll(text));

}

});

function _fnShareText(text){

qq.shareText({

text: text

}, function(ret, err) {

if (ret.status) {

console.log(“分享文本成功!
“);

console.log(JSON.stringify(ret));

} else {

console.log(JSON.stringify(err));

}

});

}

};

/**

* 分享图片

*/

function fnShareImage() {

api.confirm({

title: ‘选项’,

msg: ‘请选用分享至’,

buttons: [ ‘QQ好友’,’QQ空间’]

}, function(ret, err) {

_fnShareImage(ret.buttonIndex);

});

function _fnShareImage(i) {

var type = [‘QZone’, ‘QFriend’];

qq.shareImage({

type: type[i],

imgPath: ‘widget://launch/launch十八0x1九二0.png’

}, function(ret, err) {

if (ret.status) webapp 壳子{

console.log(“分享图片成功!
“);

console.log(JSON.stringify(ret));

} else {

console.log(JSON.stringify(err));

}

});

};

};

/**

* 分享新闻

*/

function fnShareNews() {

api.confirm({

title: ‘选项’,

msg: ‘请选用分享至’,

buttons: [ ‘QQ好友’,’QQ空间’]

}, function(ret, err) {

_fnShareNews(ret.buttonIndex);

});

function _fnShareNews(i) {

var type = [‘QZone’, ‘QFriend’];

qq.shareNews({

type: type[i],

url: ‘https://news.qq.com/a/二01七1十八/0二九九四四.htm’,

title: ‘八至二四个月幼儿 亲子园明日停业’,

deion: ‘八至二四个月幼儿 亲子园明日停业’,

imgUrl: ‘#’

}, function(ret, err) {

if (ret.status) {

console.log(“分享新闻成功!
“);

console.log(JSON.stringify(ret));

} else {

console.log(JSON.stringify(err));

}

});

};

};

/**

* 分享音乐

*/

function fnShareMusic() {

api.confirm({

title: ‘选项’,

msg: ‘请选用分享至’,

buttons: [ ‘QQ好友’,’QQ空间’]

}, function(ret, err) {

_fnShareMusic(ret.buttonIndex);

});

function _fnShareMusic(i) {

var type = [‘QZone’, ‘QFriend’];

qq.shareMusic({

type: type[i],

audioUrl: ”,

targetUrl: ”,

title: ‘桔子香水’,

deion: ‘任贤齐’,

imgUrl: ”

}, function(ret, err) {

if (ret.status) {

console.log(“分享音乐成功!
“);

} else {

console.log(JSON.stringify(err));

}

});

}

};

/**

* 分享视频

*/

function fnShareVideo() {

qq.shareVideo({

videoUrl: ‘widget://image/一门APP.mp四’

}, function(ret, err) {

if (ret.status) {

console.log(“分享视频成功!
“);

} else {

console.log(JSON.stringify(err));

}

});

}

/**

* 分享说说

*/

function fnShareMood() {

qq.shareMood({

summary: ‘测试分享说说’,

imgUrls: [‘widget://icon/icon1五0x1五0.png’]

}, functwap打包appion(ret, err) {

if (ret.status) {

console.log(“分享说说成功!
“);

} else {

console.log(JSON.stringify(err));

}

});

}

微信分享与收藏功能 Android开发手册

微信分享与收藏功能 Android开发手册

开发者在 App 中在集成微信 SDK 后,可调用接口实现,以下依次是文字、图片、视频、网页、小程序、音乐视频类型分享的示例。如果分享的消息中涉及文件路径(如图片类型消息),建议开发者针对 Android 7.0 版本及以上设备,判断微信版本支持的情况下,更新为 FileProvider 的方式进行分享。详情查阅《OpenSDK 支持 FileProvider 方式分享文件到微信文档》

WXMediaMessage (微信媒体消息内容)说明

字段类型含义备注
sdkVerintsdk 版本号
titleString消息标题限制长度不超过 512Bytes
descriptionString消息描述限制长度不超过 1KB
thumbDatabyte[]缩略图的二进制数据限制内容大小不超过 32KB
mediaObjectWXMediaMessage.IMediaObject消息对象用于描述一个媒体对象的接口,媒体对象包括:
WXTextObject、WXImageObject、WXVideoObject、WXWebpageObject、 WXFileObject、WXAppExtendObject、WXMiniProgramObject 等

SendMessageToWX.Req(SendMessageToWX请求类)

分享或收藏的目标场景,通过修改 SendMessageToWX.Req 的scene字段实现。

字段类型含义备注
messageWXMediaMessage
sceneint发送的目标场景分享到对话:
SendMessageToWX.Req.WXSceneSession
分享到朋友圈:
SendMessageToWX.Req.WXSceneTimeline ;
分享到收藏:
SendMessageToWX.Req.WXSceneFavorite
transactionString对应该请求的事务 ID,通常由 Req 发起,回复 Resp 时应填入对应事务 ID

示例

一、文字类型分享示例

WXTextObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个文本对象)

字段类型含义备注
textString文本数据长度需大于 0 且不超过 10KB

文字类型分享demo

//初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;

//用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text");
req.message = msg;
req.scene = mTargetScene;
//调用 api 接口,发送数据到微信
api.sendReq(req);

二、图片类型分享示例

WXImageObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个图片对象)

字段类型含义备注
imageDatabyte[]图片的二进制数据内容大小不超过 1MB
imagePathString图片的本地路径对应图片内容大小不超过 25MB

图片类型分享demo

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);

//初始化 WXImageObject 和 WXMediaMessage 对象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;

//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbBmp, true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = mTargetScene;
req.userOpenId = getOpenId();
//调用 api 接口,发送数据到微信
api.sendReq(req);

三、视频类型分享示例

WXVideoObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个视频对象)

字段类型含义备注
videoUrlString视频链接限制长度不超过 10KB
videoLowBandUrlString供低带宽的环境下使用的视频链接限制长度不超过 10KB

注意:videoUrl 和 videoLowBandUrl 不能同时为空

视频类型分享 demo:

//初始化一个WXVideoObject,填写url
WXVideoObject video = new WXVideoObject();
video.videoUrl ="视频url";

//用 WXVideoObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(video);
msg.title ="视频标题";
msg.description ="视频描述";
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);
msg.thumbData =Util.bmpToByteArray(thumbBmp,true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("video");
req.message =msg;
req.scene = mTargetScene;
req.userOpenId = getOpenId();

//调用 api 接口,发送数据到微信
api.sendReq(req);

四、网页类型分享示例

WXWebpageObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个网页对象)

字段类型含义备注
webpageUrlStringhtml 链接限制长度不超过 10KB
//初始化一个WXWebpageObject,填写url
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl ="网页url";

//用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title ="网页标题 ";
msg.description ="网页描述";
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);
msg.thumbData =Util.bmpToByteArray(thumbBmp, true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message =msg;
req.scene =mTargetScene;
req.userOpenId = getOpenId();

//调用 api 接口,发送数据到微信
api.sendReq(req);

五、小程序类型分享示例

WXMiniProgramObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个小程序对象)

字段类型含义备注
webpageUrlString兼容低版本的网页链接限制长度不超过 10KB
userNameString小程序的原始 id小程序原始 ID 获取方法:登录小程序管理后台 – 设置 – 基本设置 – 帐号信息
pathString小程序的 path小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 “?foo=bar”
withShareTicketboolean是否使用带 shareTicket 的分享通常开发者希望分享出去的小程序被二次打开时可以获取到更多信息,例如群的标识。可以设置 withShareTicket 为 true,当分享卡片在群聊中被其他用户打开时,可以获取到 shareTicket,用于获取更多分享信息。详见小程序获取更多分享信息 ,最低客户端版本要求:6.5.13
miniprogramTypeint小程序的类型,默认正式版正式版: WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;
测试版: WXMiniProgramObject.MINIPROGRAM_TYPE_TEST;
预览版: WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW
WXMiniProgramObject miniProgramObj = new WXMiniProgramObject();
miniProgramObj.webpageUrl = "http://www.qq.com"; // 兼容低版本的网页链接
miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;// 正式版:0,测试版:1,体验版:2
miniProgramObj.userName = "gh_d43f693ca31f";     // 小程序原始id
miniProgramObj.path = "/pages/media";            //小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
WXMediaMessage msg = new WXMediaMessage(miniProgramObj);
msg.title = "小程序消息Title";                    // 小程序消息title
msg.description = "小程序消息Desc";               // 小程序消息desc
msg.thumbData = getThumb();                      // 小程序消息封面图片,小于128k

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("miniProgram");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;  // 目前只支持会话
api.sendReq(req);

六、音乐视频类型分享示例

WXMusicVideoObject(WXMediaMessage.IMediaObject 的派生类,用于描述一个音乐视频对象),Android SDK 6.6.20 及以上版本支持

字段类型含义备注
musicUrlString音频网页的 URL 地址必填,不能为空,限制长度不超过 10KB
musicDataUrlString音频数据的 URL 地址必填,不能为空,限制长度不超过 10KB
singerNameString歌手名必填,不能为空,限制长度不超过1KB
durationInt歌曲时长必填,单位:毫秒
songLyricString歌词建议填写,限制长度不超过32KB
hdAlbumThumbFilePathString高清专辑图本地文件路径选填,文件限制长度不超过1MB
albumNameString音乐专辑名选填
musicGenreString音乐流派选填
issueDateLong发行时间 Unix 时间戳选填,单位:秒
identificationString音乐标识符建议填写,用户在微信音乐播放器跳回应用时会携带该参数,可用于唯一标识一首歌,微信侧不理解
WXMusicVideoObject musicVideo = new WXMusicVideoObject();
musicVideo.musicUrl = "https://www.qq.com";	 // 音乐url
musicVideo.musicDataUrl="http://xxx/xx.mp3"; // 音乐音频url
musicVideo.songLyric = "xxx";	// 歌词
musicVideo.hdAlbumThumbFilePath = "xxx";	 // 专辑图本地文件路径
musicVideo.singerName = "xxx";
musicVideo.albumName = "album_xxx";
musicVideo.musicGenre = "流行歌曲";
musicVideo.issueDate = 1610713585;
musicVideo.identification = "sample_identification";
musicVideo.duration = 120000;	// 单位为毫秒

WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = musicVideo;
msg.title = "歌曲名称";	// 必填,不能为空
msg.description = "歌曲描述";  // 选填,建议与歌手名字段 singerName 保持一致
msg.messageExt = "额外信息";   // 微信跳回应用时会带上
msg.thumbData = getThumb();   // 音乐卡片缩略图,不超过64KB

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("musicVideo");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;	// 支持会话、朋友圈、收藏
api.sendReq(req);

处理从微信返回到第三方应用,监听com.tencent.mm.opensdk.openapi.IWXAPIEventHandler#onReq回调,处理示例如下:

@Override
public void onReq(BaseReq req) {
	switch (req.getType()) {
		case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
			goToShowMsg((ShowMessageFromWX.Req) req);
			break;
		default:
			break;
    }
}

private void goToShowMsg(ShowMessageFromWX.Req showReq) {
		WXMediaMessage wxMsg = showReq.message;
		if (wxMsg.mediaObject instanceof WXMusicVideoObject) {
			WXMusicVideoObject musicVideoObject = (WXMusicVideoObject) wxMsg.mediaObject;
			String identification = musicVideoObject.identification;	// 分享到微信时的音乐标识符字段
			String messageExt = wxMsg.messageExt;	//分享到微信时传的额外信息字段
          	// 应用根据 identification 与messageExt自行处理
		}
}

音乐视频类型使用说明:

  1. 注意事项:
    • 音乐视频类型与音乐类型不同,分享至微信的音乐视频消息,直接点击好友会话或朋友圈下的分享内容会跳转到微信原生播放器,可以对音乐作品辅以视频制作成音乐视频,进行点赞、评论、发送给朋友、分享到朋友圈、发布至视频号等。
    • 在播放器里点击跳转入口会跳转回App,没有安装 App 时会打开 musicUrl 链接。
  2. 音乐视频类型分享,请开发者特别注意必填的字段有:
    • WXMediaMessage.title:歌曲名称
    • WXMusicVideoObject.musicUrl:音频网页的 URL 地址
    • WXMusicVideoObject.musicDataUrl:音频数据的 URL 地址
    • WXMusicVideoObject.singerName:歌手名
    • WXMusicVideoObject.duration:歌曲时长,单位为毫秒
  3. 第三方应用在分享时设置的字段 WXMediaMessage.messageExt 字段与WXMusicVideoObject.identification 需要保证 Android 与iOS平台是一致的,否则跨平台分享的消息跳转回应用无法保证能够跳转到对应歌曲。
  4. 微信跳转到第三方应用,应用处理 IWXAPIEventHandler.onReq 回调时需要判断WXMediaMessage.mediaObject 的类型进行对应的处理,并且异常情况下也能处理 WXEntryActivity 的关闭,否则可能会导致拉起应用后无法点击操作的问题;无论 WXMediaMessage.mediaObject 类型是什么,WXMediaMessage.messgeExt 字段均会透传是应用在分享时写入的数据,应用可使用该字段进行应用低版本的兼容处理。

注意事项

  1. 发起分享的 App 与小程序属于同一微信开放平台帐号。
  2. 支持分享小程序类型消息至会话,暂不支持分享至朋友圈。
  3. 若客户端版本低于 6.5.6 或在 iPad 客户端接收,小程序类型分享将自动转成网页类型分享。开发者必须填写网页链接字段,确保低版本客户端能正常打开网页链接。
  4. 对于音乐视频类型的分享,需按照如下格式发送邮件至 hansenxu@tencent.com
    • 邮件主题:帐号 XXX 关于音乐视频类 appmsg 的分享功能申请;
    • 邮件内容:需提供移动应用 appid 和需分享的音频网页的域名信息;
    • 要求:
      • 申请帐号需为已完成主体认证的帐号;
      • 申请“音乐视频类型的分享权限”需先完成“音乐类型的分享权限”申请,且申请的移动应用的 appid 和域名需一致;
      • 音乐视频类型的分享权限会涉及到相关法务协议的签署,具体签订流程和开通结果请参考邮件回复结果。

微信开放平台Android接入指南

微信开放平台Android接入指南

Android接入指南

注 1:jCenter 服务将在2021年5月1日之后关停,微信 SDK 已迁移到 Maven Central,请开发者及时修改引用仓库。

注 2:微信 SDK 改成通过 Gradle 的方式发布到 Maven Central,包名做了相应修改,从原来的 com.tencent.mm.sdk 修改为 com.tencent.mm.opensdk,需要开发者修改对应的 import 语句。

注 3:接入Open SDK的开发者,请先认真阅读《微信Open SDK个人信息处理规则》并确保对 OpenSDK 的接入使用情况符合上述规则的相关要求。

注 4:本文为微信 Android 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 IDE 的基本使用方法(Android Studio(推荐) 或 Eclipse),以及具有一定的编程知识基础等。

关于openSDK6.8.0的更新说明

微信将于近期发布 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行更新,点击查看更新指引

目录

接入指南

1.申请你的 AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

2.下载 SDK 及 API 文档

Android Studio 环境下:

  • 在 build.gradle 文件中,添加如下依赖即可:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

(从6.8.0版本开始,请使用 wechat-sdk-android )

  • 由于 jCenter 服务关停,需要修改成引用 Maven Central,在项目的根 build.gradle 文件中,添加如下代码即可:
buildscript {
    repositories {
        jcenter()       // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

allprojects {
    repositories {
        jcenter()      // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

特别注意,目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级至最新版本6.8.0。后续所有版本更新都会上传至Maven Central。

Eclipse 环境下:

请前往资源下载页下载最新 SDK 包。

3.搭建开发环境

Android Studio 环境下:

在 Android Studio 中新建你的工程,并保证网络设置可以成功从 Maven Central 下载微信 SDK 即可。

Eclipse 环境下:

[1] 在 Eclipse 中建立你的工程。

[2] 在工程中新建一个 libs 目录,将开发工具包中 libs 目录下的 libammsdk.jar 复制到该目录中(如下图所示,建立了一个名为 SDK_Sample 的工程,并把 jar 包复制到 libs 目录下)。

[3] 右键单击工程,选择 Build Path 中的 Configure Build Path…,选中 Libraries 这个 tab,并通过 Add Jars…导入工程 libs 目录下的 libammsdk.jar 文件。(如下图所示)。

在你需要使用微信终端 API 的文件中导入相应的类。

import com.tencent.mm.opensdk.openapi.WXTextObject;

4.在代码中使用开发工具包

[1] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,可以在程序入口 Activity 的 onCreate 回调函数处,或其他合适的地方将你的应用 id 注册到微信。注册函数示例如下图所示。

	// APP_ID 替换为你的应用从官方网站申请到的合法appID
private static final String APP_ID = "wx88888888";

// IWXAPI 是第三方 app 和微信通信的 openApi 接口
private IWXAPI api;

private regToWx() {
    // 通过 WXAPIFactory 工厂,获取 IWXAPI 的实例
    api = WXAPIFactory.createWXAPI(this, APP_ID, true);

    // 将应用的 appId 注册到微信
    api.registerApp(APP_ID);

   //建议动态监听微信启动广播进行注册到微信
  registerReceiver(new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {

     // 将该 app 注册到微信
    api.registerApp(Constants.APP_ID);
   }
  }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));

}

[2] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过 IWXAPI 的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq 是第三方 app 主动发送消息给微信,发送完成之后会切回到第三方 app 界面。

boolean sendResp(BaseResp resp);

sendResp 是微信向第三方 app 请求数据,第三方 app 回应数据之后会切回到微信界面。

sendReq 的实现示例,如下图所示:

//初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;

//用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());  //transaction字段用与唯一标示一个请求
req.message = msg;
req.scene = mTargetScene;

//调用 api 接口,发送数据到微信
api.sendReq(req);

需要注意的是,SendMessageToWX.Req 的 scene 成员,如果 scene 填 WXSceneSession,那么消息会发送至微信的会话内。如果 scene 填 WXSceneTimeline(微信 4.2 以上支持,com.tencent.mm.opensdk.constants.Build.java 里面定义了各个功能支持的版本号,如果需要检查微信版本支持 API 的情况, 可调用 IWXAPI 的 getWXAppSupportAPI 方法,比如,要判断微信是否支持分享到朋友圈功能,可以如下所示进行判断:

if (api.getWXAppSupportAPI() >= Build.TIMELINE_SUPPORTED_SDK_INT) {
    //do share
}

那么消息会发送至朋友圈。scene 默认值为 WXSceneSession。

sendResp 的实现与 SendReq 类似,如下图所示:

// 初始化一个 WXTextObject 对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;

// 用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(textObj);
msg.description = text;

// 构造一个Resp
GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp();
// 将 req 的transaction设置到 resp 对象中,其中 bundle 为微信传递过来的 Intent 所带的内容,通过getExtras()方法获取
resp.transaction = new GetMessageFromWX.Req(bundle).transaction;
resp.message = msg;

//调用 api 接口,发送数据到微信
api. sendResp (resp) ;

具体要发送的内容由第三方 app 开发者定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。

[3] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面 3 步操作:

a. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity(例如应用程序的包名为 net.sourceforge.simcpux,则新添加的类如下图所示)

并在 manifest 文件里面加上exported、taskAffinity及 launchMode 属性,其中 exported 设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask,例如:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask">
</activity>

b. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法

c. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给 IWXAPI 接口的 handleIntent 方法,示例如下图:

api.handleIntent(getIntent(), this);


当微信发送请求到你的应用,将通过 IWXAPIEventHandler 接口的 onReq 方法进行回调,类似的,应用请求微信的响应结果将通过 onResp 回调。

注意事项

[1]如果需要混淆代码,为了保证 sdk 的正常使用,需要在 proguard.cfg 加上下面两行配置:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

[2]如果需要运行 SDK Sample 工程,需要通过指定的 debug.keystore 来进行签名:

Android Studio 环境下:

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
}

Eclipse 环境下:

请查阅文档《如何运行 SDK Demo 工程 》

至此,你已经能使用微信 Android 开发工具包的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅 Android 平台参考手册 或自行下载阅读微信 SDK Sample Demo 源码。

前往下载微信 SDK 示例代码

Android 11-更新 openSDK 适配

针对微信 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行如下更新:

适配方案

  1. 第三方应用需要更新微信 Android SDK至6.8.0版本,引用代码如下:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
    // 或者直接引用最新版本
    // api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

无论第三方应用 targetSdkVersion 是否升级为30,均需要进行微信 Android SDK版本升级适配。

  1. targetSdkVersion升级到30的第三方应用,由于Android 11 软件包可见性 特性的影响,OpenSDK的接口可能无法正常拉起微信,从而无法使用微信的部分功能,需要在主工程的AndroidManifest.xml 中增加标签,代码如下:
<manifest package="com.example.app">

      ...

      // 在应用的 AndroidManifest.xml 添加如下<queries>标签
    <queries>
        <package android:name="com.tencent.mm" />   // 指定微信包名
    </queries>

      ...

</manifest>

注:添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。

  • Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本
  • Android SDK Build-Tools 需要升级至 30 及以上版本
  • com.android.tools.build:gradle 需要升级至 3.6.0 版本及以上

验证流程

  1. 环境准备:
  2. 验证流程:

(1) 安装第三方应用后,首次触发微信登录功能。(注:该操作前务必不要触发任何分享、跳转等 openSDK 功能)

(2) 若成功完成微信登录功能,即验证 openSDK 更新成功。

(2) 若签名验证失败,收到回调errcode=-6,则需开发者重新检查步骤1和2是否完成。

targetSdkVersion升级到30的第三方应用,具体适配详情另可参考文档Android 11 系统策略更新,请开发者及时适配

小米开发平台应用认领操作指南

小米开发平台应用认领操作指南

本文档主要介绍应用认领的操作方法。因Android生态圈的开放性,您的应用可能被其他人提交到小米应用商店,此时不要担心。本文针对未发布应用、已发布应用两种情况给出了详细的认领方式,您可在详细阅读文档内容后,将应用认领到自己的账号下。

未发布应用认领

1、适用场景:

包名已创建但应用未上架

2、操作方法/路径:

2.1 登录开发者站,进入应用管理台,点击基础服务“应用认领”,进入应用认领详情页。

2.2 进入应用认领详情页面,填写您需要认领的应用包名。

2.3 针对仅被他人创建应用包名,但还未上传APK的应用,您可以提交以下资料进行认领,上传成功后点击“提交认领申请”按钮。

所需资料:

  • 上传其他应用市场后台上架截图(必填,不少于两家);
  • 营业执照(必填);
  • 企业开发者法人/个人开发者个人手持身份证(必填)
  • 计算机软著证书(选填);
  • 其他资质证书(选填)。

2.4 点击后,将会提示应用认领提交审核成功,应用的状态也会变为审核中。我们审核同学一般会在1-3个工作日处理完成,请您耐心等待。

已发布应用认领

1、适用场景:

包名已创建且应用已上架

2、签名获取方法

针对已发布应用的认领,主要是通过判断签名的所有权,来决定应用的所有权。在Android平台发布应用程序之前,必须经过一个签名流程。签名就是这款应用的身份证明。下面将详细介绍签名的获取方法。

2.1 jarsigner签名方法。

您可以使用JDK自带的jarsigner工具来完成签名。jarsigner工具的命令格式如下:

jarsigner -verbose -keystore [您的私钥存放路径]-signedjar [签名后文件存放路径] [未签名的文件路径] [您的证书名称]

#jarsigner的参数说明:keystore 参数指定您的私钥的绝对路径,例如:c:mykeystore -signedjar 参数指定签名后apk文件存放绝对的路径,例如 c:signed.apk [未签名的文件路径] 指定要签名apk文件的绝对路径,也就是您从我们这里下载到的,例如 c:unsigned.apk [您的证书名称] 是指您创建密钥时,您设置的证书名称。

2.2 Linux和Mac OS X平台的签名方法。

打开Terminal 程序 进入从小米开发者站下载到的verification.zip 解压后的目录,例如cd ~/Downloads/verification 使用jarsigner签名命令示例:jarsigner -verbose -keystore~/Workspace/mykeystore -signedjar ./signed.apk ./unsigned.apk xiaomi

2.3 Windows平台签名方法。

打开 “命令提示符” 程序进入从小米开发者站下载到的verification.zip解压后的目录,例如cd C:Downloadsverification

使用jarsigner签名命令示例:jarsigner -verbose -keystoreC:Downloadsverificationmykeystore -signedjar signed.apk unsigned.apk xiaomi

以上签名办法的获取,请在研发人员的协助下完成。

3、操作方法/路径:

3.1 登录开发者站,进入应用管理台,点击基础服务“应用认领”,进入应用认领详情页。

3.2 进入应用认领详情页面,填写您需要认领的应用包名。

3.3 点击“下载APK空包”,需开发人员把空包打上与认领APP一样的签名后,上传签名后的空包,点击“确认认领”提交认领申请,签名匹配一致即可完成应用认领。

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

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

4.迁移指南

每次发布新的 Android 版本时,我们都会推出一些全新的功能并引入一些行为变更,目的就在于提高 Android 的实用性、安全性和性能。在许多情况下,您的应用都可以直接使用并完全按预期运行;而在其他的一些情况下,您可能需要对应用进行更新以适应这些平台变更。

源代码发布到 AOSP(Android 开源平台)后,用户随之就可能开始使用新平台。因此,应用必须做好准备,让用户能够正常使用,最好还能利用新的功能和 API 发挥新平台的最大优势。

典型的迁移包含两个阶段,这两个阶段可以同时进行:

  • 确保应用兼容性(在 Android 13 最终发布前)
  • 针对新平台的功能和 API 调整应用(最终发布后尽快进行)

4.1 确保与 Android 13 兼容

您必须测试现有应用在 Android 13 上的运行情况,以确保更新到最新版 Android 的用户获得良好的体验。有些平台变更可能会影响应用的行为方式,因此,必须尽早进行全面测试并对应用进行任何必要的调整。

您通常可以调整应用并发布更新,而无需更改应用的targetSdkVersion。同样,您应该也不需要使用新的 API 或更改应用的compileSdkVersion,但是这一点可能要取决于应用的构建方式及其所使用的平台功能。

在开始测试之前,请务必熟悉行为变更:所有应用。即使您不更改应用的targetSdkVersion,这些变更也可能会影响您的应用。

请务必查看并测试受限非 SDK 接口的使用。您应使用应用公共 SDK 或 NDK 等效项替换应用使用的任何受限接口。留意突出显示这些访问权限的 logcat 警告,并使用StrictMode方法detectNonSdkApiUsage()以编程方式捕获它们。最后,请务必完整测试应用中的库和 SDK

,确保它们在 Android 13 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

当您完成测试并进行更新后,我们建议您立即发布兼容的应用。这样可以尽早让您的用户测试应用,并帮助用户顺利过渡到 Android 13。

4.2 更新应用的目标平台并使用新 API 进行构建

发布应用的兼容版本后,下一步是通过更新targetSdkVersion并利用 Android 13 的新 API 和功能来添加对 Android 13 的全面支持。准备就绪后,您即可开始进行这些更新,请注意以新平台为目标平台方面的Google Play 要求

当您计划全面支持 Android 13 时,请查看行为变更:以Android 13为目标平台的应用。这些针对性的行为变更可能会导致需要解决的功能问题。在某些情况下,这些变更需要进行大量开发工作,因此我们建议您尽早了解并解决这些问题。为帮助确定影响您的应用的具体行为变更,请使用兼容性切换开关来测试已启用所选变更的应用。

以下是全面支持 Android 13 的步骤。

a. 获取 SDK,更改目标平台,使用新 API 进行构建

如需开始针对 Android 13 全面支持进行测试,请使用最新预览版的 Android Studio 下载 Android 13 SDK,以及所需的任何其他工具。接下来,更新应用的targetSdkVersion和compileSdkVersion,然后重新编译应用。如需了解详情,请参阅SDK 设置指南

b. 测试 Android 13 应用

编译应用并将其安装到搭载 Android 13 的设备上后,请开始测试,以确保应用能够在 Android 13 上正常运行。某些行为变更仅在您的应用以新平台为目标平台时才适用,因此您需要在开始之前阅读本文的行为变更。

与基本兼容性测试一样,完成所有流程和功能以查找问题。将测试重点放在以Android 13为目标平台的行为变更上。您还可以根据核心应用质量指南测试最佳做法检查您的应用。请务必查看并测试可能适用的受限非 SDK 接口的使用。留意突出显示这些访问权限的 logcat 警告,并使用 StrictMode 方法detectNonSdkApiUsage()以编程方式捕获它们。最后,请务必完整测试应用中的库和 SDK,确保它们在 Android 13 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

c. 使用应用兼容性切换开关进行测试

Android 13 包含兼容性切换开关,可让您更轻松地在您的应用中测试针对性的行为变更。对于可调试的应用,切换开关可让您:

  • 在不实际更改应用的 targetSdkVersion 的情况下测试针对性的变更。您可以使用切换开关强制启用特定的针对性行为变更,以评估对现有应用的影响。
  • 仅针对特定变更进行测试。您可以使用切换开关停用除要测试的变更之外的所有针对性变更,而不必一次处理所有针对性变更。
  • 通过 adb 管理切换开关。您可以使用 adb 命令在自动测试环境中启用和停用可切换的变更。
  • 使用标准变更 ID 更快地进行调试。每个可切换的变更都具有唯一 ID 和名称,可用于在日志输出中快速调试根本原因。

在您准备更改应用的目标平台时,或者在您积极开发以便支持 Android 13 时,切换开关将十分有用。如需了解详情,请参阅兼容性框架变更 (Android 13)

5.重点适配问题

为了解当前应用对Android 13 版本的适配情况,以便更好推进MIUI Android 13适配工作,我们已在内部进行了自动化兼容性测试。我们选取了小米应用商店Top的各类应用,对每个应用进行下载、安装、启动、monkey测试、遍历测试、卸载,并在整个过程中检测是否有FC/ANR问题发生。根据测试结果,我们强烈建议您关注以下问题。若您的应用存在以下情况,请尽快适配。

5.1 Native Crash问题

移动安全联盟msa的SDK崩溃问题,特征:linker64

04-24 18:24:19.863 8983 8983 F DEBUG : Cmdline: xxx
04-24 18:24:19.863 8983 8983 F DEBUG : pid: 8470, tid: 8470, name: xxx >>> xxx <<<
04-24 18:24:19.863 8983 8983 F DEBUG : uid: 10195
04-24 18:24:19.864 8983 8983 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
04-24 18:24:19.864 8983 8983 F DEBUG : pac_enabled_keys: 0000000000000000
04-24 18:24:19.864 8983 8983 F DEBUG : signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x000000704a6bd764
04-24 18:24:19.864 8983 8983 F DEBUG : x0 00000031b8a0a445 x1 0000007fdc63abc8 x2 0000000000000000 x3 0000007fdc63abb8
04-24 18:24:19.864 8983 8983 F DEBUG : x4 0000007049d551d0 x5 0000000000000000 x6 fefefefefefefeff x7 7f7f7f7f7f7f7f7f
04-24 18:24:19.864 8983 8983 F DEBUG : x8 0000000000428290 x9 000000704857c2e4 x10 0000000000000070 x11 0000000000000000
04-24 18:24:19.864 8983 8983 F DEBUG : x12 000000704cac0950 x13 f43ca3815c475fbd x14 0000000000000006 x15 ffffffffffffffff
04-24 18:24:19.865 8983 8983 F DEBUG : x16 0000000000000001 x17 000000704cbaa880 x18 0000006c8f0bdf90 x19 000000704b984018
04-24 18:24:19.865 8983 8983 F DEBUG : x20 0000007fdc63abc8 x21 00000031b8a0a445 x22 00000000b8a0a445 x23 0000000000000000
04-24 18:24:19.865 8983 8983 F DEBUG : x24 0000000000000000 x25 000000704b8abdd0 x26 000000704cbdd3a8 x27 000000704cbdf000
04-24 18:24:19.865 8983 8983 F DEBUG : x28 0000000000000000 x29 0000007fdc63aac0
04-24 18:24:19.866 8983 8983 F DEBUG : lr 000000704cb05130 sp 0000007fdc63aac0 pc 000000704cb0515c pst 0000000060001000
04-24 18:24:19.866 8983 8983 F DEBUG : backtrace:
04-24 18:24:19.866 8983 8983 F DEBUG : #00 pc 000000000005215c /apex/com.android.runtime/bin/linker64 (__dl__ZNK6soinfo10gnu_lookupER10SymbolNamePK12version_info+112) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.866 8983 8983 F DEBUG : #01 pc 0000000000043d04 /apex/com.android.runtime/bin/linker64 (__dl__ZL24dlsym_handle_lookup_implP19android_namespace_tP6soinfoS2_PS2_R10SymbolNamePK12version_info+408) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #02 pc 000000000003d834 /apex/com.android.runtime/bin/linker64 (__dl__Z8do_dlsymPvPKcS1_PKvPS_+904) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #03 pc 0000000000038300 /apex/com.android.runtime/bin/linker64 (__dl__Z10dlsym_implPvPKcS1_PKv+92) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #04 pc 0000000000001070 /apex/com.android.runtime/lib64/bionic/libdl.so (dlsym+20) (BuildId: 72dd43ea80dff185706bb3bdfcfaf051)
04-24 18:24:19.867 8983 8983 F DEBUG : #05 pc 000000000045ae84 /apex/com.android.art/lib64/libart.so (art::SharedLibrary::FindSymbolWithoutNativeBridge(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+72) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #06 pc 00000000004591d8 /apex/com.android.art/lib64/libart.so (art::JavaVMExt::FindCodeForNativeMethod(art::ArtMethod*)+1532) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #07 pc 00000000006da6bc /apex/com.android.art/lib64/libart.so (artFindNativeMethodRunnable+328) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #08 pc 00000000006da9d8 /apex/com.android.art/lib64/libart.so (artFindNativeMethod+592) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #09 pc 000000000020f5f8 /apex/com.android.art/lib64/libart.so (art_jni_dlsym_lookup_stub+72) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #10 pc 000000000021a154 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #11 pc 000000000021076c /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+556) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #12 pc 000000000027a364 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+188) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #13 pc 0000000000610d30 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues<art::ArtMethod*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+464) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #14 pc 000000000046dfb0 /apex/com.android.art/lib64/libart.so (art::JNI<false>::CallBooleanMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue const*)+600) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #15 pc 00000000000323a4 <anonymous:6cfd9a9000>

如您使用了此SDK,请联系SDK提供方。

小米开发平台联系人信息使用规范

小米开发平台联系人信息使用规范

1. 背景

曾经 MIUI 系统用户反馈过联系人丢失问题,其中一部分的原因是第三方应用不遵循 Android 标准规范,进行了非自身帐号的联系人删除,导致在第三方应用同步或者恢复联系人数据时,出现了小米帐户联系人被删除而丢失的情况。

显然,这样的情形无论对于用户还是系统,都是无法接受的。

2. 规范

Android 平台上联系人数据是有帐户归属的概念,各个应用或者服务管理各自帐户的联系人数据。虽然可以跨帐户读取联系人数据,但却不应该跨帐户删除联系人数据,否则,多个应用或者服务如果对数据处理逻辑不一致(大多数情况会是这样),就会出现数据丢失,或频繁修改数据。

联系人资料作为用户的核心数据之一,不允许也不应该被第三方应用删除。因为无法直接一一规范第三方应用,也无法预判可能即将进行不规范操作的应用,所以只能在系统层面进行第三方应用行为约束,保证小米帐户联系人不会被第三方应用后台直接删除,保证用户的数据安全。

3. 限制

如果第三方应用在 MIUI 系统上出现了不规范的删除行为,会弹窗提示:“XXX 正在删除小米帐户上的联系人,为了保护信息安全,本次删除已被禁止。您可使用系统通讯录删除联系人。”。

那么结果就是,要么用户一次次点击确认以继续不规范的删除(基本不可能),要么用户无法使用对应的服务(不利于应用和用户)。

因此,建议第三方应用不要删除小米帐户的联系人数据,在合理的操作范围内一同给用户最好的体验。

小米手机设备管理器权限管理说明

小米手机设备管理器权限管理说明

1. 介绍 

设备管理器权限是Android提供给(企业)设备管理类应用的设备保护功能,对手机设备进行管理和操作的接口权限。

权限接口涉及对用户数据、密码的操作,安全性风险极高。

部分应用滥用权限声明来进行防卸载保护,应用内并无相关功能,当用户开启后就无法卸载。

2. 原则 

  • 设备管理器是提供给设备管理类应用的系统权限接口,禁止应用滥用设备管理器权限提供非设备管理功能外的其他功能及服务,包括但不限于清除用户数据、防卸载等。
  • 对于引导或提供非正常使用设备管理器权限的应用,按标准执行系统管控策略。包括但不限于:在系统内强提醒用户进行关闭处理、禁止应用获取相关服务或权限接口。
  • 对于引导或提供通过设备管理器权限,对用户的数据、设备使用安全可能产生危害的应用,将严格执行:将该应用在小米应用商店进行下架处理、禁止应用获取相关服务接口 、禁止相关应用在设备管理器应用列表中显示。
  • 禁止一揽子权限授权原则,各APP只能在其核心业务功能需要特定权限,且用户不同意授予该权限时,才允许退出应用。否则,非核心功能的权限调用中,应用不得以用户不授权而强制退出应用,相关权限应当为设计时的默计关闭保护状态。

小米关于调整“获取应用列表”权限&新增“调节媒体音量”权限的适配说明

小米关于调整“获取应用列表”权限&新增“调节媒体音量”权限的适配说明

1、获取应用列表权限简介

“获取应用列表”权限是在Android原生 QUERY_ALL_PACKAGES 权限基础上额外的权限管理。

影响 PackageManager#getInstalledPackages和PackageManager#getInstalledApplications 两个接口返回值。

应用没适配的情况下,默认添加权限状是“仅在使用中允许”(应用不声明也会添加),即应用在前台时可以正常获取。也可以按照下面方法适配动态申请。

1.1.适配方法

清单文件声明

<uses-permission android:name="com.android.permission.GET_INSTALLED_APPS"/>

判断MIUI 是否支持动态申请权限

try {
    PermissionInfo permissionInfo =  getApplicationContext().getPackageManager().getPermissionInfo("com.android.permission.GET_INSTALLED_APPS", 0);
    if (permissionInfo != null && permissionInfo.packageName.equals("com.lbe.security.miui")) {//MIUI 系统支持动态申请该权限
        if (ContextCompat.checkSelfPermission(getApplicationContext(), "com.android.permission.GET_INSTALLED_APPS") != PackageManager.PERMISSION_GRANTED) {
            //没有权限,需要申请
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{"com.android.permission.GET_INSTALLED_APPS"}, 999);
        }
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

提示:如果系统侧不支持此权限,应用仍然会保持默认(仅在使用中允许)。

判断权限授予结果(与普通运行时权限没有区别)

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // do something
}

1.2.特殊说明:

如果不需要系统添加获取应用列表的权限,可以通过下面代码实现(同时,清单文件中不能申请更改权限)

<meta-data
     android:name="do_not_need_get_installed_apps"
     android:value="true"/>

注意:如果声明此meta-data,等于“获取应用列表”权限关闭!

1.3.MIUI生效版本:

MIUI 13

2、调节媒体音量权限说明

为减少部分应用擅自修改媒体音量,而不主动告知用户或获得用户许可的行为,同时尽可能避免对用户带来相应的困扰。现在单独设立“调节媒体音量”的权限,并将默认状态设置为“仅在使用中允许”。同时,“应用行为记录”功能中将会对应用修改媒体音量的行为进行记录,用户可主动调整相关的权限。您的应用如有调节媒体音量的需求,可能受到影响,建议您自行调整相关的产品策略。

MIUI 11及以下版本将不受该调整的影响。

小米开放平台MIUI进程管理适配说明

小米开放平台MIUI进程管理适配说明

1. 介绍

应用进程的存活与否常常受到三方开发者的关注。与原生系统不同,MIUI在Android系统的基础之上,开发了一套进程管理模块,便于系统管理运行中的进程。

此文档将会提供进程相关信息,方便开发者适配MIUI进程管理机制、初步自查应用被杀原因、更精确的向我们的三方团队同事反馈应用异常被杀问题

2. 进程管理功能

MIUI的进程管理功能大致分为两类:用户主动触发、用户被动触发

用户主动触发的功能包含:

 名称 触发入口Reason 
 一键清理 最近任务/悬浮球 OneKeyClean
 强力清理 负一屏 ForceClean
 垃圾清理 安全中心  GarbageClean
  锁屏清理 安全中心LockScreenClean
 游戏清理 安全中心 GameClean
 优化清理 安全中心 OptimizationClean
上滑清理 最近任务SwipeUpClean 

如果发现应用因为以上原因被杀死,那么意味着是用户在触发入口主动杀死这些应用

用户被动触发的功能包含:

 名称 被动触发场景 Reason
 Power异常查杀 应用过度耗电 AutoPowerKill
 Thermal异常查杀 应用使手机发热 AutoThermalKill

如果发现应用因为以上原因被杀死,那么意味着应用出现异常,会影响到系统正常运作,系统将应用清理掉了

3. FAQ

3.1. 我的应用在原生上运行时正常,但在MIUI上频繁被杀,该怎么定位原因

可以在shell中输入命令:

adb logcat -b events | grep am_kill

查看被杀应用的日志,例如:

1494  2963 I am_kill : [0,5253,com.eg.android.AlipayGphone,500,LockScreenClean]

最后一列信息即为被杀的Reason,和上面的表格进行一下对比,即可定位被杀的原因

3.2. 我的应用频繁的被AutoPowerKill/AutoThermalKill杀死,该怎么解决这个问题

当出现应用频繁被被动原因杀时的情况时,开发者首先应该自己检查下自身应用有没有过度耗电、发热的行为

如果确认自身应用质量没有问题,可以打个bugreport并联系我们的三方团队的同事进行反馈,我们内部的对应开发会进行深度分析

3.3. 我的应用被用户主动杀死后,怎么样可以让应用进程自动重新启动呢

开发者可以在用户使用应用时,引导用户在安全中心中打开自启动开关

小米开发平台小米妙播适配说明

小米开发平台小米妙播适配说明

一、小米妙播背景与介绍

1.1 安卓原生Media Session介绍

Android 框架定义了两个类(媒体会话和媒体控制器),它们为构建媒体播放器应用提供了一个完善的结构。

媒体会话和媒体控制器通过以下方式相互通信:使用与标准播放器操作(播放、暂停、停止等)相对应的预定义回调,以及用于定义应用独有的特殊行为的可扩展自定义调用。

更多信息详见:https://developer.android.com/guide/topics/media-apps/media-apps-overview

1.2 MIUI小米妙播介绍

小米妙播支持基于Media Session的音频播控、基于Wi-Fi的跨设备音乐接力。

用户可以在小米手机和平板的系统控制中心、通知栏/锁屏媒体中心使用该功能。

控制中心内的小米妙播播控,基于安卓原生Media Session能力实现,音频应用适配Media Session即可,众多知名三方应用均已适配。

二、适配小米妙播的好处

2.1 系统全局常驻播控

小米妙播作为控制中心常驻的播控、互联入口,用户可以在手机全局操作音频,是Android厂商中全面媲美苹果 AirPlay2 的系统级功能。

2.2 覆盖更多场景的播放

各音频app的用户活跃场景不再局限于手机,用户用音箱等设备听歌时,也可使用各音频app,通过小米妙播互联播放。

三、适配方式

基本适配方式请参考谷歌官方文档:

https://developer.android.com/guide/topics/media-apps/working-with-a-media-session

https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowserservice

适配要点:

及时更新Meta信息

// 构建MediaSession
MediaSessionCompat mMediaSession;
//构建MediaMetadata,并传入媒体meta信息(歌曲名、专辑名、歌手名、歌曲时长等)
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, getTrackName())
        .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, getAlbumName())
        .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, getArtistName())
        .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration());
MediaMetadataCompat metadata = builder.build();
mMediaSession.setMetadata(metadata);
// 构建并传入歌曲封面
Bitmap result;
// 获取封面BitMap...
builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, result);
mMediaSession.setMetadata(builder.build());

及时更新播放状态信息

// 构建PlaybackState,传入播放状态、播放进度等信息。
PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(getSourcePlaybackState())
        .setBufferedPosition(getBufferedPosition())
        .setState(PlaybackStateCompat.STATE_PLAYING, position(), getSpeedRatio());
mMediaSession.setPlaybackState(builder.build());

处理播放回调 

// 构建MediaSessionCompat.Callback回调,处理播放、暂停、上一首、下一首、调整播放进度等操作
private class MediaPlaybackSessionCallback extends MediaSessionCompat.Callback {
    @Override
    public void onPlay() {
        play();
    }
    @Override
    public void onPause() {
        pause();
    }
    @Override
    public void onSkipToNext() {
        next();
    }
    @Override
    public void onSkipToPrevious() {
        prev();
    }
    @Override
    public void onFastForward() {
        forward();
    }
    @Override
    public void onRewind() {
        backward();
    }
    @Override
    public void onStop() {
        stop();
    }
    @Override
    public void onSeekTo(long pos) {
        seek(pos);
    }
}
mMediaSession.setCallback(new MediaPlaybackSessionCallback());