Android 4.4 Kitkat以降、2017年時点でAndroid 4.4以下のシェアは約20%と減少傾向にあり、File
クラスやgetExternalStorageDirectory()
メソッドを利用したSDカードへの保存はできません。このメソッドは、デバイスの内部メモリを返し、すべてのアプリに表示される画像を保存します。また、画像をアプリ専用に保存し、ユーザーがopenFileOutput()
メソッドを使用してアプリを削除したときに削除することもできます。
Android 6.0 以降では、SD カードを内部メモリとしてフォーマットできますが、デバイスにのみプライベートに使用できます。他の回答がありますが、リムーバブル SD カードを使用する場合は、以下の私の回答をお読みください。
ストレージ アクセス フレームワークを使用して、ユーザーが選択したフォルダーを取得するアクティビティのフォルダー メソッドに uri を取得しonActivityResult
、ユーザーがデバイスを再起動した後にフォルダーにアクセスできるように永続化可能なアクセス許可を取得する必要があります。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// selectDirectory() invoked
if (requestCode == REQUEST_FOLDER_ACCESS) {
if (data.getData() != null) {
Uri treeUri = data.getData();
tvSAF.setText("Dir: " + data.getData().toString());
currentFolder = treeUri.toString();
saveCurrentFolderToPrefs();
// grantUriPermission(getPackageName(), treeUri,
// Intent.FLAG_GRANT_READ_URI_PERMISSION |
// Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
ここで、保存フォルダーを共有設定に保存して、画像を保存するたびにユーザーにフォルダーを選択するように求めないようにします。
またはではなく、クラスを使用DocumentFile
して画像を保存する必要があります。詳細については、メソッドとクラスを使用してSDカードに画像を保存するためのこのスレッドを確認できます。File
ParcelFileDescriptor
compress(CompressFormat.JPEG, 100, out);
DocumentFile