全局监听Crash

package com.example.crashcatch;

import java.io.File;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

/**
 * 处理系统未捕捉到的异常,防止app崩溃出现的不好体验
 * @author yWX206812
 *
 */
public class CrashHandler implements Thread.UncaughtExceptionHandler{
	CrashApplication crashApplication;
	UncaughtExceptionHandler defaultUncaughtExceptionHandler;
	SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-mm-dd_HH-mm-ss");
	private static CrashHandler crashHandler=new CrashHandler();
	
	
	private CrashHandler() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public static CrashHandler getInstance(){
		return crashHandler;
	}
	public void init(CrashApplication crashApplication){
		this.crashApplication=crashApplication;
		defaultUncaughtExceptionHandler=Thread.getDefaultUncaughtExceptionHandler();
		Thread.setDefaultUncaughtExceptionHandler(this);
	}
	
	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		// TODO Auto-generated method stub
		if(!catchHandler(ex)){
			defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
		}
	}
	
	
	/**
	 * 异常处理
	 * @param ex
	 * @return
	 */
	public boolean catchHandler(Throwable ex){
		boolean result=false;
		try {
			Log.e("------------------异常捕获--------------","写入文档");
			result= saveExceptionInfo(ex);
			Toast.makeText(crashApplication.getCurrentContext(), "程序异常", Toast.LENGTH_SHORT).show();
			crashApplication.getCurrentContext().sendBroadcast(new Intent(CrashActivity.crashAction));
			Log.e("------------------异常捕获--------------","发送广播");
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 获取设备和app的基本信息
	 * @return
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public Map<String, String> getBaseInfo() throws IllegalArgumentException, IllegalAccessException{
		Map<String, String> map=new HashMap<String, String>();
		long currTime=System.currentTimeMillis();
		String timeStr=simpleDateFormat.format(new Date(currTime));
		map.put("当前时间", timeStr);
		Class bClass=Build.class.getClass();
		Field[] fields=bClass.getFields();
		for (int i = 0; i < fields.length; i++) {
			String key=fields[i].getName();
			String val=fields[i].get(null).toString();
			map.put(key, val);
		}
		return map;
	}
	
	public boolean saveExceptionInfo(Throwable ex) throws IllegalArgumentException, IllegalAccessException, IOException{
		Map<String, String> map=getBaseInfo();
		map.put("", ex.getMessage());
		Set<String> keys=map.keySet();
		Iterator<String> iterator=keys.iterator();
		StringBuilder sb=new StringBuilder();
		while (iterator.hasNext()) {
			String key=iterator.next();
			String val=map.get(key);
			sb.append(key+":"+val+"\n");
		}
		String packageName=crashApplication.getCurrentContext().getPackageName();
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			File sdDir=Environment.getExternalStorageDirectory();
			File dir=new File(sdDir,packageName+"/"+"crash_log");
			if(!dir.exists()){
				dir.mkdirs();
			}
			String currLogTime=simpleDateFormat.format(new Date(System.currentTimeMillis()));
			String fileName="crash_"+currLogTime+".log";
			return SDCardUtil.writeFile(dir, fileName,sb.toString());
		}
		return false;
	}
	
}
package com.example.crashcatch;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

public class CrashActivity extends Activity {
	public static final String crashAction="CrashCatch";
	public CrashReceiver crashReceiver=new CrashReceiver();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		((CrashApplication)getApplication()).setCurrentContext(this);
		Log.e("-----------------crashReceiver-----------------","注册广播");
		IntentFilter intentFilter=new IntentFilter();
		intentFilter.addAction(CrashActivity.crashAction);
		registerReceiver(crashReceiver, intentFilter);
		Log.e("-----------------crashReceiver-----------------","注册完毕");
	}
	
	class CrashReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			Log.e("-----------------crashReceiver-----------------",intent.getAction());
			if(intent.getAction().equals(crashAction)){
				new AlertDialog.Builder(CrashActivity.this).setMessage("程序出现异常,是否退出").setNegativeButton("确认", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						unregisterReceiver(crashReceiver);
						android.os.Process.killProcess(android.os.Process.myPid());
						System.exit(0);
					}
				}).create().show();
			}
		}
	}

}

  

 

 

 SD卡检测

package com.example.crashcatch;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

import android.util.Log;

public class SDCardUtil {
	
	
	/**
	 * 读取文件返回字节数组
	 * @param filePath
	 * @return
	 */
	public static  byte[] readFile(String filePath) {
		return new byte[1];
	}

	/**
	 * 写入文件
	 * @param filePath
	 * @param bytes
	 * @return
	 * @throws IOException
	 */
	public static boolean writeFile(String filePath,String content) throws IOException {
		File f=getFile(filePath);
		if(f!=null){
			f.delete();
		}
		f=new File(filePath);
		try {
			FileWriter fw=new FileWriter(f);
			fw.write(content);
			fw.close();
			Log.e("------------------写入文件--------------","写入完毕");
			return true;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			throw e;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			throw e;
		}
	}
	
	/**
	 * 写入文件
	 * @param dir
	 * @param fileName
	 * @param bytes
	 * @return
	 * @throws IOException
	 */
	public static boolean writeFile(File dir,String fileName,String content) throws IOException {
		File f=getFile(dir,fileName);
		if(f!=null){
			f.delete();
		}
		f=new File(dir,fileName);
		return writeFile(f.getAbsolutePath(), content);
	}
	
	
	public static File getFile(String filePath) {
		File file = new File(filePath);
		return getFile(file);
	}

	public static File getFile(File file) {
		if (file.exists() && file.isFile()) {
			return file;
		}
		return null;
	}

	public static File getFile(File dir, String fileName) {
		File file = new File(dir, fileName);
		return getFile(file);
	}
}

  

posted @ 2014-07-08 18:00  q429786006  阅读(477)  评论(0编辑  收藏  举报