android - 在 Android 设备上创建和存储日志文件

标签 android file logging storage

我计划通过创建一个日志来存储应用程序的一些执行结果,然后使用一段 python 代码对其进行解析并绘制图表,从而自动化应用程序的测试。

该应用程序是一个 WiFi 指纹识别器,即它收集有关周围环境中 wifi 设备的信息,例如 mac id、rss(接收到的信号强度和等级(标准化 rss)。所以要测试这个应用程序,我必须把它带到位置并记录结果(截至目前手动)。所以 logcat 不能达到目的。

自动化需要 1. 将日志存储在设备中 2.通过usb访问系统中的日志文件

日志文件格式:

Snapshot: 1
Fingerprint: 1, Rank: 0.23424, Boolean: true
Fingerprint: 2, Rank: 0.42344, Boolean: false
Fingerprint: 3, Rank: 0.23425, Boolean: true

Snapshot: 2
Fingerprint: 1, Rank: 0.75654, Boolean: false
Fingerprint: 2, Rank: 0.23456, Boolean: true
Fingerprint: 3, Rank: 0.89423, Boolean: true 

................

现在我知道持久存储基本上有 3 种方法(SharedPrefs 无论如何都不适合这种情况)。我尝试了内部存储,但即使将文件的模式设置为 MODE_WORLD_READABLE 也不可能 read the file using Device File Explorer in Eclipse

我仍然对使用外部存储来存储日志持谨慎态度。任何关于如何在设备的 USB 中写入文件的教程肯定会有所帮助。

我想到了将要存储的数据结构化,以便使用 SQLite 进行存储。但这在数据之间建立了许多不必要的关系(国外和国内)并使其复杂化。如果没有办法,那就 here be dragons

基本上我想在设备中写入一个文件(我想更容易),然后通过 USB 连接到我的系统中读取它。任何有关如何做到这一点的帮助将不胜感激。

最佳答案

不管你是否警惕,外部存储仍然可能是唯一的出路。如果没有设备上的 root 访问权限,除非您可以在设备上的应用程序中阅读,否则您将无法真正获得“内部”的任何内容。文档为在何处创建外部文件提供了非常可靠的指南,如果您使用的是 API 级别 8 或更高版本,则可以使用一些额外的功能。我确定你知道这个页面,但无论如何它都在这里:http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

如果您需要任何文件 io 示例代码...我想我可以挖掘一些...

编辑 - 我将首先按照上述文档中的指南确认存储状态。不幸的是,我没有任何在 Java 中附加文件的经验,所以其他人肯定更有资格回答。这不包括追加,但我在我的一个个人应用程序中有一个备份例程,看起来像这样。

    File backupPath = Environment.getExternalStorageDirectory();

    backupPath = new File(backupPath.getPath() + "/Android/data/com.maximusdev.bankrecord/files");

    if(!backupPath.exists()){
        backupPath.mkdirs();
    }

    FileOutputStream fos;
    try {
        fos = new FileOutputStream(backupPath.getPath() + "/recordsbackup.txt");

        if(okaytowrite){
            for(int i = 0; i < count; ++i){
                entry = adapter.getItem(i);
                fos.write(entry.toString().getBytes());
                fos.write("\n".getBytes());
                fos.write(String.valueOf(entry.dateTime).getBytes());
                fos.write("\n".getBytes());
                fos.write(String.valueOf(entry.sign).getBytes());
                fos.write("\n".getBytes());
                fos.write(String.valueOf(entry.cleared).getBytes());
                fos.write("\n".getBytes());
                fos.write(String.valueOf(entry.transDate).getBytes());
                fos.write("\n".getBytes());
                fos.write(entry.category.getBytes());
                fos.write("\n".getBytes());
            }
        }
        fos.close();

        Toast.makeText(this, "Backup Complete", Toast.LENGTH_SHORT).show();

    } catch (FileNotFoundException e) {

        e.printStackTrace();

        AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this);

        delmessagebuilder.setCancelable(false);

        delmessagebuilder.setMessage("File Access Error");

        delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.dismiss();
            }
        });

        delmessagebuilder.create().show();

    } catch (IOException e) {

        e.printStackTrace();

        AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this);

        delmessagebuilder.setCancelable(false);

        delmessagebuilder.setMessage("File Access Error");

        delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.dismiss();
            }
        });

        delmessagebuilder.create().show();
    }

一旦我准备好编写,我会从 ArrayAdapter(适配器)中拉出一个自定义对象(条目)并将字段值转换为字符串,并使用 getBytes() 传递给 FileOutputStream 写入函数。我做了一些研究,在 Java/Android 中写入文件还有很多其他选择……例如 FileWriter 类,因此需要进一步研究。

关于android - 在 Android 设备上创建和存储日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726519/

相关文章:

javascript - 获取调用的 javascript 文件上的查询字符串

wolfram-mathematica - 对数间隔数

.net - 通用ILogger,或者通过Serilog,添加logging属性

linux - 您将如何设计一个系统来保护 Linux 中的日志信息?

c# - 将字符串数组传递给 C# Web 服务 (Android Ksoap2)

android facebook api 用图片贴到墙上

c - 在 C 中显示 float

c# - 如何获取实际(本地化)的文件夹名称?

android - 我可以使用 Shopify Mobile Buy SDK 为 shopify 商店构建 android 或 ios 应用程序吗?

android - 有没有办法通过 Google API 获取用户的 "home"和 "work"位置?