Android Javaで作業中、最近SDKをAPIレベル29に更新したところ、次のような警告が表示されました。
Environment.getExternalStorageDirectory()
APIレベル29では非推奨です
私のコードは
private void saveImage() {
if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
final String folderPath = Environment.getExternalStorageDirectory() + "/PhotoEditors";
File folder = new File(folderPath);
if (!folder.exists()) {
File wallpaperDirectory = new File(folderPath);
wallpaperDirectory.mkdirs();
}
showLoading("Saving...");
final String filepath=folderPath
+ File.separator + ""
+ System.currentTimeMillis() + ".png";
File file = new File(filepath);
try {
file.createNewFile();
SaveSettings saveSettings = new SaveSettings.Builder()
.setClearViewsEnabled(true)
.setTransparencyEnabled(true)
.build();
if(isStoragePermissionGranted() ) {
mPhotoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() {
@Override
public void onSuccess(@NonNull String imagePath) {
hideLoading();
showSnackbar("Image Saved Successfully");
mPhotoEditorView.getSource().setImageURI(Uri.fromFile(new File(imagePath)));
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(new File(filepath))));
Intent intent = new Intent(EditImageActivity.this, StartActivity.class);
startActivity(intent);
finish();
}
@Override
public void onFailure(@NonNull Exception exception) {
hideLoading();
showSnackbar("Failed to save Image");
}
});
}
これに代わる方法は何でしょうか?
ベストアンサー1
の代わりにgetExternalFilesDir()
、、、getExternalCacheDir()
またはgetExternalMediaDirs()
( のメソッド)を使用します。Context
Environment.getExternalStorageDirectory()
または、mPhotoEditor
を操作できるように変更してUri
、次のようにします。
ユーザーが選択した場所に
ACTION_CREATE_DOCUMENT
移動するために使用するか、Uri
MediaStore
、、を使用してContentResolver
、特定の種類のメディア(画像など)の をinsert()
取得します(Uri
このサンプルアプリこれは、WebサイトからMP4ビデオをダウンロードするためにこれを行う方法を示しています
また、 を使用すると、Android 7.0 以降では がクラッシュすることに注意してくださいUri.fromFile
。Android ACTION_MEDIA_SCANNER_SCAN_FILE
QFileUriExposedException
では、MediaStore
/insert()
オプションのみを使用すると、 によってコンテンツがMediaStore
迅速にインデックス化されます。
Android 10 および 11 では、マニフェストの 要素をtargetSdkVersion
使用して、値が 30 未満の場合はこれらの「スコープ別ストレージ」の変更をオプトアウトできることに注意してください。android:requestLegacyExternalStorage="true"
<application>
これは長期的な解決策ではないtargetSdkVersion
Play ストア (およびおそらく他の場所) を通じてアプリを配布する場合は、2021 年中に 30 以上にする必要があります。