版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中捕获错误日志
这篇文章给大家介绍怎么在Android中捕获错误日志,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先要捕获错误日志当然是调用系统的了,这样最方便,也是大家常用的了,废话不多说,直接上图,nopicsayaxx.错误日志.png其次上面的图是日志信息,下面来看看代码如何编写。捕获错误日志信息类public
class
CrashHandler
implements
UncaughtExceptionHandler
{
private
static
final
String
TAG
=
"CrashHandler";
private
static
final
boolean
DEBUG
=
true;
private
static
final
String
FILE_NAME
=
"crash";
//
log文件的后缀名
private
static
final
String
FILE_NAME_SUFFIX
=
".txt";
private
static
CrashHandler
sInstance
=
new
CrashHandler();
//
系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
private
UncaughtExceptionHandler
mDefaultCrashHandler;
private
Context
mContext;
//log路径
private
String
mLogPath=null;
//
构造方法私有,防止外部构造多个实例,即采用单例模式
private
CrashHandler()
{
}
public
static
CrashHandler
getInstance()
{
return
sInstance;
}
//
这里主要完成初始化工作
public
void
init(Context
context,String
logPath)
{
//
获取系统默认的异常处理器
mDefaultCrashHandler
=
Thread.getDefaultUncaughtExceptionHandler();
//
将当前实例设为系统默认的异常处理器
Thread.setDefaultUncaughtExceptionHandler(this);
//
获取Context,方便内部使用
mContext
=
context.getApplicationContext();
this.mLogPath=logPath;
}
/**
*
这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
*
thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
*/
@Override
public
void
uncaughtException(Thread
thread,
Throwable
ex)
{
try
{
//
导出异常信息到SD卡中
dumpExceptionToSDCard(ex);
//
这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
uploadExceptionToServer();
}
catch
(IOException
e)
{
e.printStackTrace();
}
//
打印出当前调用栈信息
ex.printStackTrace();
//
如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
if
(mDefaultCrashHandler
!=
null)
{
mDefaultCrashHandler.uncaughtException(thread,
ex);
}
else
{
Process.killProcess(Process.myPid());
}
}
/**
*
写入SD卡
*
*
@param
ex
*
@throws
IOException
*/
@SuppressLint("SimpleDateFormat")
private
void
dumpExceptionToSDCard(Throwable
ex)
throws
IOException
{
//
如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
if
(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
if
(DEBUG)
{
Log.e(TAG,
"sdcard
unmounted,skip
dump
exception");
return;
}
}
File
dir
=
new
File(mLogPath);
if
(!dir.exists())
{
dir.mkdirs();
}
long
current
=
System.currentTimeMillis();
String
time
=
new
SimpleDateFormat("yyyy-MM-dd
HH:mm:ss")
.format(new
Date(current));
//
以当前时间创建log文件
File
file
=
new
File(mLogPath
+
FILE_NAME
+
time
+
FILE_NAME_SUFFIX);
try
{
PrintWriter
pw
=
new
PrintWriter(new
BufferedWriter(new
FileWriter(
file)));
//
导出发生异常的时间
pw.println(time);
//
导出手机信息
dumpPhoneInfo(pw);
pw.println();
//
导出异常的调用栈信息
ex.printStackTrace(pw);
pw.close();
}
catch
(Exception
e)
{
Log.e(TAG,
"dump
crash
info
failed");
}
}
private
void
dumpPhoneInfo(PrintWriter
pw)
throws
NameNotFoundException
{
//
应用的版本名称和版本号
PackageManager
pm
=
mContext.getPackageManager();
PackageInfo
pi
=
pm.getPackageInfo(mContext.getPackageName(),
PackageManager.GET_ACTIVITIES);
pw.print("App
Version:
");
pw.print(pi.versionName);
pw.print('_');
pw.println(pi.versionCode);
//
android版本号
pw.print("OS
Version:
");
pw.print(Build.VERSION.RELEASE);
pw.print("_");
pw.println(Build.VERSION.SDK_INT);
//
手机制造商
pw.print("Vendor:
");
pw.println(Build.MANUFACTURER);
//
手机型号
pw.print("Model:
");
pw.println(Build.MODEL);
//
cpu架构
pw.print("CPU
ABI:
");
pw.println(Build.CPU_ABI);
}
/**
*
上传到服务器(这里需要实现)
*/
private
void
uploadExceptionToServer()
{
}
}APP(自定义的Application)public
class
APP
extends
Application
{
//log路径
private
static
final
String
LOG_PATH=
Environment
.getExternalStorageDirectory().getPath()
+
File.separator
+
"Live"
+
File.separator
+
"log"
+
File.separator;
@Override
public
void
onCreate()
{
super.onCreate();
CrashHandler.getInstance().init(this,LOG_PATH);
}
}MainActivityclass
MainActivity
:
AppCompatActivity(){
var
mBtnSecond:Button?=null;
override
fun
onCreate(savedInstanceState:
Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkPermission()
initView()
}
fun
initView(){
mBtnSecond=findViewById(R.id.btn_second)
mBtnSecond?.setOnClickListener{
var
intent=
Intent(this,SecondActivity::class.java)
startActivity(intent)
}
}
/**
*
6.0以下版本(系统自动申请)
不会弹框
*
有些厂商修改了6.0系统申请机制,他们修改成系统自动申请权限了
*/
private
fun
checkPermission(){
val
permissionItems
=
ArrayList<PermissionItem>()
permissionItems.add(PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE,
"读取空间",
R.drawable.permission_ic_phone))
permissionItems.add(PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE,"存储空间",R.drawable.permission_ic_storage))
HiPermission.create(this)
.title("亲爱的上帝")
.msg("为了能够正常使用,请开启这些权限吧!")
.permissions(permissionItems)
.style(R.style.PermissionDefaultBlueStyle)
.animStyle(R.style.PermissionAnimScale)
.checkMutiPermission(object
:
PermissionCallback
{
override
fun
onClose()
{
Toast.makeText(this@MainActivity,"用户关闭了权限",Toast.LENGTH_LONG).show();
}
override
fun
onFinish()
{
Toast.makeText(this@MainActivity,"初始化完毕!",Toast.LENGTH_LONG).show();
}
override
fun
onDeny(permission:
String,
position:
Int)
{
}
override
fun
onGuarantee(permission:
String,
position:
Int)
{
}
})
}
}MainActivity.pngCrashActivitypublic
class
CrashActivity
extends
AppCompatActivity
{
Button
mBtnCrash;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mBtnCrash=findViewById(R.id.btn_crash);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无锡物博会规划方案
- 海洋酸化对海洋生物的影响-第1篇
- Linux系统日志分析与安全审计策略
- 膀胱癌手术后护理课件
- 隧道铺轨施工安全课件
- 全国2022年春4月高等教育自学考试行政组织理论考题含解析
- 2023年10月《行政组织理论》全国自考考题含解析
- 当代西方国际移民理论再探讨
- “新零售之轮”驱动下新零售业态创新路径
- 控制权作为企业家的激励约束因素理论分析及现实解释意义
- 期中复习巩固卷(第一~三单元)(试题)-2023-2024学年北师大版四年级下册数学
- 2024年全民国家安全教育日网络知识竞赛题及答案(4.15)
- +2024年上海市杨浦区中考二模化学试题
- 2009年4月自考00139西方经济学试题及答案含解析
- T-CSEM 0024-2024 智慧消防 火灾防控系统建设要求
- 立体裁剪的艺术手法
- 轧机详细介绍.ppt
- 泥浆护壁钻孔灌注桩监理细则
- 第十章--陶瓷材料合成与制备(一)
- 美世咨询Mercer美世问题大全.doc
- 危险化学品危规号.doc
评论
0/150
提交评论