diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 2fc6e3762..dd2499628 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -20,8 +20,6 @@ import io.legado.app.help.http.newCall import io.legado.app.help.http.okHttpClient import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector -import io.legado.app.lib.permission.Permissions -import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getSecondaryTextColor @@ -345,35 +343,13 @@ class BgTextConfigDialog : BaseDialogFragment() { } private fun setBgFromUri(uri: Uri) { - if (uri.toString().isContentScheme()) { - val doc = DocumentFile.fromSingleUri(requireContext(), uri) - doc?.name?.let { - val file = - FileUtils.createFileIfNotExist(requireContext().externalFiles, "bg", it) - kotlin.runCatching { - DocumentUtils.readBytes(requireContext(), doc.uri) - }.getOrNull()?.let { byteArray -> - file.writeBytes(byteArray) - ReadBookConfig.durConfig.setCurBg(2, file.absolutePath) - ReadBookConfig.upBg() - postEvent(EventBus.UP_CONFIG, false) - } ?: toastOnUi("获取文件出错") - } - } else { - PermissionsCompat.Builder(this) - .addPermissions( - Permissions.READ_EXTERNAL_STORAGE, - Permissions.WRITE_EXTERNAL_STORAGE - ) - .rationale(R.string.bg_image_per) - .onGranted { - RealPathUtil.getPath(requireContext(), uri)?.let { path -> - ReadBookConfig.durConfig.setCurBg(2, path) - ReadBookConfig.upBg() - postEvent(EventBus.UP_CONFIG, false) - } - } - .request() + uri.read(this) { name, bytes -> + var file = requireContext().externalFiles + file = FileUtils.createFileIfNotExist(file, "bg", name) + file.writeBytes(bytes) + ReadBookConfig.durConfig.setCurBg(2, file.absolutePath) + ReadBookConfig.upBg() + postEvent(EventBus.UP_CONFIG, false) } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 970c50b20..1ef0dcbbf 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -10,7 +10,6 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.widget.SeekBar -import androidx.documentfile.provider.DocumentFile import androidx.preference.Preference import io.legado.app.R import io.legado.app.base.BasePreferenceFragment @@ -24,15 +23,12 @@ import io.legado.app.help.LauncherIconHelp import io.legado.app.help.ThemeConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector -import io.legado.app.lib.permission.Permissions -import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.theme.ATH import io.legado.app.ui.widget.image.CoverImageView import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.prefs.ColorPreference import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.* -import java.io.File @Suppress("SameParameterValue") @@ -306,76 +302,22 @@ class ThemeConfigFragment : BasePreferenceFragment(), } private fun setBgFromUri(uri: Uri, preferenceKey: String, success: () -> Unit) { - if (uri.isContentScheme()) { - val doc = DocumentFile.fromSingleUri(requireContext(), uri) - doc?.name?.let { - var file = requireContext().externalFiles - file = FileUtils.createFileIfNotExist(file, preferenceKey, it) - kotlin.runCatching { - DocumentUtils.readBytes(requireContext(), doc.uri) - }.getOrNull()?.let { byteArray -> - file.writeBytes(byteArray) - putPrefString(preferenceKey, file.absolutePath) - success() - } ?: toastOnUi("获取文件出错") - } - } else { - PermissionsCompat.Builder(this) - .addPermissions( - Permissions.READ_EXTERNAL_STORAGE, - Permissions.WRITE_EXTERNAL_STORAGE - ) - .rationale(R.string.bg_image_per) - .onGranted { - RealPathUtil.getPath(requireContext(), uri)?.let { path -> - val imgFile = File(path) - if (imgFile.exists()) { - var file = requireContext().externalFiles - file = FileUtils.createFileIfNotExist(file, preferenceKey, imgFile.name) - file.writeBytes(imgFile.readBytes()) - putPrefString(preferenceKey, file.absolutePath) - success() - } - } - } - .request() + uri.read(this) { name, bytes -> + var file = requireContext().externalFiles + file = FileUtils.createFileIfNotExist(file, preferenceKey, name) + file.writeBytes(bytes) + putPrefString(preferenceKey, file.absolutePath) + success() } } private fun setCoverFromUri(preferenceKey: String, uri: Uri) { - if (uri.isContentScheme()) { - val doc = DocumentFile.fromSingleUri(requireContext(), uri) - doc?.name?.let { - var file = requireContext().externalFiles - file = FileUtils.createFileIfNotExist(file, "covers", it) - kotlin.runCatching { - DocumentUtils.readBytes(requireContext(), doc.uri) - }.getOrNull()?.let { byteArray -> - file.writeBytes(byteArray) - putPrefString(preferenceKey, file.absolutePath) - CoverImageView.upDefaultCover() - } ?: toastOnUi("获取文件出错") - } - } else { - PermissionsCompat.Builder(this) - .addPermissions( - Permissions.READ_EXTERNAL_STORAGE, - Permissions.WRITE_EXTERNAL_STORAGE - ) - .rationale(R.string.bg_image_per) - .onGranted { - RealPathUtil.getPath(requireContext(), uri)?.let { path -> - val imgFile = File(path) - if (imgFile.exists()) { - var file = requireContext().externalFiles - file = FileUtils.createFileIfNotExist(file, "covers", imgFile.name) - file.writeBytes(imgFile.readBytes()) - putPrefString(PreferKey.defaultCover, file.absolutePath) - CoverImageView.upDefaultCover() - } - } - } - .request() + uri.read(this) { name, bytes -> + var file = requireContext().externalFiles + file = FileUtils.createFileIfNotExist(file, "covers", name) + file.writeBytes(bytes) + putPrefString(preferenceKey, file.absolutePath) + CoverImageView.upDefaultCover() } } diff --git a/app/src/main/java/io/legado/app/ui/document/FilePickerActivity.kt b/app/src/main/java/io/legado/app/ui/document/FilePickerActivity.kt index 08bc51275..1665a1c50 100644 --- a/app/src/main/java/io/legado/app/ui/document/FilePickerActivity.kt +++ b/app/src/main/java/io/legado/app/ui/document/FilePickerActivity.kt @@ -31,10 +31,9 @@ class FilePickerActivity : return@registerForActivityResult } if (it.isContentScheme()) { - contentResolver.takePersistableUriPermission( - it, + val modeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION - ) + contentResolver.takePersistableUriPermission(it, modeFlags) } onResult(Intent().setData(it)) } diff --git a/app/src/main/java/io/legado/app/utils/UriExtensions.kt b/app/src/main/java/io/legado/app/utils/UriExtensions.kt index 5e9c1a2df..c461f8555 100644 --- a/app/src/main/java/io/legado/app/utils/UriExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/UriExtensions.kt @@ -12,55 +12,69 @@ import java.io.File fun Uri.isContentScheme() = this.scheme == "content" -@Throws(Exception::class) +/** + * 读取URI + */ fun Uri.read(activity: AppCompatActivity, success: (name: String, bytes: ByteArray) -> Unit) { - if (isContentScheme()) { - val doc = DocumentFile.fromSingleUri(activity, this) - doc ?: error("未获取到文件") - val name = doc.name ?: error("未获取到文件名") - val fileBytes = DocumentUtils.readBytes(activity, doc.uri) - fileBytes ?: error("读取文件出错") - success.invoke(name, fileBytes) - } else { - PermissionsCompat.Builder(activity) - .addPermissions( - Permissions.READ_EXTERNAL_STORAGE, - Permissions.WRITE_EXTERNAL_STORAGE - ) - .rationale(R.string.bg_image_per) - .onGranted { - RealPathUtil.getPath(activity, this)?.let { path -> - val imgFile = File(path) - success.invoke(imgFile.name, imgFile.readBytes()) + try { + if (isContentScheme()) { + val doc = DocumentFile.fromSingleUri(activity, this) + doc ?: error("未获取到文件") + val name = doc.name ?: error("未获取到文件名") + val fileBytes = DocumentUtils.readBytes(activity, doc.uri) + fileBytes ?: error("读取文件出错") + success.invoke(name, fileBytes) + } else { + PermissionsCompat.Builder(activity) + .addPermissions( + Permissions.READ_EXTERNAL_STORAGE, + Permissions.WRITE_EXTERNAL_STORAGE + ) + .rationale(R.string.bg_image_per) + .onGranted { + RealPathUtil.getPath(activity, this)?.let { path -> + val imgFile = File(path) + success.invoke(imgFile.name, imgFile.readBytes()) + } } - } - .request() + .request() + } + } catch (e: Exception) { + e.printStackTrace() + activity.toastOnUi(e.localizedMessage ?: "read uri error") } } -@Throws(Exception::class) +/** + * 读取URI + */ fun Uri.read(fragment: Fragment, success: (name: String, bytes: ByteArray) -> Unit) { - if (isContentScheme()) { - val doc = DocumentFile.fromSingleUri(fragment.requireContext(), this) - doc ?: error("未获取到文件") - val name = doc.name ?: error("未获取到文件名") - val fileBytes = DocumentUtils.readBytes(fragment.requireContext(), doc.uri) - fileBytes ?: error("读取文件出错") - success.invoke(name, fileBytes) - } else { - PermissionsCompat.Builder(fragment) - .addPermissions( - Permissions.READ_EXTERNAL_STORAGE, - Permissions.WRITE_EXTERNAL_STORAGE - ) - .rationale(R.string.bg_image_per) - .onGranted { - RealPathUtil.getPath(fragment.requireContext(), this)?.let { path -> - val imgFile = File(path) - success.invoke(imgFile.name, imgFile.readBytes()) + try { + if (isContentScheme()) { + val doc = DocumentFile.fromSingleUri(fragment.requireContext(), this) + doc ?: error("未获取到文件") + val name = doc.name ?: error("未获取到文件名") + val fileBytes = DocumentUtils.readBytes(fragment.requireContext(), doc.uri) + fileBytes ?: error("读取文件出错") + success.invoke(name, fileBytes) + } else { + PermissionsCompat.Builder(fragment) + .addPermissions( + Permissions.READ_EXTERNAL_STORAGE, + Permissions.WRITE_EXTERNAL_STORAGE + ) + .rationale(R.string.bg_image_per) + .onGranted { + RealPathUtil.getPath(fragment.requireContext(), this)?.let { path -> + val imgFile = File(path) + success.invoke(imgFile.name, imgFile.readBytes()) + } } - } - .request() + .request() + } + } catch (e: Exception) { + e.printStackTrace() + fragment.toastOnUi(e.localizedMessage ?: "read uri error") } }