Environment.getExternalStorageDirectory() は API レベル 29 で非推奨になりました java 質問する

Environment.getExternalStorageDirectory() は API レベル 29 で非推奨になりました java 質問する

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()( のメソッド)を使用します。ContextEnvironment.getExternalStorageDirectory()

または、mPhotoEditorを操作できるように変更してUri、次のようにします。

  • ユーザーが選択した場所にACTION_CREATE_DOCUMENT移動するために使用するか、Uri

  • MediaStore、、を使用してContentResolver、特定の種類のメディア(画像など)の をinsert()取得します(Uriこのサンプルアプリこれは、WebサイトからMP4ビデオをダウンロードするためにこれを行う方法を示しています

また、 を使用すると、Android 7.0 以降では がクラッシュすることに注意してくださいUri.fromFile。Android ACTION_MEDIA_SCANNER_SCAN_FILEQFileUriExposedExceptionでは、MediaStore/insert()オプションのみを使用すると、 によってコンテンツがMediaStore迅速にインデックス化されます。

Android 10 および 11 では、マニフェストの 要素をtargetSdkVersion使用して、値が 30 未満の場合はこれらの「スコープ別ストレージ」の変更をオプトアウトできることに注意してください。android:requestLegacyExternalStorage="true"<application>これは長期的な解決策ではないtargetSdkVersionPlay ストア (およびおそらく他の場所) を通じてアプリを配布する場合は、2021 年中に 30 以上にする必要があります。

おすすめ記事