-1

我正在尝试为 SQLite 数据库应用程序创建备份/恢复(导出/导入)过程。

虽然我似乎已经创建并填充了文件(好吧,我现在知道我有)。我在 DDMS 和 Windows 资源管理器中都看不到该文件。我真的很希望能够做到后者(有关更具体的问题,请参见底部)。

我已成功写入文件并使用以下代码读取文件:

package mjt.sqlitetutorial;

        import android.database.Cursor; //+++++ Added
        import android.os.Build;
        import android.os.Environment;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;        //+++++ Added

        import java.io.BufferedOutputStream;
        import java.io.BufferedReader;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileOutputStream;
        import java.io.FileReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.OutputStreamWriter;



public class MainActivity extends AppCompatActivity {

    public int API_VERSION = Build.VERSION.SDK_INT;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (API_VERSION >= 23) {
            ExternalStoragePermissions.verifyStoragePermissions(this);
        }

        final String EXTSTGTAG = "EXTERNSTG";

        File file = getExternalFilesDir("File");
        Log.i(EXTSTGTAG,file.toString());
        //String extstgdirabs = Environment.getExternalStorageDirectory().getAbsolutePath();
        String extstgdirpth = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
        Log.i(EXTSTGTAG,"<=\nEXTERN STG PUB DIR=>" + extstgdirpth);
        String filepath = extstgdirpth + File.separator + "myfile.txt";
        Log.i(EXTSTGTAG,"Full File Path and name is\n\t" + filepath);

        File f = new File(filepath);
        if(!f.exists() ) {
            Log.i(EXTSTGTAG,"File did not exist (path=" + filepath + ")");
            try {
                f.createNewFile();
            }
            catch (IOException e) {
                Log.e(EXTSTGTAG,"Failure Creating New File MSG=" + e.getMessage());
            }
        }
        if(f.exists()) {
            Log.i(EXTSTGTAG,"File Already Exists (" + filepath + ")");
            try {
                Log.i(EXTSTGTAG,"Creating FileOutputStream instance.");
                FileOutputStream fos = new FileOutputStream(f);
                Log.i(EXTSTGTAG,"Creating OutputStreamWriter instance from FileOutputStream.");
                OutputStreamWriter osw = new OutputStreamWriter(fos);
                Log.i(EXTSTGTAG,"Adding Data to OutputStreamWriter.");
                osw.append("My Test Data.");

                Log.i(EXTSTGTAG,"Closing OutputStreamWriter.");
                osw.close();
                Log.i(EXTSTGTAG,"Flushing FileOutputStream.");
                fos.flush();
                Log.i(EXTSTGTAG,"Closing FileOutputStream");
                fos.close();
                Log.i(EXTSTGTAG,"All Done OK.");
            } catch (IOException e) {
                Log.e(EXTSTGTAG, "Failure Trying to write to file." + e.getMessage());
                e.printStackTrace();
            }
        } else  {
            Log.i(EXTSTGTAG,"File doesn't appear to exist when it should????");
        }
        f.setReadable(true);
        f.setWritable(true);
        if(f.exists()) {
            try {
                byte[] bytes;
                FileInputStream fis = new FileInputStream(f);
                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader br = new BufferedReader(isr);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                br.close();
                Log.i(EXTSTGTAG,"Read the following data:\n" + sb.toString());
            }
            catch (IOException e) {
                Log.e(EXTSTGTAG,"Failure trying to read file." + e.getMessage());
                e.printStackTrace();
            }
        }

    }
}

输出到日志(使用 EXTERN 作为过滤器)显示(注意第一次运行时安装应用程序运行失败但请求并设置权限。我不认为这是一个问题/原因):-

10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: /storage/emulated/0/Android/data/mjt.sqlitetutorial/files/File
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: <=
                                              EXTERN STG PUB DIR=>/storage/emulated/0/Download
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Full File Path and name is
                                                /storage/emulated/0/Download/myfile.txt
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: File Already Exists (/storage/emulated/0/Download/myfile.txt)
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating FileOutputStream instance.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating OutputStreamWriter instance from FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Adding Data to OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Flushing FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing FileOutputStream
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: All Done OK.
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: Read the following data:
                                              My Test Data.

最后一行表明它已读取文件(我假设)。在提供的消息期间没有其他日志消息(尽管有很多之前和之后)。

我正在测试的设备是带有 SD 卡的无根 HTC One M8s。但是,我相信/storage/emulated/0/Download,正在写入文件的目录位于内部存储器上。

使用 DDMS,我似乎看不到这一点(实际的 SD 卡有一个 Download目录,而不是一个 Download 目录)。

在 Windows 资源管理器中,我可以将内部存储SD 卡都视为HTC_0PKV1设备下的设备。

在 Windows 资源管理器中,下载目录(通过属性)有 0 个目录和文件。只读和隐藏都没有打勾。

我已经尝试过使用和不使用setReadableand setWritable()

我刚刚尝试使用手机上的文件管理器,现在可以看到该文件。所以更具体地说,问题是;有没有什么办法可以不通过手机上的文件管理器root手机和移动文件,通过Windows资源管理器访问文件?

我还应该声明该应用程序将在平板电脑上运行,因此该方法应该是通用的,而不是特定于设备的。

4

1 回答 1

0

断开并重新连接 USB 电缆后,该文件在 Windows 资源管理器中可见。我不确定这是否意味着 MTP 是如何工作的,或者它可能是由于 ADB 根据这个片段: -

但是,如果您曾尝试解锁您的设备,例如安装新的 ROM 或对其进行 root 操作,那么您可能曾经或多次在您的计算机上安装了 Android 调试桥 (ADB) 驱动程序。该驱动程序非常适合使用计算机向您的设备发送命令,但它可能会扰乱您的简单文件操作。

如何让您的 Android 设备显示在文件资源管理器中找到(如果不是)

于 2016-10-18T12:16:05.197 回答