在Android界面上顯示和獲取Logcat日志輸出

在Android界面上顯示和獲取Logcat日志輸出

[TOC]

一端考、首先我們要獲取Logcat中的日志

如何獲取呢图仓?

首先我們要先定義一個(gè)String[]數(shù)組罐盔,里面的代碼是

//第一個(gè)是Logcat ,也就是我們想要獲取的log日志
//第二個(gè)是 -s 也就是表示過濾的意思
//第三個(gè)就是 我們要過濾的類型 W表示warm 救崔,我們也可以換成 D :debug惶看, I:info,E:error等等
String[] running = new String[]{"logcat","-s","adb logcat *: W"};

當(dāng)我們?cè)O(shè)置好之后六孵,我們還需要一個(gè)process類纬黎,作用通俗來講就是用Java代碼來進(jìn)行adb命令行操作代碼是:

Process exec = Runtime.getRuntime().exec(running);

通過以上的方法我們就可以獲得和過濾Logcat中的方法劫窒。

二本今、接下來開始使用IO流進(jìn)行字符操作,把數(shù)據(jù)保存在Android SDCard

首先:我們定義一個(gè)InputStream,

final InputStream is = exec.getInputStream

接下來開啟一個(gè)線程,線程中的方法就是通過IO流先讀取Logcat中的數(shù)據(jù)主巍,然后再把數(shù)據(jù)通過OutPutStream方法寫入到SDCard中冠息。

    new Thread() {
                @Override
                public void run() {
                    FileOutputStream os = null;
                    try {
                        //新建一個(gè)路徑信息
                        os = new FileOutputStream("/sdcard/Log/Log.txt");
                        int len = 0;
                        byte[] buf = new byte[1024];
                        while (-1 != (len = is.read(buf))) {
                            os.write(buf, 0, len);
                            os.flush();
                        }
                    } catch (Exception e) {
                        Log.d("writelog",
                                "read logcat process failed. message: "
                                        + e.getMessage());
                    } finally {
                        if (null != os) {
                            try {
                                os.close();
                                os = null;
                            } catch (IOException e) {
                                // Do nothing
                            }
                        }
                    }
                }
            }.start();
        } catch (Exception e) {
            Log.d("writelog",
                    "open logcat process failed. message: " + e.getMessage());
        }
    }

當(dāng)我們這個(gè)類寫完之后,我們?cè)侔褭?quán)限添加進(jìn)去就可以了孕索。

    <!-- 讀取Log權(quán)限 -->
    <uses-permission android:name="android.permission.READ_LOGS" />
    <!-- 在SDCard中創(chuàng)建與刪除文件權(quán)限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard寫入數(shù)據(jù)權(quán)限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 從SDCard讀出數(shù)據(jù)權(quán)限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

添加完權(quán)限逛艰,我們運(yùn)行試試。

1521079937761.png

然后我們?cè)俅蜷_我們的SDCard中的文件目錄:

1521079984419.png

這樣我們就已經(jīng)獲取到了Logcat中的日志(可以和控制臺(tái)的對(duì)比一下):

1521080108249.png

由于我開啟了兩次所以打印出了兩次的log.

三檬果、之后我們先創(chuàng)建頁面瓮孙,然后在按行讀取Txt文本中的內(nèi)容

首先我們開始編寫XMl視圖文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    
    <LinearLayout 
            android:layout_width="match_parent"
            android:layout_weight="7"
            android:orientation="vertical"
        >
        <ListView 
            android:id="@+id/ListLog"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            ></ListView>
        
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="horizontal" >

        <Button 
        android:layout_gravity="center"
            android:gravity="center"
            android:id="@+id/BtnLog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="清空日志"
            />
        
    </LinearLayout>

</LinearLayout>

編寫完成后,我們開始在MainActivity里面初始化我們的類

private ListView listView;
    private Button btn;
    
        
   listView = (ListView) findViewById(R.id.ListLog);
   btn = (Button) findViewById(R.id.BtnLog);
   
   

之后选脊,我們開始編寫我們的讀取TXT文件的方法

