2012-03-17 18 views
1

私はadb logcatによって作成されたログを読み込むアプリケーションを作成しようとしています。 link1link2上のコードに続いて、私は次のコードを持っている:Android:アプリケーションログ経由でログを読む

try { 
     Process process = Runtime.getRuntime().exec("logcat"); 
     System.out.println("Process : " + process); // shows process id 
     BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
     System.out.println("Buffered reader : " + bufferedReader.readLine()); 
     StringBuilder log = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) { 
      log.append(line); 
     } 
     TextView tv = (TextView) findViewById(R.id.textView1); 
     tv.setText(log.toString()); 
    } catch (IOException e) { 
    } 

バッファリング読者が読んでいるかをテストするために、私はのprintlnを入れて、私はメッセージ「TCPバインドできません:5038」を取得します。上記のコードはログを読みません。私も "logcat *:V"を使ってみましたが、最低優先度のログも取得しませんでした。

私はアプリに許可を与えました:android.permission.READ_LOGS。

Androidエミュレータで自分のコードをテストしています。

誰かが間違っていることを指摘できますか?

ありがとうございます。

EDIT

が、私は "logcat -d" しようとした私は、ログの1行を得ました。このコードでは、try/catchブロックが提供されていることがわかります。 私はアプリから許可READ_LOGSを取り除くと、例外は発生しません。とbufferReaderは単にnullを出力します(通常、アプリケーションが必要な権限を見つけられなかった場合、例外が発生します)。 この動作の理由は何ですか?

EDIT2:

私が試したLog.d(TAG、log.toString())とテキストの複数行を得ました。誰かが前回の編集の最後の質問を説明してください:必要な権限を削除すると、なぜアプリケーションによって例外が発生しないのですか?

+0

「logcat -d」afaikである必要があります。しかし、ログの読み込みを停止しないため、ANRを取得する可能性があります。あなたは、バックグラウンドスレッド、AsyncTaskまたはそのようなもので読書を移動する必要があります。編集:忘れて、いいえANR。 – zapl

+0

@zapl私は質問を編集しました。 – Jake

+0

あなたのTextViewディスプレイは1行以上表示できます( 'android:singleLine')?また、 'tv.setText(log.toString());'を実行した後、 'Log.d(" TAG "、log.toString());'を実行して、表示エラーでないことを確認することもできます。それとも例外がありますか?もしそうなら、あなたの質問にそれを加えてください。 – zapl

答えて

3

あなたはおそらく)あなたがRuntime.getRuntime(経由ログを読み取るためのアクセス許可を得ることはできないため、マニフェスト

0

<uses-permission android:name="android.permission.INTERNET" /> 

を持っていないにメッセージ「cannot bind tcp:5038」を取得しています。

アンドロイドデベロッパーチームは、これらのアクセス許可をサードパーティのアプリケーションに許可しないことにしました。システムアプリだけがそれを入手できるようになりました。

詳細:https://code.google.com/p/acra/issues/detail?id=100

関連する問題