开放失败:Android 12,小米11 Ultra Device上的EACCE(允许拒绝)
当一个用户尝试打开具有此错误的下载的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论