1

Android 10的分区存储

 9 months ago
source link: https://www.51cto.com/article/773013.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Android 10的分区存储

作者:Reathin 2023-11-10 11:02:28
Android的分区存储机制为应用程序提供了灵活的存储方式,既保护了用户的隐私,又方便了数据的共享和传输。

在Android系统中,分区存储是一种用于管理应用程序数据的存储机制。它将设备的存储空间划分为不同的分区,每个分区都有不同的用途和访问权限。

Android分区存储从Android 10(API级别29)开始引入。在此版本之前,Android使用传统的外部存储和内部存储来管理应用程序的文件和数据。从Android 10开始,引入了一种新的存储模型,称为分区存储。

a160c3a7986779d59640485ac8cb9837d77d6c.jpg

分区存储将应用程序的文件和数据分为两个主要类别:公共存储和私有存储。公共存储是可由多个应用程序访问的共享存储空间,例如照片、视频和音乐等媒体文件。私有存储是每个应用程序独立使用的存储空间,用于存储应用程序的私有文件和数据。

在分区存储模型下,应用程序默认只能访问其私有存储空间,而对于公共存储空间的访问需要进行特殊的权限申请。这样可以增强用户对文件和数据的隐私保护,并提高应用程序的安全性。

需要注意的是,虽然分区存储从Android 10开始引入,但在此之前的版本中仍然可以使用传统的外部存储和内部存储模型。因此,开发者需要根据目标设备的Android版本来选择合适的存储模型。

分区存储的背景是为了提高应用程序的安全性和隐私保护。通过将应用程序的私有数据存储在内部存储中,可以防止其他应用程序对这些数据的访问。而外部存储则提供了一个公共的存储空间,使得应用程序可以方便地共享数据。

总的来说,Android的分区存储机制为应用程序提供了灵活的存储方式,既保护了用户的隐私,又方便了数据的共享和传输。

分区存储目录

在Android 10中,引入了一种新的存储访问模式,称为分区存储。分区存储将应用的文件和数据存储在应用的私有目录中,以增强用户隐私和安全性。以下是Android 10分区存储目录的一些常见路径:

(1) 内部存储私有目录:/data/data/<package_name>/

这是应用的私有目录,只有应用本身可以访问。在这个目录下,应用可以存储私有文件、数据库、缓存等。

(2) 外部存储私有目录:/storage/emulated/0/Android/data/<package_name>/

这是应用的外部存储私有目录,只有应用本身可以访问。在这个目录下,应用可以存储私有文件、数据库、缓存等。

(3) 共享外部存储目录:/storage/emulated/0/

这是设备的共享外部存储目录,所有应用都可以访问。在这个目录下,应用可以存储共享文件、图片、音频、视频等。

需要注意的是,Android 10中的分区存储模式对于访问外部存储的权限有一些限制。应用需要在清单文件中声明相应的权限,并且需要动态请求用户授权才能访问外部存储。这样可以确保用户对于自己的数据有更好的控制权。

访问公共目录

在Android 10及更高版本中,访问公共目录需要使用MediaStore或者Storage Access Framework(SAF)来进行操作。SAF提供了一种标准的方式来访问设备上的公共文件,以增强用户的隐私和安全性。

1.MediaStore

使用「MediaStore」来访问公共数据。MediaStore是一个提供对多媒体文件(如图片、音频、视频)和其他文件(如文档)的访问的内容提供者。以下是使用MediaStore访问公共数据的步骤:

(1) 添加权限:在AndroidManifest.xml文件中添加以下权限:

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

这将允许应用程序读取外部存储器上的媒体文件。

(2) 查询公共数据:使用ContentResolver查询MediaStore来获取公共数据。例如,要查询所有的图片,可以使用以下代码:

Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;

Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
    do {
        // 处理每个图片的逻辑
        String id = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
        String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
        // ...
    } while (cursor.moveToNext());
    cursor.close();
}

这将返回一个包含图片的Cursor对象,然后可以遍历Cursor来处理每个图片的逻辑。

(3) 处理数据:根据需要处理查询到的数据。例如,可以使用图片的ID来获取其内容URI,并显示图片:

Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.parseLong(id));
imageView.setImageURI(imageUri);

这将使用图片的内容URI来设置ImageView的图片。

根据需要,可以使用不同的MediaStore类来访问其他类型的公共数据,如音频、视频或文档。

2.SAF

以下是使用「SAF」访问公共数据的步骤:

(1) 请求访问权限:首先,你需要在应用的清单文件(AndroidManifest.xml)中声明适当的权限。例如,如果你想访问外部存储器上的公共目录,你需要添加以下权限:

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

(2) 启动SAF:当你需要访问公共目录时,你可以使用Intent启动SAF。例如,如果你想让用户选择一个文件,你可以使用以下代码:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);

(3) 处理返回结果:当用户选择了一个文件后,你可以在onActivityResult方法中处理返回的结果。你可以通过data.getData()方法获取所选文件的URI。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        // 在这里处理所选文件的URI
    }
}

通过以上步骤,你可以在Android 10及更高版本中访问公共目录。请注意,访问公共目录可能需要用户的授权,因此你应该在代码中处理授权请求和用户的选择。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK