Some basics on Android storage system

From an Android point of view there are an → Internal Storage and an → External Storage .

1. Internal Storage
The Internal Storage can only be accessed with a rooted device.

1.1 The app package is saved in

/data/data/<packageName>/

In order to be able to debug your app, AI2 saves the assets for → Companion on devices with

  • Android ≥ 10 (API ≥ 29):
/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/assets/
  • Android < 10 :
/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/AppInventor/assets/

1.2. The Private directory is

/data/user/0/<packageName>/files/

This private directory can be used with the File component to save / read text (setting the path without a slash). It can only be accessed by your app and is automatically removed when the app is uninstalled.

2. External Storage
The root directory of the External Storage is:

/storage/emulated/0/  or
/sdcard/ or
file:///mnt/sdcard/ or
file:///storage/emulated/0/ 

To access the external storage, READ_/WRITE_EXTERNAL_STORAGE permission is required.

2.1. App-specific directory
In addition, there may be an app-specific directory (ASD) which can be created with

Note: The ASD is automatically created on devices with API ≥ 29.

The path of the ASD is:

 /storage/emulated/0/Android/data/<packageName>/files/

which is in the External (private) Storage, but does not require READ_ / WRITE_EXTERNAL_STORAGE permissions. The ASD can only be accessed by your app and is automatically removed when the app is uninstalled.

See: https://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE

2.2. External (removable / micro) SD card
There may also be another External Storage: a removable (micro) SD card, eg:

/storage/82C3-E96C/

that can only be read (on devices with Android ≥ 4.4 / KitKat, API 19).

Note:
The root directory of the External Storage

/storage/emulated/0/

is displayed on the device as Internal Storage (unfortunately this is a bit ambiguous).

When targeting Android ≥ 10
https://developer.android.com/training/data-storage
Scoped storage

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 .

grafik

I would like to introduce these three basic terms:

Absolute path │ relative path │ full path

1. This path is an → absolute path:
/storage/emulated/0/Android/data/packageName/files/

2. This path is a → relative path:
/Android/data/packageName/files

Some components need a relative and others an absolute path.

3. And on top of that, some components or Android versions require a → full path:
file:///storage/emulated/0/Android/data/packageName/files/

I recommend these terms to distinguish the paths, for example:

  • relative path: /Download
  • absolute path: /storage/emulated/0/Download
  • full path: file:///storage/emulated/0/Download

EDIT (May 11, 2022):

Storage Permissions on Android 10 & 11
Since AI2 & Kodular decided to declare requestLegacyExternalStorage=true in the Manifest (which is only ignored on Android 11+), storage permissions must also be requested on Android 10.

If you remove this from the Manifest, which I would recommend, no permission for the Shared folders would be required on Android 10 either. The storage permissions would then have to be declared as follows:

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

I generally prefer to request as few permissions as possible.
I don't like permissions and my users even less.
:wink:

How to access to non-media & media files on Android 11+
How to access non-media & media files on Android 11+


EDIT (Sept 8, 2023): → targetSdkVersion = 33

On August 31, 2023 new apps and updates must target SDK 33 (Android 13):

Starting with Android 13, READ_EXTERNAL_STORAGE is replaced by 3 other permissions, separately for images, audio and video:

  • READ_MEDIA_IMAGES
  • READ_MEDIA_AUDIO
  • READ_MEDIA_VIDEO
