package tws.component.log.impl; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Properties; import tws.component.log.TwsLog; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Environment; import android.telephony.TelephonyManager; import android.text.TextUtils; /** * Title: TwsLogUtils * Package: tws.component.log.impl * Author: interzhang * Date: 14-3-17 下午4:23 * Version: v1.0 */ public class TwsLogUtils { public final static String KEY_LOG_SWITCH ="log_switch"; private static final String LOG_CFG_DIR = "/log_cfg"; private static final String LOG_CFG_FILENAME = "log_switch.ini"; private static String PHONE_IMEI = null; public static final int TYPE_UNKNOWN = 0x000; public static final int TYPE_NET = 0x001; public static final int TYPE_WAP = 0x002; public static final int TYPE_WIFI = 0x004; public static final int TYPE_2G = 0x008; public static final int TYPE_3G = 0x010; public static final int TYPE_4G = 0x011; public static String getProcessName() { int pid = android.os.Process.myPid(); Object out = execCommand(new String[]{"/system/bin/ps", String.valueOf(pid)}, new ProcessHandler() { @Override public Object handleProcessInputStream(InputStream is) { if (is != null) { BufferedReader br = null; try { String str; int index = 0; br = new BufferedReader(new InputStreamReader(is)); while ( (str = br.readLine()) != null ) { if (index == 1) { int pos = str.lastIndexOf(" "); if (pos >= 0) { return str.substring(pos + 1); } break; } index++; } } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { if (br != null) { try { br.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } if (is != null) { try { is.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } return null; } }); if (out != null && String.class.isInstance(out)) { return (String)out; } else { return ""; } } /** * 检查SD卡是否可用 * * @return boolean */ public static boolean isExternalStorageAvailable() { try { /* 华为的手机会脑残,Environment.getExternalStorageState()会NullPointerException */ if (TextUtils.equals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState())){ return true; } return false; } catch(Exception ex) { return false; } } public static File getLogFileDirectory(String packageName, boolean dataStorage) { String logPtah; if ("android".equals(packageName)) { logPtah = "data/system/tws" + "/log/"; } else if (!isExternalStorageAvailable() || dataStorage) { logPtah = "data/data/" + packageName + "/log/"; } else { logPtah = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/Android/data/" + packageName + "/log/"; } File logDir = new File(logPtah); if (logDir.exists()) { return logDir; } else { boolean res = logDir.mkdirs(); if (res) { return logDir; } else { return null; } } } public static File getCrashFileDirectory(String packageName) { String path; if ("android".equals(packageName)) { path = "data/system/tws" + "/crash/"; } else if (!isExternalStorageAvailable()) { path = "data/data/" + packageName + "/crash/"; } else { path = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/Android/data/" + packageName + "/crash/"; } File dir = new File(path); if (dir.exists()) { return dir; } else { boolean res = dir.mkdirs(); if (res) { return dir; } else { return null; } } } public static File createNewFile(String fileDir, String fileName) { if (TextUtils.isEmpty(fileDir) || TextUtils.isEmpty(fileName)) { return null; } // 文件夹路径 File dir = new File(fileDir); if (!dir.exists()) { if (!dir.mkdirs()) { return null; } } // 创建文件 File file = new File(fileDir, fileName); if (!file.exists()) { try { if (!file.createNewFile()) { return null; } } catch (IOException e) { return null; } } return file; } private static Object execCommand(String[] args, ProcessHandler handler) { if(args == null || args.length == 0) { return null; } final ProcessWorker processWorker = new ProcessWorker(args); Process process = null; processWorker.start(); try { processWorker.join(3000l); // 3s超时 if (processWorker.getExitCode() != null) { process = processWorker.getProcess(); if (process != null) { return handler.handleProcessInputStream(process.getInputStream()); } } } catch(Exception e) { processWorker.interrupt(); } finally { try { if (process != null) { process.destroy(); } } catch(Exception e) {} } return null; } private static class ProcessWorker extends Thread { private String[] mArgs; private Integer mExitCode; private Process mProcess; public ProcessWorker(String[] args) { mArgs = args; } public Integer getExitCode() { return mExitCode; } public Process getProcess() { return mProcess; } @Override public void run() { try { final ProcessBuilder cmd = new ProcessBuilder(mArgs); mProcess = cmd.start(); mExitCode = mProcess.waitFor(); } catch (Exception e) { System.out.println(e.getMessage()); } } } public static interface ProcessHandler { public Object handleProcessInputStream(InputStream in); } /** * 获取TwsLog日志配置开关 * @param * @return */ public static boolean getLogCfgSwitch(String packageName) { int logSwitch = 0; InputStream inputStream = null; File logCfg = new File(getLogCfgPath(packageName)); if (logCfg == null || !logCfg.exists() || !logCfg.isFile()) { return false; } try { inputStream = new FileInputStream(logCfg); Properties property = new Properties(); property.load(inputStream); String value = property.getProperty(KEY_LOG_SWITCH); logSwitch = Integer.valueOf(value); } catch (Exception e) { e.printStackTrace(); logSwitch = 0; } finally { try { if (inputStream != null) { inputStream.close(); inputStream = null; } } catch (Exception e) { e.printStackTrace(); } } return logSwitch == 1 ? true : false; } /** * 获取TwsLog配置文件路径 * @param * @return */ private static String getLogCfgPath(String packageName) { String logFile = ""; if ("android".equals(packageName)) { logFile = "data/system/tws" + LOG_CFG_DIR + File.separator + LOG_CFG_FILENAME; } else if(isExternalStorageAvailable()) { String logCfgDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tencent/tws" + LOG_CFG_DIR; logFile = logCfgDir + File.separator + LOG_CFG_FILENAME; } return logFile; } /** * 获取手机imei * @param context * @return */ public static String getImei(Context context){ if (PHONE_IMEI != null && !"".equals(PHONE_IMEI)) { return PHONE_IMEI; } try { TelephonyManager mTelephonyManager = (TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE); if (mTelephonyManager != null) { PHONE_IMEI = mTelephonyManager.getDeviceId(); } if (PHONE_IMEI != null) { PHONE_IMEI = PHONE_IMEI.toLowerCase(); } } catch (Exception e) { e.printStackTrace(); } return PHONE_IMEI; } /** * 将字节型数据转化为16进制字符串 */ public static String byteToHexString(byte[] bytes) { if (bytes == null || bytes.length <= 0) { return null; } StringBuffer buf = new StringBuffer(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { if ((bytes[i] & 0xff) < 0x10) { buf.append("0"); } buf.append(Long.toString(bytes[i] & 0xff, 16)); } return buf.toString(); } /** * 是否是wifi网络模式 (通过contex获取系统当前状态) * @param context * @return */ public static boolean isWifiMode(Context context) { return getNetType(context) == TYPE_WIFI; } /** * 或当前网络类型 * -- 返回2G/3G/wifi类型 */ private static int getNetType(Context context) { if (context == null) { return TYPE_UNKNOWN; } try { ConnectivityManager manager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (manager == null) { return TYPE_UNKNOWN; } // getActiveNetworkInfo方法在部分机型上调用crash,这里catch下异常 NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo == null) { return TYPE_UNKNOWN; } int type = networkInfo.getType(); if (type == ConnectivityManager.TYPE_WIFI) { return TYPE_WIFI; } if (type == ConnectivityManager.TYPE_MOBILE) { int subType = networkInfo.getSubtype(); switch (subType) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: return TYPE_2G; case TelephonyManager.NETWORK_TYPE_LTE: return TYPE_4G; default: return TYPE_3G; } } } catch (Exception e) { TwsLog.w("TwsLogUtils", "getNetType-> e:" + e + ", err msg: " + e.getMessage()); } return TYPE_UNKNOWN; } }