LocalLogRunnable.java 7.84 KB
package com.ectrip.cyt.exceptionsave.debug;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.ectrip.cyt.exceptionsave.init.InitAppValue;
import com.ectrip.cyt.utils.LogUtil;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;

public class LocalLogRunnable implements Runnable{

	private static final String TAG="LocalLogRunnable";

	private Context mContext;
	private Throwable ex;
	private String log_file_path;

	public LocalLogRunnable(Context mContext, Throwable ex) {
		super();
		this.mContext = mContext;
		this.ex = ex;
	}

	@Override
	public void run(){
		// TODO Auto-generated method stub

		if(!Environment.MEDIA_MOUNTED.equals(Environment
				.getExternalStorageState())){
			return;
		}
		String dir = Environment.getExternalStorageDirectory().getPath()
				+"/"+getApplicationName()+ "/log/";

		try {
			new File(dir).mkdirs();
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Calendar now = Calendar.getInstance();
		StringBuffer buffer=new StringBuffer();
		buffer.append(now.get(Calendar.YEAR)+"_");
		buffer.append((now.get(Calendar.MONTH) + 1) +"_");
		buffer.append(now.get(Calendar.DAY_OF_MONTH) +"_");
		buffer.append(now.get(Calendar.HOUR_OF_DAY) +"_");
		buffer.append(now.get(Calendar.MINUTE) +"_");
		buffer.append(now.get(Calendar.SECOND));
		log_file_path = dir + "log_" + buffer.toString() + ".txt";

		File file = new File(log_file_path);
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		accessFile(log_file_path,
				"system is The breakdown of the system, this is the final collapse of the log.");
		accessFile(log_file_path, "\n---------------------------------------\n");

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
		String time = df.format(new Date());// new Date()为获取当前系统时间

		accessFile(log_file_path, "exception-time;" + time + "\n");
		accessFile(log_file_path, "exception-Class;" + ex.toString() + "\n");
		accessFile(log_file_path, "exception-Message;" + ex.getMessage() + "\n");
		accessFile(log_file_path,
				"exception-LocalizedMessage;" + ex.getLocalizedMessage() + "\n");

		accessFile(log_file_path, "\n---------------------------------------\n");
		StringBuffer sb = new StringBuffer();
		sb.append(ex.toString());
		StackTraceElement[] ste = ex.getStackTrace();
		for (StackTraceElement e : ste) {
			Log.e(TAG,"..........errorInfo:"+e.toString());
			accessFile(log_file_path, e.toString() + "\n");
		}
		ex.printStackTrace();

//		if (InitAppValue.getInstance().isOpenSystemCrash()) {//打开文件
//			Intent intent = new Intent();
//			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		// 设置intent的Action属性
//			intent.setAction(Intent.ACTION_VIEW);
		// 获取文件file的MIME类型
//			String type = getMIMEType(file);
		// 设置intent的data和Type属性。
//			intent.setDataAndType(Uri.fromFile(file), type);
		// 跳转
//			mContext.startActivity(intent);
//		}
//		if( ! InitAppValue.getInstance().isSendErrorToEmail())
//		{
		android.os.Process.killProcess(android.os.Process.myPid());
//		}
	}

	public String getApplicationName() {
		PackageManager packageManager = null;
		ApplicationInfo applicationInfo = null;
		try {
			packageManager = mContext.getApplicationContext().getPackageManager();
			applicationInfo = packageManager.getApplicationInfo(mContext.getApplicationContext().getPackageName(), 0);
		} catch (PackageManager.NameNotFoundException e) {
			applicationInfo = null;
		}
		String applicationName =
				(String) packageManager.getApplicationLabel(applicationInfo);
		return applicationName;
	}

	public String getLog_file_path() {
		return log_file_path;
	}

	public void setLog_file_path(String log_file_path) {
		this.log_file_path = log_file_path;
	}

	/**
	 * 根据文件后缀名获得对应的MIME类型。
	 *
	 * @param file
	 */
	private String getMIMEType(File file) {

		String type = "*/*";
		String fName = file.getName();
		// 获取后缀名前的分隔符"."在fName中的位置。
		int dotIndex = fName.lastIndexOf(".");
		if (dotIndex < 0) {
			return type;
		}
		/* 获取文件的后缀名 */
		String end = fName.substring(dotIndex, fName.length()).toLowerCase();
		if (end == "")
			return type;
		// 在MIME和文件类型的匹配表中找到对应的MIME类型。
		for (int i = 0; i < MIME_MapTable.length; i++) { // MIME_MapTable??在这里你一定有疑问,这个MIME_MapTable是什么?
			if (end.equals(MIME_MapTable[i][0]))
				type = MIME_MapTable[i][1];
		}
		return type;
	}

	/** 对指定文件追加内容 */
	public synchronized static void accessFile(String fileName, String content) {
		RandomAccessFile randomFile = null;
		try {
			randomFile = new RandomAccessFile(fileName, "rw");
			long fileLength = randomFile.length();

			randomFile.seek(fileLength);
			randomFile.write(content.getBytes("utf-8"));

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (randomFile != null) {
				try {
					randomFile.close();
				} catch (IOException e) {
					e.printStackTrace();
					LogUtil.d(TAG, LogUtil.getExMsg(e));
				}
			}
		}
	}

	/** 打开方式 */
	private final String[][] MIME_MapTable = {
			// {后缀名, MIME类型}
			{ ".3gp", "video/3gpp" },
			{ ".apk", "application/vnd.android.package-archive" },
			{ ".asf", "video/x-ms-asf" },
			{ ".avi", "video/x-msvideo" },
			{ ".bin", "application/octet-stream" },
			{ ".bmp", "image/bmp" },
			{ ".c", "text/plain" },
			{ ".class", "application/octet-stream" },
			{ ".conf", "text/plain" },
			{ ".cpp", "text/plain" },
			{ ".doc", "application/msword" },
			{ ".docx",
					"application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
			{ ".xls", "application/vnd.ms-excel" },
			{ ".xlsx",
					"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
			{ ".exe", "application/octet-stream" },
			{ ".gif", "image/gif" },
			{ ".gtar", "application/x-gtar" },
			{ ".gz", "application/x-gzip" },
			{ ".h", "text/plain" },
			{ ".htm", "text/html" },
			{ ".html", "text/plain" },
			{ ".jar", "application/java-archive" },
			{ ".java", "text/plain" },
			{ ".jpeg", "image/jpeg" },
			{ ".jpg", "image/jpeg" },
			{ ".js", "application/x-javascript" },
			{ ".log", "text/plain" },
			{ ".m3u", "audio/x-mpegurl" },
			{ ".m4a", "audio/mp4a-latm" },
			{ ".m4b", "audio/mp4a-latm" },
			{ ".m4p", "audio/mp4a-latm" },
			{ ".m4u", "video/vnd.mpegurl" },
			{ ".m4v", "video/x-m4v" },
			{ ".mov", "video/quicktime" },
			{ ".mp2", "audio/x-mpeg" },
			{ ".mp3", "audio/x-mpeg" },
			{ ".mp4", "video/mp4" },
			{ ".mpc", "application/vnd.mpohun.certificate" },
			{ ".mpe", "video/mpeg" },
			{ ".mpeg", "video/mpeg" },
			{ ".mpg", "video/mpeg" },
			{ ".mpg4", "video/mp4" },
			{ ".mpga", "audio/mpeg" },
			{ ".msg", "application/vnd.ms-outlook" },
			{ ".ogg", "audio/ogg" },
			{ ".pdf", "application/pdf" },
			{ ".png", "image/png" },
			{ ".pps", "application/vnd.ms-powerpoint" },
			{ ".ppt", "application/vnd.ms-powerpoint" },
			{ ".pptx",
					"application/vnd.openxmlformats-officedocument.presentationml.presentation" },
			{ ".prop", "text/plain" }, { ".rc", "text/plain" },
			{ ".rmvb", "audio/x-pn-realaudio" }, { ".rtf", "application/rtf" },
			{ ".sh", "text/plain" }, { ".tar", "application/x-tar" },
			{ ".tgz", "application/x-compressed" }, { ".txt", "text/plain" },
			{ ".wav", "audio/x-wav" }, { ".wma", "audio/x-ms-wma" },
			{ ".wmv", "audio/x-ms-wmv" },
			{ ".wps", "application/vnd.ms-works" }, { ".xml", "text/plain" },
			{ ".z", "application/x-compress" },
			{ ".zip", "application/x-zip-compressed" }, { "", "*/*" } };

}