我是靠谱客的博主 迷你宝马,最近开发中收集的这篇文章主要介绍android上传大图闪退,Android上传闪退信息到服务器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

单利设计模式异常捕捉

public class ExceptionCrashHandler implements Thread.UncaughtExceptionHandler {

private static ExceptionCrashHandler mInstance;

private static final String TAG = "ExceptionCrashHandler";

// 获取系统默认的

private Thread.UncaughtExceptionHandler mDefaultExceptionHandler;

public static ExceptionCrashHandler getInstance() {

if (mInstance == null) {

// 用来解决多并发的问题

synchronized (ExceptionCrashHandler.class) {

if (mInstance == null) {

mInstance = new ExceptionCrashHandler();

}

}

}

return mInstance;

}

// 用来获取应用的一些信息

private Context mContext;

public void init(Context context) {

this.mContext = context;

// 设置全局的异常类为本类

Thread.currentThread().setUncaughtExceptionHandler(this);

mDefaultExceptionHandler = Thread.currentThread().getDefaultUncaughtExceptionHandler();

}

@Override

public void uncaughtException(Thread thread, Throwable ex) {

// 全局异常

Log.e(TAG, "报异常了~");

// 写入到本地文件 ex 当前的版本 手机信息

// 1. 崩溃的详细信息

// 2. 应用信息 包名 版本号

// 3. 手机信息

// 4.保存当前文件,等应用再次启动再上传,(上传文件不在这里处理)

String crashFileName = saveInfoToSD(ex);

Log.e(TAG, "fileName --> " + crashFileName);

// 3. 缓存崩溃日志文件

cacheCrashFile(crashFileName);

// 让系统默认处理

mDefaultExceptionHandler.uncaughtException(thread, ex);

}

/**

* 缓存崩溃日志文件

*

* @param fileName

*/

private void cacheCrashFile(String fileName) {

SharedPreferences sp = mContext.getSharedPreferences("crash", Context.MODE_PRIVATE);

sp.edit().putString("CRASH_FILE_NAME", fileName).commit();

}

/**

* 获取崩溃文件名称

*

* @return

*/

public File getCrashFile() {

String crashFileName = mContext.getSharedPreferences("crash",

Context.MODE_PRIVATE).getString("CRASH_FILE_NAME", "");

return new File(crashFileName);

}

/**

* 保存获取的 软件信息,设备信息和出错信息保存在SDcard中

*

* @param ex

* @return

*/

private String saveInfoToSD(Throwable ex) {

String fileName = null;

StringBuffer sb = new StringBuffer();

// 1. 手机信息 + 应用信息 --> obtainSimpleInfo()

for (Map.Entry entry : obtainSimpleInfo(mContext)

.entrySet()) {

String key = entry.getKey();

String value = entry.getValue();

sb.append(key).append(" = ").append(value).append("n");

// 2.崩溃的详细信息

sb.append(obtainExceptionInfo(ex));

// 保存文件 手机应用的目录,并没有拿手机sdCard目录, 6.0 以上需要动态申请权限

if (Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

File dir = new File(mContext.getFilesDir() + File.separator + "crash"

+ File.separator);

// 先删除之前的异常信息

if (dir.exists()) {

// 删除该目录下的所有子文件

deleteDir(dir);

}

// 再从新创建文件夹

if (!dir.exists()) {

dir.mkdir();

}

try {

fileName = dir.toString()

+ File.separator

+ getAssignTime("yyyy_MM_dd_HH_mm") + ".txt";

FileOutputStream fos = new FileOutputStream(fileName);

fos.write(sb.toString().getBytes());

fos.flush();

fos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

return fileName;

}

private String getAssignTime(String dateFormatStr) {

DateFormat dataFormat = new SimpleDateFormat(dateFormatStr);

long currentTime = System.currentTimeMillis();

return dataFormat.format(currentTime);

}

/**

* 获取一些简单的信息,软件版本,手机版本,型号等信息存放在HashMap中

*

* @return

*/

private HashMap obtainSimpleInfo(Context context) {

HashMap map = new HashMap<>();

PackageManager mPackageManager = context.getPackageManager();

PackageInfo mPackageInfo = null;

try {

mPackageInfo = mPackageManager.getPackageInfo(

context.getPackageName(), PackageManager.GET_ACTIVITIES);

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

map.put("versionName", mPackageInfo.versionName);

map.put("versionCode", "" + mPackageInfo.versionCode);

map.put("MODEL", "" + Build.MODEL);

map.put("SDK_INT", "" + Build.VERSION.SDK_INT);

map.put("PRODUCT", "" + Build.PRODUCT);

map.put("MOBLE_INFO", getMobileInfo());

return map;

}

/**

* 获取手机信息 HomiNote 6.0

*

* @return

*/

public static String getMobileInfo() {

StringBuffer sb = new StringBuffer();

try {

// 利用反射获取 Build 的所有属性

Field[] fields = Build.class.getDeclaredFields();

for (Field field : fields) {

field.setAccessible(true);

String name = field.getName();

String value = field.get(null).toString();

sb.append(name + "=" + value);

sb.append("n");

}

} catch (Exception e) {

e.printStackTrace();

}

return sb.toString();

}

/**

* 获取系统未捕捉的错误信息

*

* @param throwable

* @return

*/

private String obtainExceptionInfo(Throwable throwable) {

// Java基础 异常

StringWriter stringWriter = new StringWriter();

PrintWriter printWriter = new PrintWriter(stringWriter);

throwable.printStackTrace(printWriter);

printWriter.close();

return stringWriter.toString();

}

/**

* 递归删除目录下的所有文件及子目录下所有文件

*

* @param dir 将要删除的文件目录

* @return boolean Returns "true" if all deletions were successful. If a

* deletion fails, the method stops attempting to delete and returns

* "false".

*/

private boolean deleteDir(File dir) {

if (dir.isDirectory()) {

File[] children = dir.listFiles();

// 递归删除目录中的子目录下

for (File child : children) {

child.delete();

}

}

// 目录此时为空,可以删除

return true;

}

}

MainActivity的测试

File crashFile = ExceptionCrashHandler.getInstance().getCrashFile();

if (crashFile.exists()) {

//上传到服务器

try {

InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(crashFile));

char[] buffer = new char[1024];

int len = 0;

while ((len = inputStreamReader.read(buffer)) != -1) {

String s = new String(buffer, 0, len);

Log.e("TAG", s);

}

} catch (Exception e) {

e.printStackTrace();

}

}

// int i = 1 / 0

最后

以上就是迷你宝马为你收集整理的android上传大图闪退,Android上传闪退信息到服务器的全部内容,希望文章能够帮你解决android上传大图闪退,Android上传闪退信息到服务器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部