Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 331 Vote(s) - 3.4 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Android APIv29 FileNotFoundException EACCES (Permission denied)

#1
I'm not able to access storage when building for targetSdkVersion v29.

Here is my gradle configuration:
```
compileSdkVersion 29
buildToolsVersion "29.0.2"
...
minSdkVersion 15
targetSdkVersion 29
```

NOTE that `WRITE_EXTERNAL_STORAGE` permission is granted and the same setup works fine when building for `targetSdkVersion 28`.

Here is my implementation:
```
val outputFolder = File(baseFolder + File.separator + "Output Folder")
if (!outputFolder.exists()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Files.createDirectory(outputFolder.toPath()) //This allways returns false with targetSdkVersion 29
} else {
if (!outputFolder.mkdirs()) {
Log.e("SaveRaw", "Unable to create folder for audio recording")
}
}
}

outputFile = File("$baseFolder/Output Folder/$filename")
try {
fileOutputStream = FileOutputStream(outputFile)
} catch (e: FileNotFoundException) {
e.printStackTrace() // allways throwing exception here, even if Output Folder exists
}
```

and here is the exception:

```
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (Permission denied)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
```

Hope anyone has an answer, what am I missing here?

Update:

Here is where `baseFolder` comes from. Note that `getExternalStorageDirectory` is a deprecated method.

```
val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Environment.getExternalStorageDirectory().absolutePath
} else {
context.filesDir.absolutePath
}
```

Thanks

Reply

#2
When your app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible to apps.

val path = getExternalFilesDir(Environment.DIRECTORY_PICTURES.toString() +
File.separator + "Output Folder")
val file = File(getExternalFilesDir(null), "filename.jpg")



For more details visit [Docs][1]


[1]:

[To see links please register here]

Reply

#3
[Starting with Android 11][1] the storage permission is getting revoked and developers would need to consider alternative ways of accessing the storage they need either through [SAF][2] or [Media Store][3]. For the time being, you can carry on using what you’re using by adding the following in your manifest within the application tags:

android:requestLegacyExternalStorage="true"

You might want to consider changing your minSDK to 19 and use `getExternalFilesDir()` to get a path that doesn’t require any permissions.


[1]:

[To see links please register here]

[2]:

[To see links please register here]

[3]:

[To see links please register here]

Reply

#4
With Android version 10 (API level 29) the concept of scoped storage is introduced. According to Docs- "To give users more control over their files and to limit file clutter, apps that target Android 10 (API level 29) and higher are given scoped access into external storage, or scoped storage, by default. Such apps have access only to the app-specific directory on external storage, as well as specific types of media that the app has created."

for Android version 10, you have option to opt-out scoped storage by adding android:requestLegacyExternalStorage="true" in AndroidManifest.xml within the application tags

This is a temporary solution and will work only for android version 10 and not above it. Also make sure you ask run-time permission for read/write external storage.
Reply

#5
Android 11 will simply ignore **android:requestLegacyExternalStorage="true"**, since it was an ad-hoc solution for Android < 11 to not break old apps.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

and also in application tag of manifest file :

android:requestLegacyExternalStorage="true"
also declare provider in application tag of manifest file like this :

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path" />
</provider>

create a folder name **xml** in res folder.
[![refer to this image][1]][1]


[1]:


now create a xml file named **provider_path.xml** in **xml** folder you just created and paste below code in xml file :

<?xml version="1.0" encoding="utf-8"?>

<path>
<external-path
name="external_files"
path="." />
</path>



now in your activity :

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"/"+"sample.pdf");
if(file.exists()){
Uri uri = FileProvider.getUriForFile(context, "com.example.www"+".provider",file);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(uri, "application/pdf");
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(i);
}

replace com.example.www with your application package name.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through