編輯:關於Android編程
直接上代碼:
package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; import android.annotation.SuppressLint; import android.os.Environment; import android.util.Log; /** * Android開發調試日志工具類[支持保存到SD卡]
*
* * 需要一些權限:
*
*
* * @author PMTOAM * */ @SuppressLint("SimpleDateFormat") public class MyLog { public static final String CACHE_DIR_NAME = "dPhoneLog"; public static boolean isDebugModel = true;// 是否輸出日志 public static boolean isSaveDebugInfo = true;// 是否保存調試日志 public static boolean isSaveCrashInfo = true;// 是否保存報錯日志 public static void v(final String tag, final String msg) { if (isDebugModel) { Log.v(tag, "--> " + msg); } } public static void d(final String tag, final String msg) { if (isDebugModel) { Log.d(tag, "--> " + msg); } } public static void i(final String tag, final String msg) { if (isDebugModel) { Log.i(tag, "--> " + msg); } } public static void w(final String tag, final String msg) { if (isDebugModel) { Log.w(tag, "--> " + msg); } } /** * 調試日志,便於開發跟蹤。 * @param tag * @param msg */ public static void e(final String tag, final String msg) { if (isDebugModel) { Log.e(tag, "--> " + msg); } if (isSaveDebugInfo) { new Thread() { public void run() { write(time() + tag + " --> " + msg + "\n"); }; }.start(); } } /** * try catch 時使用,上線產品可上傳反饋。 * @param tag * @param tr */ public static void e(final String tag, final Throwable tr) { if (isSaveCrashInfo) { new Thread() { public void run() { write(time() + tag + " [CRASH] --> " + getStackTraceString(tr) + "\n"); }; }.start(); } } /** * 獲取捕捉到的異常的字符串 * @param tr * @return */ public static String getStackTraceString(Throwable tr) { if (tr == null) { return ""; } Throwable t = tr; while (t != null) { if (t instanceof UnknownHostException) { return ""; } t = t.getCause(); } StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); tr.printStackTrace(pw); return sw.toString(); } /** * 標識每條日志產生的時間 * @return */ private static String time() { return "[" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date( System.currentTimeMillis())) + "] "; } /** * 以年月日作為日志文件名稱 * @return */ private static String date() { return new SimpleDateFormat("yyyy-MM-dd").format(new Date(System .currentTimeMillis())); } /** * 保存到日志文件 * @param content */ public static synchronized void write(String content) { try { FileWriter writer = new FileWriter(getFile(), true); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取日志文件路徑 * @return */ public static String getFile() { File sdDir = null; if (Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) sdDir = Environment.getExternalStorageDirectory(); File cacheDir = new File(sdDir + File.separator + CACHE_DIR_NAME); if (!cacheDir.exists()) cacheDir.mkdir(); File filePath = new File(cacheDir + File.separator + date() + ".txt"); return filePath.toString(); } }
本文的代碼接著上一篇獲取聯系人信息寫的。在獲取聯系人信息的時候,我發現遍歷Cursor來獲取所有聯系人的信息比較慢,比如我手機上有大約不到四百人的聯系方式,全部遍歷一次大
1、結構體的創建及導入,結構體指針等。以JniNativeInterface, DexHeader為例。解析Dex的函數如下: F5後如下:&nbs
Android Studio在Android Monitor中包含了一個logcat的tab,可以打印系統事件,比如垃圾回收發生時,實時打印應用消息。為了顯示需要的信息,
手機上的頁面不像桌面開發這麼方便調試。可以使用Weinre進行遠程調試以方便開發。本文介紹windows下的安裝與使用。安裝使用npm安裝,可以運行: npm insta