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

Pri*_*han 21 logging storage android file

我计划通过创建一个日志来自动化应用程序的测试,该日志存储应用程序的一些执行结果,后者使用一段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 

................
Run Code Online (Sandbox Code Playgroud)

现在我知道持久存储基本上有3种方法(无论如何,SharedPrefs都不适合这种情况).我尝试了内部存储,但即使在设置文件模式之后,因为MODE_WORLD_READABLE无法使用Eclipse中的设备文件资源管理器读取文件.

我仍然担心使用外部存储来存储日志.任何有关如何在设备的USB中写入文件的教程肯定会有所帮助.

我想构建要存储的数据,以便使用SQLite进行存储.但这在数据之间建立了许多不必要的关系(国内和国内)并使其变得复杂.如果没有办法,那么这里就是龙.

基本上我想写一个文件(我想更容易)在设备中,后者在我的系统中通过usb连接到它来读取它.如何做任何帮助将非常感激.

Max*_*mus 13

不管是否谨慎,外部存储仍然是唯一的出路.如果没有设备上的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();
    }
Run Code Online (Sandbox Code Playgroud)

一旦我准备好编写,我就从ArrayAdapter(适配器)中提取自定义对象(条目)并将字段值转换为字符串,并使用getBytes()传递给FileOutputStream写入函数.我已经做了一些研究,并且在Java/Android中有很多其他的文件编写选项...例如FileWriter Class,因此需要进一步研究.


Pri*_*han 13

我使用一种非常简单的方法通过创建FileWriter对象将String消息写入日志文件.

    public static BufferedWriter out;
        private void createFileOnDevice(Boolean append) throws IOException {
                /*
                 * Function to initially create the log file and it also writes the time of creation to file.
                 */
                File Root = Environment.getExternalStorageDirectory();
                if(Root.canWrite()){
                     File  LogFile = new File(Root, "Log.txt");
                     FileWriter LogWriter = new FileWriter(LogFile, append);
                     out = new BufferedWriter(LogWriter);
                     Date date = new Date();
                     out.write("Logged at" + String.valueOf(date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "\n")); 
                     out.close();

            }
        }
Run Code Online (Sandbox Code Playgroud)

现在函数将新消息写入日志文件.

    public void writeToFile(String message){
            try {
                out.write(message+"\n");
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
Run Code Online (Sandbox Code Playgroud)