web-dev-qa-db-ja.com

getExternalStorageDirectoryがAPI 29で廃止されたときにファイルを読み書きする方法は?

私はAndroid開発の新人であり、JavaでgetExternalStorageDirectoryを読むためにいくつかの問題に直面しています、私は読んだ https://developer.Android.com/reference/Android/os/環境 ですが、理解できません。誰かがJavaのサンプルコードを手伝ってくれませんか。

9
Mujahid khan

docs から、次のことがわかります。

getExternalStoragePublicDirectory(String type)

このメソッドはAPIレベル29で廃止されました。ユーザーのプライバシーを向上させるために、共有/外部ストレージデバイスへの直接アクセスは廃止されました。アプリがBuild.VERSION_CODES.Qを対象とする場合、このメソッドから返されたパスは、アプリから直接アクセスできなくなります。アプリは、Context#getExternalFilesDir(String)、MediaStore、またはIntent#ACTION_OPEN_DOCUMENT。などの代替手段に移行することにより、共有/外部ストレージに保存されているコンテンツに引き続きアクセスできます。

この関数にパラメーターとして何も渡さないで、ディレクトリをFileオブジェクトとして取得します。

context.getExternalFilesDir();

ここで、「コンテキスト」はthis.getContext();によって取得されるオブジェクトです

thisは、アクティビティの現在のオブジェクトです。使用中にスコープを注意深く確認してください。

重要

内部ストレージにアクセスするには、Manifest.permission.WRITE_EXTERNAL_STORAGEおよび/またはManifest.permission.READ_EXTERNAL_STORAGEはファイル AndroidManifest.xml に必要です。

追加情報:

  1. 通常、内部ストレージはAndroidデバイスのパス/ sdcard /を持っています。これは実際のパスではなく symlink です。

  2. 紛らわしいですが、Androidの「external sdcard」は、実際には内部デバイスストレージであり、外部イジェクト可能なデバイス外メモリカードストレージではありません。また、実際の外部sdカードは完全には使用できないことに注意してください。アクセス

  3. Activity クラスは Context クラスを拡張します。そのため、そこからコンテキストを取得できます。

10
Crazo7924

この静的メソッドを使用します。現在、私はこれを行うための法的な方法を見つけていません。そのため、ルートまたはgetAbsolutePathファイルパスを取得するこの静的メソッドが作成されました。

public static File getAbsoluteDir(Context ctx, String optionalPath) {
        String rootPath;
        if (optionalPath != null && !optionalPath.equals("")) {
            rootPath = ctx.getExternalFilesDir(optionalPath).getAbsolutePath();
        } else {
            rootPath = ctx.getExternalFilesDir(null).getAbsolutePath();
        }
        // extraPortion is extra part of file path
        String extraPortion = "Android/data/" + BuildConfig.APPLICATION_ID
                + File.separator + "files" + File.separator;
        // Remove extraPortion
        rootPath = rootPath.replace(extraPortion, "");
        return new File(rootPath);
    }
1

簡潔な答え:

String path = getContext().getExternalFilesDir(null).getAbsolutePath();
0