1. ホーム
  2. android

[解決済み] APIレベル29で非推奨となったEnvironment.getExternalStorageDirectory() java

2022-04-23 22:38:11

質問

アンドロイドの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");
            }
       });
   }

これに対する代替案はどうなるのでしょうか?

解決方法は?

使用方法 getExternalFilesDir() , getExternalCacheDir() または getExternalMediaDirs() (のメソッド)。 Context の代わりに Environment.getExternalStorageDirectory() .

または mPhotoEditor で動作できるようにする。 Uri 、では。

  • 使用方法 ACTION_CREATE_DOCUMENT を取得します。 Uri をユーザーが選んだ場所に移動させるか

  • 使用方法 MediaStore , ContentResolver および insert() を取得することができます。 Uri は、特定の種類のメディア (例: 画像) のためのものです。 このサンプルアプリ ウェブサイトからMP4ビデオをダウンロードする際のデモです。

また Uri.fromFileACTION_MEDIA_SCANNER_SCAN_FILE はAndroid 7.0+でクラッシュするはずです。 FileUriExposedException . Android Q では MediaStore / insert() オプションを指定すると、コンテンツは MediaStore を素早く表示します。

Android 10 および 11 では、以下のようなスコープ付きストレージの変更から逃れることができます。 targetSdkVersion が30未満であれば android:requestLegacyExternalStorage="true" の中に <application> 要素を使用します。 これは長期的な解決策ではありません として、あなたの targetSdkVersion は、Play ストア(およびおそらく他の場所)でアプリを配布する場合、2021 年のある時点で 30 以上にする必要があります。