2016-07-03 8 views
1

私のアプリでは、タイムスタンプ付きのデバイスにデータがストリーミングされるため、ハッシュテーブル構造で保存します。ユーザーが望む場合、後で見るためにストレージに保存されるか、CSVファイルとして電子メールで送信されます。これは、iOSデバイスと、4.4と6.0を実行している2つの異なる(Samsung以外の)Android搭載デバイスでうまく動作します。 5.0.1を実行しているSamsung Galaxy S4では動作しません。Codename One Samsung Galaxy S4のストレージ動作

次のようにプログラムは、ユーザが停止ボタンを押した後、次のメソッドが呼び出され、動作:

public void stopLogging() { 
    isLogging = false; 
    dataStorage.flushStorageCache(); 
    dataStorage.writeObject(fileName, dataLogValues); 
    dataLogValues.clear(); 
} 

dataLogValuesはハッシュテーブルです。

ログに記録されたデータにアクセスするときは、特定のログにアクセスするためのボタンを使用して、使用可能なファイル名のリストを収集します。

:ログは、ストレージのエントリのString []型から選択されるとデータ格納が以前コンストラクタ

dataStorage = Storage.getInstance(); 

に初期化された

public String[] getLogList() { 
    return dataStorage.listEntries(); 
} 

は、以下の方法がファイルを取得するために呼び出されます

public Hashtable<Long, Integer> getLog(String logName) { 
    dataStorage.clearCache(); 
    Hashtable<Long, Integer> log = (Hashtable<Long, Integer>) dataStorage 
      .readObject(logName); 
    return log; 
} 

サムスンのデバイスでは、エントリ名のString []を繰り返していくうちに、各ログファイル名を表示するダイアログを追加しました。

"rList-(フルパッケージ名).RalPacControlStub"ここで、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

このような10件のうち9件で、問題は 'getClass()。getName()'が有効な値を返すことを期待するユーザーに関連しています。これは、ストレージにアクセスするコードを表示せず、ストレージが失敗する方法さえもあまり明確でないため、この問題には関係していないようです。 –

+0

私はあなたが何を意味するかわからない、私はストレージにアクセスするすべてのコードを示しました。 dataStorage変数は、Storage.getInstance()への参照を保持します。私は、writeObjectメソッドとreadObjectメソッドを使用して、格納して取り出します。私はlistEntriesを使ってファイル名のリストを取得します。ほとんどのデバイスでは、これを実行した後、listEntriesによって返されたString配列にアイテムをStorageに格納するために使用された予想されるキーがあります。サムスンのデバイスでは、私は上記の結果を得るだけです。私はソースからAndroidアプリを構築する経験はありませんが、何が起きているのかをよりよく記録するために試してみる必要があります。 –

+0

ファイル名に既知の接頭辞を追加し、その接頭辞を持つStorageの項目のみを使用することで、この問題を回避できるようです。 –

答えて

1

私はHashtableの行を見逃しているに違いありません。 Samsungデバイスには、階層に隠しファイルがあり、アクセス可能なファイルシステムメタデータを示す可能性があります。そのため、ファイル接頭辞を使用することは一般的には良い考えです。

これは、その場所に書き込まれるAPI Log.p()のファイルである可能性もあります。 Storage APIは、ストレージに書き込むファイルのみが返されることを保証するものではありません。

関連する問題