在我的应用程序中,一些数据以时间戳流式传输到设备中,因此我将其存储在Hashtable结构中。如果用户需要,它也会保存到存储器中供以后查看或以CSV文件形式发送电子邮件。这适用于iOS设备,以及运行4.4和6.0的两个不同(非三星)品牌的Android设备。它不适用于运行5.0.1的三星Galaxy S4。
程序按如下方式工作,用户按下停止按钮后,将调用以下方法:
public void stopLogging() {
isLogging = false;
dataStorage.flushStorageCache();
dataStorage.writeObject(fileName, dataLogValues);
dataLogValues.clear();
}
dataLogValues是Hashtable。
当有时间访问记录的数据时,会收集一个可用文件名列表,其中包含用于访问特定日志的按钮。
public String[] getLogList() {
return dataStorage.listEntries();
}
之前在构造函数
中初始化了dataStoragedataStorage = Storage.getInstance();
从存储条目的String []中选择日志时,将调用以下方法来检索文件:
public Hashtable<Long, Integer> getLog(String logName) {
dataStorage.clearCache();
Hashtable<Long, Integer> log = (Hashtable<Long, Integer>) dataStorage
.readObject(logName);
return log;
}
在三星设备上,我添加了一个对话框,显示每个日志文件名,因为我遍历条目名称的String [],我只得到以下内容:
&#34; rList-(完整包名).RallyPacControlStub&#34;其中RallyPacControl是应用程序的名称。如果我还显示String []的大小,我会得到我保存的日志数量的预期条目数。这是我处理日志条目的代码,并避免我不想要的文件。为此创建的日志文件仅由表示创建时间的时间/日期字符串命名。
String[] logList = dataBuffer.getLogList();
for (int i = 0; i < logList.length; i++) {
Dialog.show("Log name", logList[i], "OK", null);
if (!logList[i].equalsIgnoreCase("Cookies")
&& !logList[i].startsWith("CN1")
&& !logList[i].equals("Infopage")
&& !logList[i].startsWith("Chart")
&& !logList[i].startsWith("Log")) {
String log = logList[i];
Container buttonContainer = new Container();
buttonContainer.setUIID("LogButtonContainer");
buttonContainer.setName("LogListContainer");
buttonContainer.setLayout(new BoxLayout(BoxLayout.X_AXIS));
buttonContainer.add(new ShowLogButton(log, dataBuffer
.getLog(logList[i])));
buttonContainer.add(new ExportLogButton((logList[i])));
buttonContainer.add(new LogDeleteButton(log, this));
logsContainer.add(buttonContainer);
}
}
答案 0 :(得分:1)
我一定错过了Hashtable
读取的行。三星设备可能在层次结构中有一个隐藏文件,用于指示您可以访问的文件系统元数据,因此使用文件前缀通常是一个好主意。
这也可能是Log.p()
API中写入该位置的文件。请注意,Storage
API并不保证只返回您写入存储的文件。