[英]Android kotlin: Getting EACCES (Permission denied) even after giving permissions
我正在开发 android 应用程序并且在权限处理方面遇到问题(API lvl 30,Android 版本 11)
我尝试按照此处的步骤操作: https://developer.android.com/training/permissions/requesting.html
当使用“checkSelfPermission()”function 时,看起来我有必要的权限,但是当我尝试写入文件时,我收到了显示在这篇文章底部的日志中的错误。
这是我的代码:
class FilesActivity : AppCompatActivity() {
val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
Log.d("access granted", isGranted.toString())
} else {
Log.d("access granted", isGranted.toString())
}
}
private lateinit var binding: ActivityFilesBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissions()
检查权限的方法如下所示:
private fun requestPermissions() {
when {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
Log.d("Permission","Already granted")
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
}
}
}
我得到权限提示,并在授予权限后尝试下载文件。 下载文件的代码位于回收站视图的适配器类中。
try{
if(ContextCompat.checkSelfPermission(
mContext,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED) {
val myFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),file.getFilename()!!)
val fileRef = Firebase.storage.getReferenceFromUrl(file.getUrl()!!)
fileRef.getFile(myFile).addOnSuccessListener {
// Local temp file has been created
Toast.makeText(mContext,"File downloaded to Downloads Dir.",Toast.LENGTH_LONG).show()
}.addOnFailureListener {
Toast.makeText(mContext,it.toString(),Toast.LENGTH_LONG).show()
}
}
} catch(e :Error){
Toast.makeText(mContext,e.toString(),Toast.LENGTH_LONG).show()
}
我不确定,我做错了什么。 也许这里有人可以帮助我。 提前致谢
编辑:我的 AndroidManifest.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:allowBackup="true"
android:icon="@drawable/round_logo_app"
android:label="@string/app_name"
android:roundIcon="@drawable/app_logo_round"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.app">
<activity android:name=".UserRatingsActivity"></activity>
<activity
android:name=".ui.myFiles.FilesActivity"
android:label="@string/title_activity_files"
android:theme="@style/Theme.StuddyV0_1.NoActionBar" />
<activity android:name=".Register" />
<activity android:name=".EnterCourses" />
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" />
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".PushNotifications.FirebaseService"
android:permission="com.google.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name=".NotificationsPckg.MyFirebaseMessaging"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
在我手机的设置中,我可以看到该应用程序有权访问存储。
编辑:它在模拟器中工作,但不是在真手机上。 (银河s20)
日志如下所示:
E/FileDownloadTask: Exception occurred during file write. Aborting.
java.io.FileNotFoundException: /storage/emulated/0/Download/SKE_Labor.pdf: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8494)
at libcore.io.IoBridge.open(IoBridge.java:478)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
E/StorageException: StorageException has occurred.
An unknown error occurred, please check the HTTP result code and inner exception for server response.
Code: -13000 HttpResult: 200
/storage/emulated/0/Download/SKE_Labor.pdf: open failed: EACCES (Permission denied)
java.io.FileNotFoundException: /storage/emulated/0/Download/SKE_Labor.pdf: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8494)
at libcore.io.IoBridge.open(IoBridge.java:478)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
E/StorageException: StorageException has occurred.
An unknown error occurred, please check the HTTP result code and inner exception for server response.
Code: -13000 HttpResult: 200
/storage/emulated/0/Download/SKE_Labor.pdf: open failed: EACCES (Permission denied)
java.io.FileNotFoundException: /storage/emulated/0/Download/SKE_Labor.pdf: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8494)
at libcore.io.IoBridge.open(IoBridge.java:478)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:147)
at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
您尚未向我们展示您的 AndroidManifest.xml 文件,因此可能值得检查您是否在此文件中添加了必要的权限。
扩展 ActivityCompat.OnRequestPermissionsResultCallback 在 FilesActivity class 中不可用。
class FilesActivity : AppCompatActivity() , ActivityCompat.OnRequestPermissionsResultCallback {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.