私のプロジェクトでは、センサー データをファイルに保存し、さらに分析するために PC からアクセスできるようにしたいと考えています。これは私がこれまでに持っていたコードで、正常に動作します:
File root = Environment.getExternalStorageDirectory();
File csvfile = new File(root, "Sensor_Data.csv");
FileWriter writer = new FileWriter(csvfile, true);
writer.append("Time");
writer.append(',');
writer.append("Position");
writer.append('\n');
Number data[] = new Number[4000];
for (int i = 0; i<4000; i+=2){
posHistory.toArray(data);
writer.append(String.valueOf(data[i]));
writer.append(',');
writer.append(String.valueOf(data[i+1]));
writer.append('\n');
}
writer.flush();
writer.close();
問題は、Nexus 7 には実際には外部ストレージがないことです (コードで外部ストレージを利用するほとんどのアプリと互換性を保つために、ある種のエミュレーターを使用していると思います)。
デバイスで Astro File Manager を使用してこのコードを実行すると、/sdcard、/storage/sdcard0、/storage/emulated/0、および /storage/emulated/legacy の 4 つの場所に「Sensor_Data.csv」ファイルが表示されます。そして、texteditor または documentviewer を使用してデバイス内から開くことができ、すべてのデータがそこにあります。
問題は、Nexus 7 を PC に接続すると、「内部ストレージ」しか表示されず、実際に開いたときに実際の内部ストレージではなく、仮想 SD カードの内容のみが表示されますが、.csv ファイルが表示されないことです。追加のディレクトリ「storage/emulated/legacy」がありますが、そこには何もありません。また、「sdcard0」または「0」フォルダーもありません。「Environment.getExternalStorageDirectory().getAbsolutePath()」をログに記録して、パスが何であるかを正確に確認すると、/storage/emulated/0 が取得されます
ファイルを内部ストレージの別の場所に保存しようとしましたが、成功しませんでしたが、アプリが外部ストレージを使用するほとんどのデバイスと互換性があるように、「外部ストレージ」に保存したいと思います。
更新 したがって、 adb pull filename を使用した後の結果は次のとおりです。
adb pull /storage/emulated/0/Sensor_Data.csv
remote object '/storage/emulated/0/Sensor_Data.csv' does not exist
adb pull /storage/emulated/legacy/Sensor_Data.csv
243 Kb/s <1495 bytes in 0.006s>
adb pull /storage/sdcard0/Sensor_Data.csv
243 Kb/s <1495 bytes in 0.006s>
adb pull /sdcard/Sensor_Data.csv
243 Kb/s <1495 bytes in 0.006s>
したがって、Astro は 4 つすべてでそれを認識し、LogCat は /storage/emulated/0/ に保存されていることを示していますが、機能しない唯一の場所は /storage/emulated/0/Sensor_Data.csv です。
また、保存しようとしました
root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
Astro の同じ 4 つの場所で再度確認できますが、Windows エクスプローラーを使用してダウンロード フォルダーに移動すると、そこにはありません。