Storage Access Framework への置き換え (File:スキームからContent: スキームへ置き換えを行う)

Android OS 11( API level 30 導入)に辺り、StorageAccess周りの実装をFileスキームメインから、Contentスキームをメインとする実装に置き換えたので、 それに辺り、参考にしたサイトリンクを備忘用に貼っておく。(何もまとまっていませんが、参考になれば幸いです、、)

SAFによるlistFiles(),copyDocument,move,rename等

copyDocumentは課題あり。 https://stackoverflow.com/questions/66660155/android-saf-cannot-copy-file-flag-supports-copy-not-set

use ContentProvider https://stackoverflow.com/questions/64820884/documentscontract-copydocument

SAFの初期URL指定について

FileスキームからContentスキームへのConvert

直接,FileスキームからContentスキームへ変換できないので、InputStream/OutputStreamを介して変換した。 you cannot directory convert File scheme to Content scheme. So, first you open inputStream from File scheme copy inputstream to outputstream at Byte format. then, save outputStream as Content scheme.

https://qiita.com/wakamesoba98/items/98b79bdfde19612d12b0

  • 参考
public static final int EOF = -1;
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

public static boolean convertFileToContent(File file, Uri uri, context) {
    try {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            iuputStream = new FileIutputStream(file);
            outputStream = context.getContentResolver().openOutputStream(uri, "w").;

            long fileSizeSaved = copy(inputStream, outputStream);
            outputStream.flush();
            return true;
        } catch (IOException e) {
            return false;
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    } catch (IOException e) {
        return false;
    }
}

private static long copy(InputStream input, OutputStream output) throws IOException {
    final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    long count = 0;
    int n;
    while (EOF != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

Android11ではall files access permission権限が追加され、強力な権限のため、ユーザープライバシーを考慮し出来る限り推奨されない。

-android11(API level30)->pravacy->storage update https://developer.android.com/about/versions/11/privacy/storage?hl=ja

  • MANAGE_EXTERNAL_STORAGE

https://support.google.com/googleplay/android-developer/answer/10467955?hl=ja#zippy=%2C%E7%84%A1%E5%8A%B9%E3%81%AA%E4%BD%BF%E7%94%A8%2C%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E7%94%A8%E9%80%94%E3%81%AB%E4%BB%A3%E3%82%8F%E3%82%8B%E6%96%B9%E6%B3%95

  • MediaStoreAPI

https://developer.android.com/training/data-storage/shared/media

Fileスキームで使用していた APIについて

http://s-prism3.seesaa.net/article/430252817.html -local storage -> getExternalFilesDirs() -shared storage -> getExternalStorageDirectory()

他、GoogleChromeOSをメンテナンスする開発者向けに、参考までに

非表示領域を表示する https://ahiru8usagi.hatenablog.com/entry/Chromebook_Android_Storage

公式 https://support.google.com/chromebook/answer/1700055?hl=ja

about GoogleOS https://developer.android.com/chrome-os/intro?hl=ja