6

私のプロジェクトでは、センサー データをファイルに保存し、さらに分析するために 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 エクスプローラーを使用してダウンロード フォルダーに移動すると、そこにはありません。

4

3 に答える 3

0

「adb pull filename」と Astro が認識するフル パス名を使用して端末を使用してみましたか? これはうまくいくはずです。これを自分で使用している場合は、それほど難しくありません。

于 2013-01-15T21:06:18.247 に答える
0

私もこれを経験しました(私のNexus 4で)。ファイルは携帯電話に存在していましたが (adb shell を使用して見つかりました)、ラップトップのファイル エクスプローラーではファイルが見つかりませんでした。@billtian が言ったように、これは Nexus 4 および 7 デバイスのバグのようです。古い Ericsson Xperia でコードを試してみたところ、ラップトップ経由でファイルを見つけることができました。

于 2013-04-22T07:11:52.563 に答える
0

なぜ、あなたのメールに送信しないのが最善です. 次の例を参照してください。

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"email@example.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "subject here");
intent.putExtra(Intent.EXTRA_TEXT, "body text");
File root = Environment.getExternalStorageDirectory();
File file = new File(root, xmlFilename);
if (!file.exists() || !file.canRead()) {
    Toast.makeText(this, "Attachment Error", Toast.LENGTH_SHORT).show();
    finish();
    return;
}
Uri uri = Uri.parse("file://" + file.getAbsolutePath());
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Send email..."));
于 2015-11-21T06:13:54.183 に答える