开放失败:Android 12,小米11 Ultra Device上的EACCE(允许拒绝)

发布于 2025-02-09 20:16:23 字数 9511 浏览 0 评论 0原文

当一个用户尝试打开具有此错误的下载的PDF文件时。

我正在使用下载manager从URL下载PDF文件。 另外,我正在使用'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'库作为PDF查看器。

除小米Mi 11 Ultra以外的所有设备都没有问题。在该型号设备中,它给出了“打开失败:EACCES(许可拒绝)”错误。下面的示例代码:

val fileName = "${File.separator}${"Presentation_Report"}${System.currentTimeMillis()}.pdf"

        fileHelper.downloadFile(url, fileName) { response, msg ->

            runOnUiThread {

                onLoadingChange(false)

                if (response.status && response.data != null) {

                    this.file = response.data

                    binding.pdfView.fromFile(response.data)
                        .onError {

                            FirebaseAnalyticsHelper.sendReportError(
                                this,
                                "Preview Activity pdf load error $url $fileName \n PDF VIEWER ERR : ${it.message ?: ""}"
                            )

                            finish()

                            fileHelper.viewFileOnError(file)

                        }
                        .load()

                } else {

                    showErrorAlert(AlertViewType.Warning, msg) { finish() }

                }

            }

        }

可变响应。数据是我们成功下载的文件。

在binding.pdfview.fromfile(response.data)中,它引发了我上面描述的错误。

我正在使用运行时权限,并且用户还启用了他手机中的所有许可。

该问题仅发生在小米Mi 11 Ultra中。

这些是我的下载文件功能和广播接收器,可在下载后接收响应。

fun downloadFile(
        url: String,
        fileName: String,
        completion: (DataResponse<File>, String) -> Unit
    ) {

        try {

            this.currentUrl = url

            this.currentFileName = fileName

            this.onDownload = completion

            val downloadManager = context.getSystemService(DOWNLOAD_SERVICE) as DownloadManager

            val request = DownloadManager.Request(Uri.parse(url))

            request.setTitle(fileName)

            request.setDestinationInExternalFilesDir(
                context,
                Environment.DIRECTORY_DOWNLOADS,
                fileName
            )

            downloadManager.enqueue(request)

            context.registerReceiver(
                downloadReceiver,
                IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
            )

        } catch (e: NullPointerException) {

            this.logReport("NullPointerException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: IllegalArgumentException) {

            this.logReport("IllegalArgumentException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: IllegalStateException) {

            this.logReport("IllegalStateException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: SecurityException) {

            this.logReport("SecurityException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: Throwable) {

            this.logReport("Throwable", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        }

    }

private val downloadReceiver: BroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context?, intent: Intent) {

            val downloadDirectory = Environment.DIRECTORY_DOWNLOADS ?: ""

            val fileLocation =
                [email protected](Environment.DIRECTORY_DOWNLOADS)?.path
                    ?: ""

            if (downloadDirectory.isEmpty()) {
                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "Download Directory Is Empty \n" +
                                "Url : ${[email protected]}"
                    )
                }
            }

            if (fileLocation.isEmpty()) {
                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "File Location Is Empty \n" +
                                "Url : ${[email protected]}"
                    )
                }
            }

            val file =
                File("${[email protected](Environment.DIRECTORY_DOWNLOADS)}${[email protected]}")

            context?.let { FirebaseAnalyticsHelper.logToMixPanel(it, file.toString()) }

            if (file.exists()) {

                [email protected]?.let {
                    it(getSuccessResponseData(file), "")
                }

            } else {

                val writeExternalStoragePermission =
                    PermissionHelper([email protected]).checkPermission(
                        PermissionType.WRITE_EXTERNAL_STORAGE
                    )
                val readExternalStoragePermission =
                    PermissionHelper([email protected]).checkPermission(
                        PermissionType.READ_EXTERNAL_STORAGE
                    )

                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "File Not Exists \n" +
                                "File Path : ${file.path} \n" +
                                "File Absolute Path : ${file.absolutePath} \n " +
                                "Url : ${[email protected]} \n " +
                                "writeExternalStoragePermission: $writeExternalStoragePermission \n " +
                                "readExternalStoragePermission: $readExternalStoragePermission"
                    )
                }

                [email protected]?.let {
                    it(
                        getErrorResponseData(),
                        R.string.listing_detail_report_result_page_error_file_not_found.localized()
                    )
                }

            }

            [email protected](this)

        }

    }

这些是我声明的清单中使用的权限,其中是:

 <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.FLAG_GRANT_READ_URI_PERMISSION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />

我该如何解决此问题。

有了一点挖掘,我发现了有关MI文件管理器的一些东西。但是,我不知道这与我的问题有关 有关Mi File Manager的问题

