在应用程序中读取Logcat会返回null

时间:2011-04-05 17:35:49

标签: android logcat

我读了其他帖子,无法弄清楚“技巧”。

我查看了Log Collector,但无法使用单独的APK。我基本上使用相同的方法,并且我一直没有得到任何关于流程输入流的信息。

我在清单中有READ_LOGS。

在我的默认活动中,我能够获取日志,但如果我将逻辑移动到另一个活动或使用asynctask,则不会返回任何输出。

此代码来自我的默认活动...内联,我将其转储到日志

 try {
    Process process = Runtime.getRuntime().exec("logcat -d");
       BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream()));

    StringBuilder log=new StringBuilder();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        log.append(line);
    }
    Log.d(LOGTAG, "Logcat: " +log.toString());
 } catch (IOException e) {}

如果我将它包装在asynctask中或只是在另一个活动中内联它,它将不返回任何内容

    ArrayList<String> commandLine = new ArrayList<String>();
    //terminate on completion and suppress everything except the filter
    commandLine.add("logcat -d -s");
       ...
    //replace asynctask with inline (could not get log in asynctask)
    showProgressDialog(getString(R.string.acquiring_log_progress_dialog_message));
    final StringBuilder log = new StringBuilder();
    BufferedReader bufferedReader = null;
    try{

        Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
        bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = bufferedReader.readLine()) != null){ 
            log.append(line);
            log.append(MangoApp.LINE_SEPARATOR); 
        }


        sendIntent.putExtra(Intent.EXTRA_TEXT, log.toString());
        startActivity(Intent.createChooser(sendIntent, getString(R.string.chooser_title)));
        dismissProgressDialog();
        dismissMainDialog();
        finish();           
    } 
    catch (IOException e){
        dismissProgressDialog();
        showErrorDialog(getString(R.string.failed_to_get_log_message));
        Log.e(LOGTAG, "Log collection failed: ", e);//$NON-NLS-1$
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ignore) {}
        }
    }

有人能发现差异还是解释魔法?我很确定命令行在第二个版本中是正确的,所以我的头脑。我在模拟器上使用2.1 SDK 7.

由于

2 个答案:

答案 0 :(得分:6)

希望这会有所帮助,您不必自己创建文件只需执行以下命令,即可获取错误信息。

Runtime.getRuntime().exec("logcat -v time -r 100 -f /sdcard/log.txt *:E");

Logcat参数选项:

-r <size in kilobytes> -> for specifying the size of file  
-f <filename> -> file to which you want to write the logs.

答案 1 :(得分:2)

你可以在没有ArrayList的情况下试一试。只需传递命令String 我已通过以下方式实现它(没有ArrayList)。它对我有用。

        String baseCommand = "logcat -v time";
        baseCommand += " MyApp:I "; // Info for my app
        baseCommand += " *:S "; // Silence others

        ServicesController.logReaderProcess = Runtime.getRuntime().exec(baseCommand);