So the "old" storage permissions could be then declared like this:
<uses-permission android:maxSdkVersion="32" android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:maxSdkVersion="29" android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
30 Likes
File location of saved data files
TaifunFile Extension can't read from sd card
Can't search and save csv files? - File component - FileScope (Android11)
Problema salvataggio pdf
File component problem - reading paths with spaces
Content URI is wrong when app restart
[PAID] GDrive: Just a Google Drive(App Data Folder) extension [$8 or INR 551]
Options to read CSV external file into App
Edit csv file strored in the internal storage of the mobile
Reset button results in error with creating a csv file in internal storage
Edit csv file strored in the internal storage of the mobile
Image Zoom with fingers
How can I save data from Arduino using Bluetooth directly to a database?
Getting permission for storage in internal memory in my app
Getting permission for storage in internal memory in my app
Salvare in MicroSd
TaifunFTP does not find file
Read .pdf File from Documents Folder
Error 908: The permission WRITE_EXTERNAL_STORAGE has been denied. Please enable it in the Settings app
[PAID] SFTPClient: An extension to use SSHv2 [$6 or INR 350]
TaifunFile1 CopyAsync - info
File Sharing help - issue with TaifunSharing extension
Storing,Viewing and Deleting List and then Sorting in Firebase
Write to external storage *confused*
Copy file to ASD with SAF - Error
Data file sharing between two applications
Playing wave files sequentially issue
Using .csv from Shared Folder(Documents)
Write to external storage *confused*
How Save a Image to own Storage with TinyDB
Getting a run time error as failure from system when iam trying to share around 10 thousand line of data which is present in the text box or label to my Google drive
Getting a run time error as failure from system when iam trying to share around 10 thousand line of data which is present in the text box or label to my Google drive
How do I save file to phone?
Asking permission until it's granted - currently only asks twice
Transferred from Google Sheets Test Server to aia server. Save to PDF no longer works
Trouble Saving .csv Files
(Not compatible with nb194) [Free] File Picker Extension - Pick File From Storage (2.1.6)
Upload video to google drive
Unable to find data file
Drawing app undo & redo button
I want to save a file in the desired path
Take a screenshot
Take a screenshot
How to read these jpg file in phone directory as image component
Rename photo and upload to an ftp account
Pick Pdf file on Android12
[FREE] Take screenshot of components, arrangement and screen | Extension ComponentToImage
Take screenshot of screen and save to device
Can't search and save csv files? - File component - FileScope (Android11)
How do I read int mem?
How do I read int mem?
Error when move canvas image
How do you input image to webviewer?
How do you input image to webviewer?
Load documents into app
File non Memorizzato in TinyDB
File non Memorizzato in TinyDB
TaifunSqlite1.Export - will not execute
Path of file in \file name.txt in device with 10 or higher android version
Help with generating a sheet file from various labels
SAF: App Inventor implementation of Storage Access Framework
WebViewer1 access to local files on tablet
ImagePicker Android 12
Picture upload causes AI companion to crash
App no reconoce carpetas o archivos de mi dispositivo
Smbmanager issue
Crear 2 archivo en una sola carpeta / Create 2 file in a single folder
File explorer or file manager
Open File Error 2102
Create My App Album
How do you read a text file(like .txt) in sdcard?
Create My App Album
Create My App Album
Image to CloudDB
Dateipfad vom Datei Manager direkt öffnen
Taifun File Error, Open Failed EPERM (Operaion not permitted)
SAF: App Inventor implementation of Storage Access Framework
Error 2103 guardar archivos
Permiso para descargar cvs
Save few Images, upload them file by file and then delete them
Taifun FTP extension no longer working after Kodular upgrade
Search mp3 and play it
Datei Speichern, es wird keine Datei erzeugt
Cannot generate QR Code
Java Runtime error (CustomWebView)
How to access non-media & media files on Android 11+
Save file to internal storage
Load mp3 Problems
Pro camera: The pro custom camera
java.io.FileNotFoundException on fileInputStream
How do I save text in .txt file in internal storage?
How do you read mp3 from sd card in mobile phone and play it?
Apk jukebox no go I not understand
Canvas Background Image saves ok from Companion but not from APK
Writing data in a .csv file not working
Error 802 when recording , how do I fix?
[F/OS] ⚠️ DaffyDialog - Additional Features For The Notifier Component!
Permission popup doesn't show up
I'm having problems with the file system/file structure on Android/AI2
How do you read from a txt file?
Notification "Sorry, File To Resize Does not Exist." Help
Guardar archivo
Copy to shared Folder "Download" when using TaifunFile not works
Copy to shared Folder "Download" when using TaifunFile not works
Store sensor data string to a text file
I want to add image in my application and later i want to share. i have uploaded image but while using apk fie it is showing file could not be found
Error 2101 with the .APK
Path to Assets?
Is there a default exit from the SAF OpenSingleFile method if no file available in directory
I want to open a pdf file in app inventor
I want to open a pdf file in app inventor
Question about Files, Scopes and Android Levels (US and EU)
How do you read an "alien" file from Download under SDK 30?
Εrror 2101:Τhe file/filename.txt coult not be found
[FREE] Device 💻 - Get device info!
Domanda circa salvaggio file
Qr : Read and Create Qr/Bar Code offline
Cloud db error no such file or directory
Export list data into CSV Form
Send data to text file then read with a different App
Saving and reading files with android 11
Not one of standard directories
Storing a simple file outside of the application specific directory (ASD)
Use new "scope" properties File
Problems with moving an image file to the asd
Android 11 issue related to cordova
Insert files into the extension using Rush. JavaScript from extension
Files and folders
How do I customize location save (Taifunscreenshot)?
How to ask a question (open new topic)
No se puede compartir archivos, Error 908: The permission WRITE_EXTERNAL_STORAGE has been denied
Read file from phone memory
File and Directories
Test "copy file from assets to shared directory and read it from there" in ai-test
A little bit offtopic: searching files in Android 11 filesystem
Companion and APK: How to access files on Android
Reading fields from a csv file
Files Acces with file component
Sound Recorder Error 802 and Error 908 Permissions issue still persists
Saving data format
Taifun Camera Not working after new release
FAQ Section: Files
Release nb187: Copy a text file / image from assets to shared storage (→ Android 10+)
KML File storage
how do I change the SDK version to 30?
Reading Files from Internal Storage
Parsing HTML file from SDCard
How do I create a folder in the internal memory, and inside it put 2 pdfs?
Append and read csv file
Android 11 and Storage-File
Download Multiple Files with subfolders
How do I play a big video (> 5 MB) from the ASD or the assets
Download Multiple Files with subfolders
Crear ruta de descarga a partir de Android 10
Share cannot find specified mp3 in device
Save a sound recorder recording on the user's cell phone
Deleting text in a txt file without losing the file (using a Bluestacks emulator)
Deleting text in a txt file without losing the file (using a Bluestacks emulator)
Refresh Gallery
Simple file storage, Android phone, help needed
3D Model Loader Extension
Aparece este error 2101 the file /doc.txt could not be found
Comment effacer des images (How do you delete images?)
Data Security - files only available for my App
RE: Setting permissions in Extension Manifest File?
Permission acces filesystem after last App Inventor Update API Level 33
DATAFILE - How do you create columns and rows and then save etc.?
Spinner won't list the files in a directory properly
Error 701: unable to load /storage/emulated/0/My Documents/Recordings/app_inventor1690233521187.3gp
Where does APP Inventor store images
How do you play a video?
Apk crashes but ai companion works without issue
Having trouble with my app reading files on my phone
Creating multiple page PDF
Get the path of → ASD (app-specific dir) & → private data dir (internal storage)
Export file as excel, csv, save as csv, no SD card, extension can do that
Error code and wont save list
Problema con grabador de sonido
Sharing a tinydb between apps
Help loading a local html file on a WebViewer with WebView.loadUrl()
Media not existent on Build .apk
I cannot save a file in any directory

