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:///storage/emulated/0/  or
file:///sdcard/
file:///mnt/sdcard/

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 now usually created automatically or, in the case of old devices (with API < 19, Android 4.4), only when it is needed (i.e. appropriate blocks are used).

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"/>

On August 31, 2024 new apps and updates must target SDK 34 (Android 14).

31 Likes

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

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.