web-dev-qa-db-ja.com

Android-初心者向け(内部/外部ストレージ)にファイルを保存する)

私はAndroid=開発に非常に慣れていないので、初心者の助けが必要です...

Whatsappと同じように、DatabasesディレクトリとImagesディレクトリの2つのディレクトリを持つアプリを作成しています。

他のアプリのフォルダーと同じように、電話を閲覧しているときにファイルマネージャーでこれらのディレクトリを表示したいのですが。ここで見つけたすべてを試して、内部ストレージと外部ストレージにコードから作成しました。フォルダーは作成されているようですが、電話のファイルマネージャーを参照したときに、アプリ名が含まれているフォルダーが見つかりませんでした。その中に、データベースフォルダーと画像フォルダーがあります。何が問題なのですか? Android studioフォルダーを追加するときにこれらのフォルダーを作成する必要がありますか?それともコードから作成する必要がありますか?

このタスクを完了するために必要なアクションを教えていただけますか? Android studio 3.1.3を使用しています。ヘルパーをありがとう!:)

5
Shlomi

内部ストレージ」と「外部ストレージ」という用語は、Googleの意図が私たちの意図とは異なるため、最初は混乱するかもしれません私たちの日常的な言語の使用から期待して知ってください。「外部」は必ずしも「SDカード」を意味するわけではありません。 この男は、用語の混乱についてすばらしい記事を書いた

あなたの意図によれば、 External Storage のコンセプトで作業したいと思うでしょう。違いは Documentation で詳しく説明されていますが、ここで簡単に説明します。

最後に例を示しますが、最初に基本を教えます。

内部ストレージ

  • アプリのみがアクセスできるファイル
  • アプリがアンインストールされるとファイルが削除されます
  • ファイルは常に利用可能です(つまり、ファイルがリムーバブルメモリに保存されることはありません)

外部ストレージ

  • 他のアプリ(あなたのケースでは、ファイルマネージャーアプリのバリアントを含む)でファイルを完全に読み取ることができます
  • アプリがアンインストールされてもファイルが必ずしも削除されるわけではありません-後で説明します
  • ファイルの可用性は保証されていません(他のアプリ/リムーバブルメモリで削除できます)

外部ストレージが必要であることがわかったので、開始する前に実行する必要があることがいくつかあります。

  • 必要に応じて、_Manifest.xml_ファイル内にPermissions (読み取り/書き込み)を要求します。
_    <manifest ...>
    <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
    </manifest>
_

各パーミッションはそれぞれ独立しています。つまり、たとえば、ファイルを書き込むのではなく、ファイルを読み取るだけの場合は、両方を持つ必要はありません。

  • storageが利用可能であることを確認します-これは実行時に行われ、ドキュメント内で詳しく説明されています。ストレージがデバイスにマウントされていることを確認する必要があります。その状態は、読み取り/書き込み要求の失敗を引き起こすような方法で問題が発生しないようにする必要があります。

時間の例!

指定されたメソッドでは、ルートディレクトリ内にテキストファイルを保存します。

この記事 へのクレジット

_public void writeFileExternalStorage() {

    //Text of the Document
    String textToWrite = "bla bla bla";

    //Checking the availability state of the External Storage.
    String state = Environment.getExternalStorageState();
    if (!Environment.MEDIA_MOUNTED.equals(state)) {

        //If it isn't mounted - we can't write into it.
        return;
    }

    //Create a new file that points to the root directory, with the given name:
    File file = new File(getExternalFilesDir(null), filenameExternal);

    //This point and below is responsible for the write operation
    FileOutputStream outputStream = null;
    try {
        file.createNewFile();
        //second argument of FileOutputStream constructor indicates whether
        //to append or create new file if one exists
        outputStream = new FileOutputStream(file, true);

        outputStream.write(textToWrite.getBytes());
        outputStream.flush();
        outputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
_

具体的にいくつかの質問にお答えしたいと思います。

Android studioフォルダーを追加するときにこれらのフォルダーを作成する必要がありますか?それともコードから作成する必要がありますか?

間違いなくAndroid Studio経由ではありません。これらはプロジェクトのフォルダであり、コードが含まれています。その方法は上記で説明しています。

アプリ名が含まれているフォルダーが見つかりませんでした。その中には、データベースフォルダーと画像フォルダーがあります...何がいけないのですか?

おそらく、ファイルを内部ストレージとして保存したか、前述のようにプロジェクトフォルダーとして保存しました。これらは表示されません(表示されるべきではありません)。


知っておくと便利なこと

ディレクトリには、パブリックとプライベートの2種類があります。

プライベート

  • メディアストアからアクセスできません
  • アプリをアンインストールするとファイルが削除されます
  • getExternalFilesDir(...)メソッドで取得

例:WhatsAppディレクトリ(私の電話内)はルートレベルにあります。それを呼び出すと:getExternalFilesDir("WhatsApp/...")

公開(ダウンロード/映画/画像ライブラリ)

  • ファイルは MediaStore によってスキャンされます
  • Environment.getExternalStoragePublicDirectory(...)メソッドで取得

例:Documentsフォルダーを取得すると、次のようになります:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)

7
Barak