-1

SQLite データベース アプリのバックアップ/復元 (エクスポート/インポート) プロセスを作成しようとしています。

ファイルを作成してデータを入力したように見えますが (OK、作成したことがわかりました)。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 sディレクトリがあります)。

Windows エクスプローラーでは、内部ストレージSD カードの両方がHTC_0PKV1デバイスの下のデバイスとして表示されます。

Windows エクスプローラーでは、ダウンロードディレクトリに (プロパティ経由で) 0 個のディレクトリとファイルがあります。読み取り専用も非表示もチェックされていません。

setReadableと を使用した場合と使用しない場合の両方を試しましたsetWritable()

電話でファイルマネージャーを使用してみましたが、ファイルを表示できるようになりました。より具体的には、質問は次のとおりです。Windows エクスプローラー経由でファイルにアクセスするために、電話をルート化して電話のファイル マネージャー経由でファイルを移動する以外の方法はありますか?

また、アプリはタブレットで実行されることも述べておく必要があるため、メソッドはデバイス固有ではなく汎用的なものにする必要があります。

4

1 に答える 1