腾讯bugly接入 支持海外游戏吗

Andoird Crash的跟踪方法,使用腾讯Bugly来捕捉一些疑难杂症,让我们APP稳定上线
我们在开发中常常会注意到一些Crash,这正是很头疼的,而且Crash会带来很多意想不到的状态,很恶心,所以今天,我们来着重研究一下Crash,同时,我们也将使用第三方SDK,也就是腾讯的Bugly来扑捉这些Crash,让他无所遁形。
我们在开发中常常会注意到一些Crash,这正是很头疼的,而且Crash会带来很多意想不到的状态,很恶心,所以今天,我们来着重研究一下Crash,同时,我们也将使用第三方SDK,也就是腾讯的Bugly来扑捉这些Crash,让他无所遁形。
一.糟糕的 Crash
作为开发人员,很容易就能碰到Crash,但是作为用户,我相信也有很大部分人碰到过Crash,这些原因,也正是Android的平台差异化和适配所导致的,而且,你要是你安装一个软件就Crash,我想你会立马把他卸载掉。同时心理嘲笑了一下开发人员,有些用户还有可能会去商店给你差评之类的,这就不多说了,反正会直接影响到你APP的口碑和市场竞争能力,你要是一些用户很多的APP的话,你还得考虑用户留存和收入的问题了
而在以前,我们是怎么处理Crash的呢?一般有三个补救措施吧,感觉,当然,还有其他,待补充:
1.等待用户反馈,这样很被动 2.了解出错原因,让用户提供日志和使用场景,不靠谱,攒人品吧 3.提示用户反馈,这样对用户体验有点糟糕
而在以前,很多厂商基本都这样搞过,归根究底,还是现在的APP质量,仍然不敢恭维
我今天讲的是腾讯的Bugly处理Crash的方式,主要还是因为他使用比较简单吧,初始化也就一行代码,而且可以监控和获取日志,挺不错的
二. Crash分类
一般Crash也是分了两类
java代码触发,Jvm退出,弹框提醒用户,这个我们可以看log查看报错原因,Crash工具都能捕获到。
Native Crash
C/C++代码触发,Linux进程退出,无系统提示,这就需要一些第三方工具去捕获了vcD4NCjwvYmxvY2txdW90ZT4NCjxoMiBpZD0="三模拟crash的产生">三.模拟Crash的产生
其实我们可以非常简单的实现一个java的Crash,比如空指针,很正常就能产生,我们这样来写MainActivity
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button.setText("Android Crash");
我都没给这个button初始化就赋值,肯定会报空指针异常,效果如上图,而在我们上图中是提到的,我们可以使用log去收集错误
我们可以看到他的错误是空指针,而错误在MainActivity的16行
这样我们的问题就一下子找到了
而如果集成了腾讯Bugly的话,他输出的日志就比较详细了,那具体是怎样的输出,我们现在就来集成一下把!
四.集成腾讯Bugly
要集成Bugly,肯定要去Bugly的官网
Bugly官网:
当然,Bugly的集成还是相对来说比较简单的,我们只要按照他的官方文档来
首先要做的,就是下载SDK了(如果你添加依赖的话,就不需要下载)
下载之后,我们可以看到他里面包含着四个文件
我们可以根据他们的接入指南来,因为我们是android studio开发,所以我把流程走一遍
在Module的build.gradle文件中添加依赖和属性配置:
dependencies {
compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.1.5
这里要注意了,Bugly还提供了ndk动态库,我们如果要看C的日志可以使用
如果你集成了这些的话,你在Module的build.gradle文件中添加依赖和属性配置:
defaultConfig {
// 设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
dependencies {
compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.1.5
compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0
可以参考官方提供的这张图
注意:自动集成时会自动包含Bugly SO库,建议在Module的build.gradle文件中使用NDK的“abiFilter”配置,设置支持的SO库架构。
如果在添加“abiFilter”之后Android Studio出现以下提示:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
则在项目根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true
接着你就可以添加他所需要的一些权限了
好,现在我们需要去注册一个APP了,进入你的后阳台选择注册app
注册成功之后就可以看到全貌了,并且可以看到appid了,我们需要这个id
现在我们拿到了APPID:,那我们可以去初始化了,建议是在Application中,所以我新建一个Application,并在清单文件,Application的根节点添加name属性
package com.lgl.
import android.app.A
import com.tencent.bugly.crashreport.CrashR
* Application初始化
* Created by LGL on .
public class CrashApplication extends Application {
public void onCreate() {
super.onCreate();
//是否调试
CrashReport.initCrashReport(getApplicationContext(), "", false);
到这里,Bugly的配置基本上是OK的,我们可以引起一个bug,然后日志过滤一下
便可以看到
当然,你也可以去Bugly的后台查看
我们可以查看详情
分析的很透彻,我们很容易就找到问题的所在了第三方SDK的接入(2)
cocos2d-xLua编程(15)
1、腾讯Bugly简介
BuglySDK是可以上报bug到开发者后台的sdk,获取的信息可以包括用户移动设备的硬件信息(平台、系统、CPU架构、内存等各种信息)以及出错的堆栈信息。总之,这是一个可以让开发者快速获取用户端的设备信息的SDK,大大的提高了bug的修复效率。
2、注册Bugly账号
去注册账号获取到APPID和APPKey等信息
3、集成Bugly插件
需要准备BuglyCocosPlugin这个官网提供的插件
这里面有很多内容,包括Android和iOS两个平台,可以获取到js C++ Lua等错误,这里只介绍Cocos-Lua的插件集成以及错误捕获。
首先把bugly目录放在cocos引擎的external文件内
这里是确保可以用到CrashReport.h以及lua文件内的内容(具体要看你的项目了)
然后把agent/Android目录下面的.jar文件和BuglySDK/Android下面的.jar文件放到项目的libs目录下面。
然后我们再把libBugly.so文件放进$(PROJECT)/jni/prebuilt
具体要放那个so文件具体要看设备的CPU架构来决定,有关so文件的知识建议仔细了解一下
然后修改proj.android/jni/Android.mk文件,修改这个资源是要生成我们bugly相关功能需要的so文件,有关Android.mk文件去这里了解一下。
这些makefile代码主要是新建了一个module,然后生成一个libbugly_native_prebuilt.so文件跟包一起支持Bugly的工作。
接下来我们需要在AndroidManifest.xml文件内加一些代码:
到这个地方,BuglyCocosPlugin这个插件我们已经集成在我们的项目里面了,不过最开始我们申请的APPID还没使用到,还是没法和我们的后台链接,那么这里我们来初始化一下这个插件
在Classes/AppDelegate.cpp文件的AppDelegate::applicationDidFinishLaunching()函数里面调用CrashReport::initCrashReport(const char* appId, bool debug)来对Bugly初始化。
对了,还要记得加上头文件
OK,到目前为止,完成了大部分工作,不过还剩下最后一步,就是注册错误上报函数。让我们继续
接下里修改Android.mk文件,用来支持Lua错误的捕获
$(call import-moudle,external/bugly/lua)这局代码加到最后面
并且在Classes/AppDelegate.cpp文件的AppDelegate::applicationDidFinishLaunching()函数里面调用接口BuglyLuaAgent::registerLuaExceptionHandler(...)进行初始化,并且对刚才导入的头文件进行更新
最后在lua脚本的__G__TRACKBACK__这个脚本里面调用lua错误上报的bugly接口
到这里,接入工作就结束了,不过还没有配符号表,符号表可以让错误堆栈更加人性化,这里先不提了~
最后,应用的出错信息就可以获取到了
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63663次
积分:1965
积分:1965
排名:千里之外
原创:130篇
转载:27篇
评论:22条
(4)(1)(5)(2)(2)(6)(8)(7)(27)(14)(5)(2)(7)(20)(1)(1)(3)(5)(2)(9)(2)(1)(1)(22)腾讯Bugly亮相MDCC大会,助力开发者提升应用质量 日17:38作者:腾讯Bugly|&&&&日至16日,由CSDN和创新工场联合主办的,以“万物互联,移动为先”为主题的移动开发者盛宴――2015移动开发者大会(以下简称CC2015)在北京隆重举行。腾讯Bugly作为移动应用崩溃检测服务行业的领导者,亮相本次MDCC2015移动开发者大会,为移动开发者带去了这一饕餮盛宴。目前Bugly已经对所有移动开发者开放。移动开发者在自己的App中接入腾讯Bugly的SDK后,就能在应用崩溃后获得信息上报,开发者可以通过腾讯Bugly的网站看到崩溃的概要和详情。
&&&&十年磨一剑,将产品做到极致
&&&&腾讯Bugly作为腾讯技术开放的第一步,从2010年才开始产品化,经过四年的打磨,直到已经出具成型,在2014年10月才正式对外开放,提供给广大移动开发者使用。坚持“出精品,不废话”。
&&&&腾讯Bugly是业内首家能检测卡顿/ANR(应用主线程长时间失去响应时弹出的“等待或关闭”报错,在iOS平台一般称卡顿,Android平台一般称ANR)的服务。
&&&&对于Android移动应用的异常监控,除了普通的Java类型崩溃,腾讯Bugly还能检测原生崩溃。因此使用AndroidNDK开发C/C++的移动开发团队也能使用Bugly。
&&&&腾讯Bugly能够统计应用启动多少秒之后崩溃的用户数,方便开发者直观了解对用户伤害巨大的闪退的情况。腾讯Bugly还能显示应用崩溃多少次以上的用户数,方便开发者了解对忠诚用户的伤害程度。
&&&&依托腾讯的,Bugly对用户在海外发生的应用崩溃也能实时上报。这个功能对于希望海外发行应用的团队很有吸引力,比如游戏海外发行商。
&&&&用户的支持,是前进的动力
&&&&腾讯Bugly上线后获得了广大开发者的认可,已经为2万多个移动产品提供过Crash监测服务,所有的服务全部免费。在本次的MDCC2015的现场受到了广大移动应用开发者的一致好评,吸引了许多移动开发者前来咨询与了解。
&&&&腾讯Bugly作为腾讯开发者服务体系开放的第一步,将持续的努力,“以追求极致的态度,打造用户爱不释手的产品”。为了更好的为移动应用开发者提供极致的服务,让移动应用开发变得更简单,腾讯Bugly后将陆续推出RDM灰度体验、持续集成和自动化测试(优测)等服务。&&&&责任编辑:王慧霞
【征稿电话:010-
(10.16 17:21)(10.16 17:18)(10.16 17:18)(10.16 17:18)(10.16 17:18)(10.16 17:18)(10.16 17:10)(10.16 17:06)(10.16 16:54)(10.16 16:54)(10.16 16:47)
? ? ? ? ? ? ?
标王热词推荐
? ? ? ? ? ? ? ?6329人阅读
iOS开发(97)
一:给大家介绍一款简单高效的应用崩溃收集方法:腾讯Bugly
腾讯 Bugly,是腾讯公司为移动开发者开放的服务之一,面向移动开发者提供专业的 Crash 监控、崩溃分析等质量跟踪服务。Bugly 能帮助移动互联网开发者更及时地发现掌控异常,更全面的了解定位异常,更高效的修复解决异常。
针对移动应用,腾讯 Bugly 提供了专业的 Crash、Android ANR ( application not response)、iOS 卡顿监控和解决方案。移动开发者 ( Android / iOS ) 可以通过监控,快速发现用户在使用过程中出现的 Crash (崩溃)、Android ANR 和 iOS 卡顿,并根据上报的信息快速定位和解决问题。
移动互联网时代,由于设备的碎片化,客服人员每天要接到很多用户反馈在各种不同机型上的崩溃问题,又没有办法提供具体的 Crash 日志给开发人员。测试人员每天需要对用户的反馈进行 Bug 复现,然后抓取log 日志,人力成本,手机终端成本非常高,造成很多资源浪费。
腾讯无线研发部发现该问题后,开始开发这套 Crash 监控上报体系。经过了四年多的开发与打磨,目前腾讯的所有产品都已经接入了Bugly质量监控平台,开发同学只要登陆 Bugly 网站,就可以清晰的看到每天自己的产品有多少 Crash,影响了多少用户的使用,并可以根据 Bugly 提供的 Crash 日志进行问题修复,极大的提高了工作效率。
2011年初- 2014年10月 Bugly 服务于腾讯内部所有项目,如QQ邮箱、浏览器、手机QQ、腾讯视频等。
2014年10月起,腾讯 Bugly 对外开放给更多的开发者使用,帮助开发人员更准确高效的定位解决问题。
对产生的问题进行24小时的监控,把握崩溃前后的各个时间节点。Bugly 目前支持 iOS 和 Android 两大主流平台的崩溃分析上报,包括iOS的不同开发语言(Object-C 以及 Swift), 并支持 Android 操作系统的 java 层和 NDK 层全面的崩溃上报。符号还原功能可以帮助开发者定位到具体错误的代码,帮助开发者快速定位问题,修改问题。
Bugly 还支持了不同游戏引擎的脚本层错误上报,对于使用 Cocos 以及 Unity 引擎进行开发的游戏,Bugly的代码还原可以帮助开发这定位到引擎脚本的堆栈,包括 Cocos 的 Lua 脚本,C++ 脚本,以及 Unity 的 C# 脚本。
Android / iOS 游戏
支持 Untily 游戏引擎的脚本错误上报、支持 Cocos 游戏引擎的Lua脚本错误上报、Android NDK 错误上报、Android 和 iOS 64 位系统支持、Android全架构支持、Android 系统的 ANR 以及 iOS 系统的卡顿上报、实时上报问题、适配最新官方系统、精准问题定位、自定义 log 上报、监控、统计功能、智能合并分析。
Android&应用
NDK 支持、全架构 / 64位系统支持、应用 ANR 上报、实时上报问题、自定义 log 上报、精准问题定位、适配最新官方系统监控、统计功能、智能合并分析。
语言支持 Swift & Object-C、支持 iOS 手表、支持 64位系统、应用卡顿上报、适配最新官方系统、精准问题定位以及全面的问题上报、自定义 log 上报、实时上报问题、监控、统计功能、进行智能合并分析。
Bugly 经过腾讯内部4年打磨,目前腾讯所有产品都在使用,其适配性基本覆盖了中国市场的移动设备以及网络环境,可靠性有保证。使用 Bugly,就等于使用了和手机 QQ、QQ 空间、手机管家相同的质量保障途径,Bugly 会持续对产品进行优化打磨,帮助更多的开发者打造更有品质的产品。
二:iOS集成
(1)iOS集成先把Bugly的SDK导入工程中,可以使用QQ帐号登录Bugly官网下载解压手动导入,也可以使用CocoPods命令导入。
(2)使用QQ帐号登录Bugly官网注册应用
(3)获得Appid,这个Appid是上一步注册应用时Bugly官方自动生成的,所有使用Bugly的应用中每个应用的Appid唯一。点击帐号信息------&点击我的App-------&点击注册的应用名称,即可看到该应用的Appid。
(3)在AppDelegate.m中导入#import&&Bugly/Bugly.h&,在启动完成方法中初始化Bugly,Appid就是上一步我们得到的Appid。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//Bugly初始化方法
[Bugly startWithAppId:@&&];
return YES;
三 :此时便可以对应用崩溃日志进行搜集,崩溃日志会上传到Bugly官网服务器,我们使用QQ号登录Bugly官网就可以查看。
我做了两个崩溃测试,一个是数组越界,一个是按钮绑定方法没有实现,代码如下:
ViewController.m
Created by fe on 16/7/13.
Copyright © 2016年 fe. All rights reserved.
#import &ViewController.h&
@interface ViewController ()
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//数组越界的错误测试
[self arryTest];
//定义方法没有实现的错误测试
[self methodTest];
//数组越界的错误测试
-(void)arryTest
NSArray *testArry = @[@&1&,@&2&,@&3&];
NSString *testStr = testArry[3];
NSLog(@&%@&,testStr);
//定义方法没有实现的错误测试
-(void)methodTest
UIButton *testButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
testButton.center = self.view.
[testButton addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:testButton];
收集到的日志信息如下:
总结:总体来说Bugly还是很方便,很实用,很高效的,可以有效的搜集崩溃日志,优化应用。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:65245次
积分:1690
积分:1690
排名:千里之外
原创:96篇
转载:69篇
(1)(4)(1)(1)(10)(19)(24)(7)(10)(4)(11)(14)(3)(6)(1)(20)(11)(11)(7)酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
Android平台的诞生为手机智能化的普及立下汗马功劳,但其最大的缺点也越来越凸显,那就是碎片化严重:设备繁多、品牌众多、版本各异,芯片、摄像头、分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不仅造成Android系统混乱,也导致Android应用隐形开发成本的增多。本文中详细介绍了Android琳琅满目的适配问题。
一、个性化十足的Launcher
快捷方式虽然看起来只是一个很小的功能点,但是它涉及到的机型适配问题很多。
快捷方式创建代码:
ntentaddShortCut=newIntent(&com.android.launcher.action.INSTALL_SHORTCUT&);
addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME,title);
//不允许重复创建
addShortCut.putExtra(&duplicate&,false);
addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon);
addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent);
sendBroadcast(addShortCut);
1. 无法创建快捷方式
越来越多的手机厂商取消了快捷方式的概念,导致我们无法通过代码创建一个自己真实需要的快捷方式,数据显示,这样的手机约占13%。
2. 重复创建快捷方式
通常情况下,我们是不希望自己的快捷方式被重复创建。使用addShortCut.putExtra(&duplicate&, false);方法就能达到目的,但是市面上至少有8%的手机,即使设置了duplicate为false,还是可以重复创建快捷方式。
代表手机品牌为:华为、中兴、HTC。
Android Launcher源码:
2.1 重复创建快捷方式的解决方案V1.X
我们最早使用的解决快捷方式重复创建的方法是:在创建快捷方式前先执行删除操作。这种方式其实很聪明,因为即使是在快捷方式不存在的情况下执行删除操作也不会有任何异常。这样看来问题解决得太轻松了,但是遗憾的是删除快捷方式同样存在适配问题,数据显示大约21%的手机无法正常删除快捷方式。
另外一种方法是:自行保存快捷方式的创建记录,通过一个字段来记录快捷方式是否已经创建过了,以此来决定是否创建新的快捷方式。这种做法也是因为出现快捷方式无法删除情况后对解决方案进行了一个小的升级,虽然可以解决问题,但是如果程序被清除了数据,那么一切都乱了,还是无法彻底的规避重复的问题。
2.2 重复创建快捷方式的解决方案V2.X
遇到难解的问题还是看看源码吧,Android的Launcher源码在创建快捷方式的时候不仅会判断duplicate的值,还会在数据库中查询一下将要被创建的快捷方式是否已经存在,我们也照做就OK了。
此外,我们也注意到,查询数据库的时候访问地址URI是一个很重要的因素,问题是数据库的URI比较多,Android标准的URI就有3个:
2.2版本以前的URI是:content://com.android.launcher.settings/favorites?notify=true
2.2~4.3版本的URI是:content://com.android.launcher2.settings/favorites?notify=true
4.4版本以上的目前都是:content://com.android.launcher3.settings/favorites?notify=true
不仅仅Android自己的Launcher数据库地址众多,厂商自己定义的地址就更加丰富多彩,如OPPO R827T的访问URI为:content://com.oppo.launcher.settings /favorites?notify=true;HTC Z715e的访问地址为:content://com.htc.launcher.settings/favorites?notify=true。事实上远远不止这些,还有不计其数的第三方Launcher应用,很多开发者也会修改数据库访问地址,目前仅我们掌握的不同访问地址就有多达40种左右。
通过权限查询URI:
通过数据库的读写权限来查询对应的URI相信大家也不陌生,感觉上像是找到了终极的解决方案,且看下去...
问题一:如果使用完整的权限进行查询--权限众多,我们目前掌握的超过50种。
问题二:如果使用不完整的权限进行查询(READ_SETTINGS)对应关系复杂,大约有 32% 的手机会对应两个以上的URI。
GT-I8262D:
authority:com.sec.android.app.launcher.settings ReadPermission:com.android.launcher.permission.READ_SETTINGS
authority:com.sec.android.app.launcher.settings.id ReadPermission:com.android.launcher.permission.READ_SETTINGS
Lenovo A278t:
authority:com.aspire.mm.Settings ReadPermission:com.aspire.mm.permission.READ_SETTINGS
authority:com.huaqin.launcherEx.settings ReadPermission:com.huaqin.launcherEx.permission.READ_SETTINGS
authority:com.huaqin.thememgr.Settings ReadPermission:com.huaqin.thememgr.permission.READ_SETTINGS
二、多姿多彩的Camera
1. Intent调用手机内相机程序
如果我们设置了照片的存储路径,那么很可能会遇到一下三种问题:
问题一:onActivityResult方法中的data返回为空(数据表明,93%的机型的data将会是Null,所以如果我们指定了路径,就不要使用data来获取照片,起码在使用前要做空判断)。
问题二:照片无法存储。
如果自定义存储路径是/mnt/sdcard/lowry/,而手机SD卡下在拍照前没有名为lowry的文件夹,那么部分手机拍照后图片不会保存,导致我们无法获得照片,大多数手机的相机遇到文件夹不存在的情况都会自己创建出不存在的文件夹,而个别手机却不会创建,其代表机型为:三星I8258、华为H30-T00、红米等。
解决的方法就是在指定存储路径前先判断路径中的文件夹是否都存在,不存在先创建再调用相机。
问题三:照片可以存储,但是名字不对。
file:///mnt/sdcard/123 1.jpg,由于URI的fromFile方法会将路径中的空格用&%20&取代。
其实对于大多数的手机这都不算事,手机在解析存储路径的时候都会将&%20&替换为空格,这样实际上最终的照片名字还是我们当初指定的名字:123 1.jpg,遗憾的是个别手机(如酷派7260)系统自带的相机没有将&%20&读成空格,拍照后的照片的名字是123%201.jpg,我们用路径&file:///mnt/sdcard/123 1.jpg&能找到照片才怪!
(1)使用onActivityResult中的intent(data)前要做空判断。
(2)指定拍照路径时,先检查路径中的文件夹是否都存在,不存在时先创建文件夹再调用
相机拍照。
(3)指定拍照存储路径时,照片的命名中不要包含空格等特殊符号。
2. 通过Camera的open方法调用手机摄像头
2.1 连续自动对焦crash
原因:第一次对焦未结束,应用层又发起的第二次对焦,引起对焦失败。
解决方案一:传入AutoFocusCallback;
解决方案二:延时操作;
解决方案三:异常捕获。
2.2 摄像头个数判断错误
现象:当我们使用Camera.getNumberOfCameras()方法检测摄像头数量时返回的结果不准确,如果我们尝试打开一个不存在的摄像头肯定会抛出异常,这也提醒我们在开启Camera摄像头时需要加异常保护。
代表机型:联想278T、酷派8022
2.3 闪光灯的判断
我们常用的判断手机是否有闪光灯的方法应该有以下两种:
判断是否支持闪光灯方法一:使用getSupportedFlashModes方法;
判断是否支持闪光灯方法二:通过PackageManager判断。
方法一有3.7%的机器结果错误,无法准确地判断出手机是否有闪光灯,主要的品牌包含:酷派、天语、联想、三星等。方法二有9.7%的机器结果错误,主要品牌包含:VIVO、金立、酷派、天语、朵唯、三星等。
我们建议在判断手机是否有闪光灯的时候将这两种方法联合使用,出现错误的概率将大大降低。
2.4 常亮状态与其他状态间的切换
前提条件是我们设置闪光灯为常亮(Parameters.FLASH_MODE_TORCH),并且闪光灯成功常亮。此时我们在设置闪光灯模式为Parameters.FLASH_MODE_AUTO后闪光灯依然常亮,这样的机型约占热门机型的12%。遇到这种情况我们需要先设置闪光灯模式为Parameters.FLASH_MODE_OFF关闭闪光灯后再设置其他模式。
2.5 释放Camera后闪光灯依旧闪亮
既然开了,我们就要负责关,说实话,以前这个问题根本不在我的考虑范内,因为我们在使用Camera的时候都会在Activity被销毁或者暂停时释放Camera。这个时候无论闪光灯是什么状态,都会随着Camera的释放而关闭。直到我遇见了OPPO R815T,我的世界观发生了变化,这货如果设置了闪光灯常亮,即使释放了Camera闪光灯依旧稳稳地亮着。
而且由于Camera被释放掉了,你再也没办法关闭闪光灯了,关闭App、卸载App,你还是扣电池关机吧.....所以,如果你的程序中有设置闪光灯为常亮状态的操作,建议在释放Camera前先将闪光灯设置为关闭(Parameters.FLASH_MODE_OFF)状态。
2.6 CameraInfo的另类情况
官方文档中有关于调整相机预览角度的例子:
在这个例子中CameraInfo非常重要,最终的角度计算就是根据CameraInfo中orientation值得到的,所以如果这个值不准确的话,那么我们的角度就有可能出现错误。
VIVO V1手机第一次获取CameraInfo的orientation值是90,而当执行了mCamera = Camera.open();之后再获取CameraInfo的orientation值就是0,而且以后获取的都是 0 ,除非重启手机。
无论是这款手机上的哪个应用,只要执行了一次Camera.open()之后,其他所有程序中获取CameraInfo的orientation都是是0。
手机自带的相机却能很好的使用反编译系统相机后果然发现系统相机并没有像官方给出的例子来进行角度的矫正。
解决方案:
按照此手机系统相机的做;
对该手机CameraInfo的orientation值写死为90。
三、不止是2的双卡
双卡的问题解决的基本思路:
推断:手机内置的系统APP都可以正常使用这些功能,因此肯定存在厂商自定义API来实现这些功能;
反编译:Framework、系统App、系统数据库;
定位:TelephoneManager扩展、SMSManager扩展、电话服务扩展、短信服务扩展、数据库字段扩展。
四、UI适配
说到UI适配其实很是让人头疼,下面的图片是某个产品为了进行UI适配所做的工作,可以看出相当繁琐。
除了分辨率的适配,有时候布局文件中的某个标签还会引起一些问题,我们先看下面一段布局代码:
正确结果:
错误结果:
这就是因为Android 3.0以下版本在FrameLayout中使用layout_marginTo标签,必须要设置gravity才能生效。
那么如何解决这个问题呢?在设置android:layout_marginTop的组件中再设置一下 android:layout_gravity=&top&即可。
五、还有更奇葩的
1. 厂商的抽象方法
如果你需要实现InputConnection接口,那么你一定要注意下面这个很奇葩的异常:
反编译了下此款手机的Framework,发现厂商在InputConnection接口中增加了一个抽象方法performYLPrivateCommand。
2. 距离传感器
2.1 不同手机event.values[0]值简直是千变万化
简单说几个有代表性的:
一部分手机比较正常,靠近时为0远离时为1(0,1);
有点小个性的手机数值将变大,比如(0,100),(3,5),(3,100)等等;
213手机的数值就比较莫名其妙,(1.001,5.003),你是表明精确度高?
2.2 数值与远近关系不统一
既然我们是通过数值来判断当前是否出于近耳状态,那么是不是应该这个数值的大小是有说道的?靠近时的数值小一点,远离时的数值大一些,起码我见过的99%的手机是这样子的。但是就有几款神经病手机(100W)偏偏是靠近时的数值比远离时的数值大,这是个坑,开发者要注意~~!!
2.3 getMaximumRange方法返回值不对
有一句API:SensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY).getMaximumRange(),文档解释这个应该获取的是传感器数值变化的最大范围,比如如果靠近时的值是0,远离时的值是1。那么getMaximumRange()的值应该是1才不会影响我们的判断,我这里仅仅是从API角度和我们日常的使用习惯来说的,如果不是这样的规律,就会对我们的造成麻烦。
作者简介:
李忠丞(Lowry),沈阳大学学士,腾讯优测产品支撑组组长;2011年加入腾讯,专注移动终端开发,先后参与过腾讯微博研发以及手机QQ浏览器、Qzone、魅拍等产品的机型适配工作。
& 相关主题:

我要回帖

更多关于 腾讯bugly 镜像 的文章

 

随机推荐