Thank you @Anke your tutorial really helped me :star_struck: :+1:

3 Likes

Despite the limitations of android 11, is it still possible to write to any directory after obtaining write and read permissions?

No, when AI2 targets API 30 (targetSdkVersion = 30) it is no longer possible.

I understand that ASD does not require permissions. However, the permissions for writing and reading in Android will remain. If android completely blocks reading and writing to any folder, what then will these permissions be for?

Another question. Will the ASD directory be accessed only from the application? What about file managers, they won't be able to read files created by my application?

See here:

Summary

Yes.

Maybe, but try to open the ASD on your (Android 11) device:
No files available.
I can see them connecting the device via USB to my PC.

So how will cameras, scanner handlers, create pdf, word, excel and much more work? File manager programs will also cease to exist? In my opinion, it is too much of a blockage. I like systems with freedom like on a PC and not limited to the maximum.

2 Likes

not any, but some...

everything is explained in the link, @Anke already provided
https://developer.android.com/training/data-storage/use-cases
in short: it will be more complicated...

I agree...

Taifun

2 Likes

So I don't think we can say "you can't" You can, but it's more complicated. But I think our Java programmers who make extensions will be able to handle it :wink: . It was a shame when google bought an android. Now they tell people how to use the phone, they will soon be telling how to live ... although they already know too much about our lives ...

4 Likes

exactly... we will try to help to provide a solution as easy as possible... :muscle:
Taifun

2 Likes

Yes, read some comments here, then you know what users think of it.

3 Likes

That won't be a Windows or Apple Computer then :wink:

4 Likes

Me2.

Yes, but the wind is changing right now (also for Windows, Apple & Co) and wonderful times of freedom are coming (without lies, electoral fraud, oppression, C-restrictions, opinion terrorism, ...) - I've been very confident for a long time ... (many will be very surprised).

It all depends on the US election and this has already been decided.
Does anyone want to bet for whom?

1 Like

Very Helpful! Thank you!
But shame on Google for scoped storage...

2 Likes

I think Windows is less restrictive when it comes to file systems and accessing them, installing applications, etc.
Google is moving towards controlling its users and wants to be present even where it is not needed. Well, but you know - money and masking for the "good of users".

1 Like

By the way, does anybody know when will AI2 target API 30? Is there any announcement about this?

Yes, AI2 has to target API 30 before August 2021, because targetSdkVersion=30 is required for

  • new apps from → August 2021 and
  • updates from → November 2021

You must also publish apps with the (new) Android App Bundle ( AAB ) format.

Thank you, but i'm curious about the AI2 team plan to implement it, not the deadline, but never mind, i'm starting to prepare my apps for this change.
One more question.

The ASD can only be accessed by your app and is automatically removed when the app is uninstalled.

What about reinstall without uninstall? Logically it is stays in case of app update, but i ask to be sure.