When one of users try to open a downloaded pdf file having this error.

I am using DownloadManager to download the pdf file from url.
Also I am using 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1' library as a pdf viewer.

It works without a problem with all devices except Xiaomi Mi 11 Ultra. In that model device it gives the "open failed: EACCES (Permission denied)" error. Sample code below:

val fileName = "${File.separator}${"Presentation_Report"}${System.currentTimeMillis()}.pdf"

        fileHelper.downloadFile(url, fileName) { response, msg ->

            runOnUiThread {

                onLoadingChange(false)

                if (response.status && response.data != null) {

                    this.file = response.data

                    binding.pdfView.fromFile(response.data)
                        .onError {

                            FirebaseAnalyticsHelper.sendReportError(
                                this,
                                "Preview Activity pdf load error $url $fileName \n PDF VIEWER ERR : ${it.message ?: ""}"
                            )

                            finish()

                            fileHelper.viewFileOnError(file)

                        }
                        .load()

                } else {

                    showErrorAlert(AlertViewType.Warning, msg) { finish() }

                }

            }

        }

Variable response.data is the File we successfully downloaded.

In the binding.pdfView.fromFile(response.data).onError, it throws the error I described above.

I am using runtime permissions and also user has enabled all the permission in his phone.

The problem only occurs in the Xiaomi Mi 11 Ultra.

These are my download file function and broadcast receiver to receive response after download.

fun downloadFile(
        url: String,
        fileName: String,
        completion: (DataResponse<File>, String) -> Unit
    ) {

        try {

            this.currentUrl = url

            this.currentFileName = fileName

            this.onDownload = completion

            val downloadManager = context.getSystemService(DOWNLOAD_SERVICE) as DownloadManager

            val request = DownloadManager.Request(Uri.parse(url))

            request.setTitle(fileName)

            request.setDestinationInExternalFilesDir(
                context,
                Environment.DIRECTORY_DOWNLOADS,
                fileName
            )

            downloadManager.enqueue(request)

            context.registerReceiver(
                downloadReceiver,
                IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
            )

        } catch (e: NullPointerException) {

            this.logReport("NullPointerException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: IllegalArgumentException) {

            this.logReport("IllegalArgumentException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: IllegalStateException) {

            this.logReport("IllegalStateException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: SecurityException) {

            this.logReport("SecurityException", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        } catch (e: Throwable) {

            this.logReport("Throwable", e.message)

            completion(getErrorResponseData(), R.string.shared_unexpected_error.localized())

        }

    }

private val downloadReceiver: BroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context?, intent: Intent) {

            val downloadDirectory = Environment.DIRECTORY_DOWNLOADS ?: ""

            val fileLocation =
                [email protected](Environment.DIRECTORY_DOWNLOADS)?.path
                    ?: ""

            if (downloadDirectory.isEmpty()) {
                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "Download Directory Is Empty \n" +
                                "Url : ${[email protected]}"
                    )
                }
            }

            if (fileLocation.isEmpty()) {
                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "File Location Is Empty \n" +
                                "Url : ${[email protected]}"
                    )
                }
            }

            val file =
                File("${[email protected](Environment.DIRECTORY_DOWNLOADS)}${[email protected]}")

            context?.let { FirebaseAnalyticsHelper.logToMixPanel(it, file.toString()) }

            if (file.exists()) {

                [email protected]?.let {
                    it(getSuccessResponseData(file), "")
                }

            } else {

                val writeExternalStoragePermission =
                    PermissionHelper([email protected]).checkPermission(
                        PermissionType.WRITE_EXTERNAL_STORAGE
                    )
                val readExternalStoragePermission =
                    PermissionHelper([email protected]).checkPermission(
                        PermissionType.READ_EXTERNAL_STORAGE
                    )

                context?.let {
                    FirebaseAnalyticsHelper.sendReportError(
                        it,
                        "File Not Exists \n" +
                                "File Path : ${file.path} \n" +
                                "File Absolute Path : ${file.absolutePath} \n " +
                                "Url : ${[email protected]} \n " +
                                "writeExternalStoragePermission: $writeExternalStoragePermission \n " +
                                "readExternalStoragePermission: $readExternalStoragePermission"
                    )
                }

                [email protected]?.let {
                    it(
                        getErrorResponseData(),
                        R.string.listing_detail_report_result_page_error_file_not_found.localized()
                    )
                }

            }

            [email protected](this)

        }

    }

These are my declared uses permissions in the manifest which are:

 <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.FLAG_GRANT_READ_URI_PERMISSION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />

How can I solve this issue.

With a little digging, I found something about Mi File Manager. However, I do not know that if this is related with my issue
The question about Mi File Manager

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文