将文件保存到安装的内部存储器中并从 PC 下载

Saving a file into mounted internal storage and downloading it from PC

我有一个生成大输出文件的应用程序。我将它们保存到内部存储的 "Download" 文件夹中,我想从我的 PC 上安装的 phone 存储的 "Download" 文件夹中检索它们。

我使用的代码包含:

String filename="output.txt";
File dirname = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
FileWriter outFileWriter;
outFile = new File(dirname, filename);
outFileWriter = new FileWriter(outFile);
outFileWriter.append(outputString);
outFileWriter.close();

phone 是 Oneplus2 并且文件夹作为 Computer\ONE A2001\Internal storage\Download

安装在我的 Windows 7 上

从 adb shell 我可以看到并读取该文件,但计算机看不到它。当我将文件从我的计算机复制到安装的下载文件夹中时,我可以从 adb shell 中看到它,所以我知道我正在寻找正确的位置,但计算机看不到我的应用程序的输出文件。

ls -l 给出:

shell@OnePlus2:/storage/sdcard0/Download $ ls -l
ls -l
-rw-rw---- root     sdcard_r  2030918 2015-09-11 17:24 copiedFromComputer.jpg
-rw-rw---- root     sdcard_r   581632 2015-09-11 17:32 output.txt

所以文件权限是一样的,但是为什么我在电脑上看不到我的output.txt文件呢?

PS。有没有更好的替代方法可以在不使用 adb backup 的情况下将应用程序生成的文件检索到 PC 中?

好吧,显然文件在创建后需要由媒体扫描器编制索引,以便可以访问。

http://developer.android.com/reference/android/os/Environment.html 可以在应用程序中调用:

// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
            new String[] { file.toString() }, null,
            new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            Log.i("ExternalStorage", "Scanned " + path + ":");
            Log.i("ExternalStorage", "-> uri=" + uri);
        }
    });

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(outFile)));

或来自 adb shell:

shell@shamu:/ $ am broadcast android.intent.action.MEDIA_MOUNTED

但是,如果文件在被索引后被修改,则更改不会反映到其元数据(例如文件大小)中。然而,如果您将其下载到您的计算机,大小和其他元数据将得到纠正。

也许有人可以评论如何在 Android 系统上修改后更新已索引文件的元数据。