繁体   English   中英

Android kotlin:即使在授予权限后也获得 EACCES(权限被拒绝)

[英]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 {
}

https://github.com/harunkor/requestPermissionLauncherSample

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM