【问题标题】:How to get logcat -v time in an Android App?如何在 Android 应用程序中获取 logcat -v 时间?
【发布时间】:2019-12-10 11:45:16
【问题描述】:

我需要从设备获取 logcat -v 时间并将其保存到 SD 卡中的文本文件中。问题是当我按下按钮时我的应用程序冻结了。

我知道这可能会发生,因为 logcat -v time 不断获取设备所有操作的日志,不间断。我需要所有这些信息。但我不知道如何正确编码。有人可以帮帮我吗?

提前致谢!

这是我的代码:

btn_comeca.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
try {
                    Process process = Runtime.getRuntime().exec("logcat -v");
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

                    StringBuilder log=new StringBuilder();
                    String line = "";
                    while ((line = bufferedReader.readLine()) != null) {
                        log.append(line);
                    }

                    try {

                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
                            //Verifica permissão de gravar/ler
                            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

                            } else {

                                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MODE_ENABLE_WRITE_AHEAD_LOGGING);
                            }
                        }
                        File caminho_arquivo = new File("/sdcard/ARQUIVOFINAL.txt");
                        caminho_arquivo.createNewFile();
                        FileOutputStream fileOutputStream = new FileOutputStream(caminho_arquivo);
                        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
                        TextView tv = (TextView)findViewById(R.id.texttext);
                        String texto = "";
                        //tv.setText(log.toString());
                        texto = log.toString();
                        //outputStreamWriter.append(tv.getText());
                        outputStreamWriter.append(texto);
                        outputStreamWriter.close();
                        fileOutputStream.close();
                        Toast.makeText(getBaseContext(), "Text File Saved!", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                    }

                }
                catch (IOException e) {}
}

【问题讨论】:

  • 不明白做这种事情的目的,反正看看这个stackoverflow.com/a/14628593/1025070
  • 实际上一个设备有一些奇怪的行为,制造商希望我得到它的 logcat 来查看设备中发生的一切。所以我决定制作这个应用程序,以便更容易获得 logcat。
  • 如果是这样,无需尝试保存在设备 sdcard 中,您可以在连接了设备“adb logcat > logcat.txt”的计算机上运行,​​这会将所有 logcat 输出重定向到文本文件。
  • UdayaLakmal,我知道。使用电脑工作正常。但我想这个应用程序只是为了不使用任何电脑。这将使所有事情变得更加容易。

标签: java android process logcat


【解决方案1】:

问题可能是:您的逻辑同步工作。你不应该在主线程中执行这样的工作,因为它可能导致 ANR(Android 无响应)。

不过,有很多方法可以解决这个问题。由于您没有使用多线程框架(例如 RxJava,如果您有兴趣,可以阅读它),您可以使用 AsyncTask。你可以把它放在你的监听器中。

编辑:不过,稍后再看看 MVVM 或 MVP 模式和多线程框架。这些东西在生产中被广泛用于执行不同类型的异步任务。

new AsyncTask<Void, Void, Void>(){
    @Override
    protected Void doInBackground(Void... params) {
        // Place your logic here
        return;
    }
}.execute();

【讨论】:

  • 谢谢 Steyrix,我会做测试的。
【解决方案2】:

logcat 的正常调用不会每次都自行退出。

因此,您的代码将永远停留在您的 while 循环中。

根据https://developer.android.com/studio/command-line/logcat

使用-d“将日志转储到屏幕并退出。”命令行选项。

这是我用类似的方法将 logcat 输出显示到TextView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2011-02-19
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多