/** 
     * 根據(jù)行讀取內(nèi)容 
     * @return 
     */  
    public List<String> Txt() {    
        //將讀出來的一行行數(shù)據(jù)使用List存儲(chǔ)    
        String filePath = "/sdcard/Log.txt";    
  
        List newList=new ArrayList<String>();  
        try {    
            File file = new File(filePath);    
            int count = 0;//初始化 key值    
            if (file.isFile() && file.exists()) {//文件存在    
                InputStreamReader isr = new InputStreamReader(new FileInputStream(file));    
                BufferedReader br = new BufferedReader(isr);    
                String lineTxt = null;    
                while ((lineTxt = br.readLine()) != null) {  
                    if (!"".equals(lineTxt)) {    
                        String reds = lineTxt.split("\\+")[0];  //java 正則表達(dá)式    
                        newList.add(count, reds);  
                        count++;    
                    }    
                }    
                isr.close();    
                br.close();    
            }else {    
                Log.e("tag", "can not find file");
            }    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
        return newList;    
    }    

我們看d的代碼杭抠,其實(shí)也就是IO讀寫操作

 if (file.isFile() && file.exists()) //這一行是判斷是否有文件存在

然后我們用InputStreamReader讀取我們SDCard中的文件;

使用BufferedReader方法讀取我們獲取的字符流;

最后我們用While循環(huán)和正則表達(dá)式來把每一行都給放入List中恳啥;

最后我們返回List;

  InputStreamReader isr = new InputStreamReader(new FileInputStream(file));    
                BufferedReader br = new BufferedReader(isr);    
                String lineTxt = null;    
                while ((lineTxt = br.readLine()) != null) {  
                    if (!"".equals(lineTxt)) {    
                        String reds = lineTxt.split("\\+")[0];  //java 正則表達(dá)式    
                        newList.add(count, reds);  
                        count++;    
                    }    
                }    

還有一個(gè)XML視圖文件,名稱log_list_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
     android:textColor="#000000"
    android:gravity="left"
    android:paddingLeft="20dp"
    android:textSize="20sp"
    android:singleLine="true"


/>

接下來就是把List放入ListView中:

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.log_list_item,Txt());
 listView.setAdapter(adapter);

好讓我們運(yùn)行一下看看效果:

1521081920732.png

好了偏灿,我們的顯示日志也已經(jīng)成功了。接下來就是要可以清空日志钝的;

最后翁垂、清空日志

如何清空日志呢?

其實(shí)非常簡單

  /**
     * 刪除Log文件
     * @param fileName 文件路徑和名稱
     */
    public static void delFile(String fileName){  
        File file = new File(fileName);  
        if(file.isFile()){  
            file.delete();  
        }  
        file.exists();  
    }  

我們只需要把路徑傳過去硝桩,進(jìn)行判斷沿猜,如果有就直接刪除。

然后我們對(duì)ListView進(jìn)行刷新就可以了碗脊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啼肩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祈坠,老刑警劉巖害碾,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赦拘,居然都是意外死亡慌随,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門躺同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阁猜,“玉大人,你說我怎么就攤上這事笋籽”哪” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵车海,是天一觀的道長。 經(jīng)常有香客問我隘击,道長侍芝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任埋同,我火速辦了婚禮州叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凶赁。我一直安慰自己咧栗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布虱肄。 她就那樣靜靜地躺著致板,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咏窿。 梳的紋絲不亂的頭發(fā)上斟或,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音集嵌,去河邊找鬼萝挤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛根欧,可吹牛的內(nèi)容都是我干的怜珍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼凤粗,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼酥泛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤揭璃,失蹤者是張志新(化名)和其女友劉穎晚凿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘦馍,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歼秽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了情组。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燥筷。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖院崇,靈堂內(nèi)的尸體忽然破棺而出肆氓,到底是詐尸還是另有隱情,我是刑警寧澤底瓣,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布谢揪,位于F島的核電站,受9級(jí)特大地震影響捐凭,放射性物質(zhì)發(fā)生泄漏拨扶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一茁肠、第九天 我趴在偏房一處隱蔽的房頂上張望患民。 院中可真熱鬧,春花似錦垦梆、人聲如沸匹颤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印蓖。三九已至,卻和暖如春站刑,著一層夾襖步出監(jiān)牢的瞬間另伍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工绞旅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摆尝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓因悲,卻偏偏與公主長得像堕汞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晃琳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理讯检,服務(wù)發(fā)現(xiàn)琐鲁,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 我對(duì)那些偉大作品的每一次閱讀人灼,都會(huì)被它們帶走围段。我就像是一個(gè)膽怯的孩子,小心翼翼地抓住它們的衣角投放,模仿著它們的步伐奈泪,...
    都市打工人閱讀 196評(píng)論 0 1
  • 眾人都為這女兒哀哭捶胸。耶穌說:不要哭灸芳。他不是死了涝桅,是睡著了。 他的靈魂便回來烙样,他就立刻起來了冯遂。耶穌吩咐給他東西吃...
    YNC再寫一篇閱讀 160評(píng)論 0 0
  • 路,遙遠(yuǎn) 千里之外的夜里 刮起了秋天的第一陣涼風(fēng) 我谒获,在這里 打了一個(gè)噴嚏 你的夢(mèng)里 一定很溫暖吧 有漫天的陽光飛...
    滕吠吠閱讀 161評(píng)論 0 1