简体   繁体   中英

Android kotlin: Getting EACCES (Permission denied) even after giving permissions

I am developing an android app and having trouble with the permission handling (API lvl 30, Android ver. 11)

I tried to follow the steps here: https://developer.android.com/training/permissions/requesting.html

When using the "checkSelfPermission()" function, it looks like I have the necessary permissions, but when trying to Write to a file I get the error which is shown in the log on the bottom of this post.

This is my code:

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()

The method which checks the permissions looks like this:

    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
            )
        }
    }
}

I get the Permissions-prompt and after granting permission I try to download a file. The code for downloading the file is in an adapter-class for a recyclerview.

                    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()
                }

I am not sure, what I did wrong. Maybe someone here can help me. Thanks in advance

Edit: My AndroidManifest.xml looks like this:

<?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>

And in the settings of my phone I can see that the app has permissions to access storage.

Edit: It is working in the emulator but not on a real phone. (Galaxy s20)

the log looks like this:

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) 

You haven't shown us your AndroidManifest.xml file, so it might be worth checking if you have added the necessary permissions in this file.

Extends ActivityCompat.OnRequestPermissionsResultCallback is not available in FilesActivity class.

class FilesActivity : AppCompatActivity() , ActivityCompat.OnRequestPermissionsResultCallback {
}

https://github.com/harunkor/requestPermissionLauncherSample

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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