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

问题描述:

我打算通过创建一个日志来存储应用程序的执行结果并使用一段python代码解析它并自动绘制一个图表。在Android设备上创建和存储日志文件

该应用程序是一个WiFi fingerprinter,即它收集信息,如mac id,rss(接收到的信号强度和关于周围环境中的wifi设备的等级(标准化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读取它在我的系统。任何帮助如何做到这一点将不胜感激。

+1

请访问http://code.google.com/p/microlog4android。 – 100rabh 2011-04-20 12:43:24

+0

@ 100rabh关于如何使用它的任何指针? – primpap 2011-04-20 19:10:16

+0

相关的问题在这里,用简单的答案显示如何写入SD卡:http://*.com/questions/1756296/android-writing-logs-to-text-file – RenniePet 2015-11-02 15:47:38

警惕与否,外部存储仍然是唯一的出路。如果没有设备上的root权限,除非您在设备上的应用程序中阅读完成,否则您无法真正了解“内部”。这些文档为创建外部文件的位置提供了非常可靠的指导原则,如果您使用API​​ Level 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(适配器)和场valuse转换为字符串和使用的getBytes()传递给FileOutputStream中写入功能。我已经做了一些研究,并且在Java/Android中有很多其他选项用于文件写入...例如FileWriter Class,因此需要进一步研究。

+0

该文件io写入外部存储代码的示例有助于。 :) – primpap 2011-04-20 07:28:18

+0

我会看看我能做什么... Java是诚实不是我的第一语言,所以在C中的这样的例子会更多我的速度。我会尝试在Java中发布一些东西,但它可能会被烧毁......我现在在Java中所做的所有io最多都是非常黑客。如果其他人想在此期间加入,它肯定会受到欢迎。具体来说......不幸的是,我还没有做过任何文件追加。 – Maximus 2011-04-20 14:35:07

+0

感谢您的关注。我读到外部存储的文件io与java中的文件没有区别。所以我可以管理它。 – primpap 2011-04-20 14:55:37

我使用了一种非常简单的方法,通过创建FileWriter对象将字符串消息写入日志文件。

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(); 

      } 
     } 

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

public void writeToFile(String message){ 
      try { 
       out.write(message+"\n"); 
       out.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+0

更好的例子,可能会自己借用这个方法。 – Maximus 2012-01-13 16:05:31

+1

'out.write(...)'语句后需要'out.close()'。否则它不会保存写入。 (我认为这是困难的方法。) – Randy 2014-04-05 15:39:57

+0

一旦你out.close()缓冲区,你就不能重写文件了。也就是说,如果你在'createFileOnDevice'中的'out.close()',你需要在下一个'out.write()'之前在'writeToFile'中创建一个具有相同路径的'FileWriter'。 – lanyusea 2015-08-03 08:28:17