Horis 1 год назад
Родитель
Сommit
14fa8ee9ce
1 измененных файлов с 34 добавлено и 9 удалено
  1. 34 9
      app/src/main/java/io/legado/app/ui/file/HandleFileActivity.kt

+ 34 - 9
app/src/main/java/io/legado/app/ui/file/HandleFileActivity.kt

@@ -3,6 +3,7 @@ package io.legado.app.ui.file
 import android.content.Intent
 import android.net.Uri
 import android.os.Bundle
+import android.os.Environment
 import android.webkit.MimeTypeMap
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.activity.viewModels
@@ -17,6 +18,7 @@ import io.legado.app.lib.dialogs.SelectItem
 import io.legado.app.lib.dialogs.alert
 import io.legado.app.lib.permission.Permissions
 import io.legado.app.lib.permission.PermissionsCompat
+import io.legado.app.utils.checkWrite
 import io.legado.app.utils.getJsonArray
 import io.legado.app.utils.isContentScheme
 import io.legado.app.utils.launch
@@ -141,7 +143,7 @@ class HandleFileActivity :
                         }
                     }
 
-                    112 -> { // 手动输入目录路径
+                    112 -> checkPermissions { // 手动输入目录路径
                         showInputDirectoryDialog()
                     }
 
@@ -171,21 +173,44 @@ class HandleFileActivity :
             customView { alertBinding.root }
             okButton {
                 val inputPath = alertBinding.editView.text.toString()
-                if (inputPath.isNotBlank()) {
-                    val file = File(inputPath)
-                    if (file.exists() && file.isDirectory && file.canRead()) {
-                        onResult(Intent().setData(Uri.fromFile(file)))
-                    } else {
-                        toastOnUi(getString(R.string.invalid_directory))
-                    }
-                } else {
+                if (inputPath.isBlank()) {
                     toastOnUi(getString(R.string.empty_directory_input))
+                    return@okButton
+                }
+                val file = File(inputPath)
+                if (file.exists() &&
+                    file.isDirectory &&
+                    isExternalStorage(file) &&
+                    file.checkWrite()
+                ) {
+                    onResult(Intent().setData(Uri.fromFile(file)))
+                } else {
+                    toastOnUi(getString(R.string.invalid_directory))
                 }
             }
+            onDismiss {
+                finish()
+            }
             cancelButton()
         }
     }
 
+    private fun isExternalStorage(path: File): Boolean {
+        try {
+            if (Environment.isExternalStorageEmulated(path)) {
+                return true
+            }
+        } catch (_: IllegalArgumentException) {
+        }
+        try {
+            if (Environment.isExternalStorageRemovable(path)) {
+                return true
+            }
+        } catch (_: IllegalArgumentException) {
+        }
+        return false
+    }
+
     private fun getFileData(): Triple<String, Any, String>? {
         val fileName = intent.getStringExtra("fileName")
         val file = intent.getStringExtra("fileKey")?.let {