Android 高版本废弃 SDCardFS

SDCardFS 在搭载 Android 11 或更高版本且运行内核版本 5.4 或更高版本的设备上已废弃。在此类设备上,VTS 测试不允许将已装载的文件系统列为 SDCardFS。搭载 Android 11 或更高版本但运行内核版本 4.19 或更低版本的设备可以继续使用 SDCardFS,但 Google 不提供额外支持。

在废弃之前,利用 SDCardFS 可以控制对模拟内部存储设备和外部 SD 卡的访问权限,使应用仅可访问与其相关的数据。此外,它还提供了一个不区分大小写的层,以及一些额外的存储跟踪功能。

SDCardFS 替代功能

SDCardFS 替代项使用多个 Linux 内核文件系统功能来实现类似结果。不区分大小写由文件系统直接处理;这样一来,在区分大小写的文件夹和不区分大小写的文件夹中查找内容所需的时间几乎相同,消除了 SDCardFS 中的大文件夹查询速度减慢的问题。SDCardFS 原来为快速收集设置的存储数据而执行的配额跟踪操作现在可使用项目配额从用户空间配置。在某些对性能敏感的情况下,目录会就地绑定装载。新的 FUSE 实现为直接访问文件系统提供了分区存储,这主要是为了支持对位置信息进行遮盖。

配置 SDCard 替代功能

如需在搭载 Android 11 或更高版本的设备上为没有 SDCardFS 的模拟存储空间启用项目配额和大写转换功能,请沿用 device.mk 文件中的 emulated_storage.mk

$(call inherit-pr
Android 高版本废弃 SDCardFS 后,SD 卡自动挂载通常涉及系统框架和存储管理机制的变化。以下是一些常见的实现思路和代码示例: #### 1. 使用 StorageManager API Android 提供了 `StorageManager` 类来管理存储设备,可利用该类监听存储设备的挂载状态并进行相应处理。 ```java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Environment; import android.os.StorageManager; import java.io.File; public class SDCardMountReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null && (action.equals(Intent.ACTION_MEDIA_MOUNTED))) { StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); File[] externalFilesDirs = context.getExternalFilesDirs(null); for (File externalFilesDir : externalFilesDirs) { if (externalFilesDir != null && externalFilesDir.getAbsolutePath().startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) { continue; } if (externalFilesDir != null) { // 这里可以进行 SD 卡挂载后的操作 // 例如读取文件等 } } } } } ``` 在 Activity 中注册广播接收器: ```java import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private SDCardMountReceiver sdCardMountReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sdCardMountReceiver = new SDCardMountReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); intentFilter.addDataScheme("file"); registerReceiver(sdCardMountReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(sdCardMountReceiver); } } ``` #### 2. 权限要求 在 `AndroidManifest.xml` 中添加必要的权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` #### 3. 运行时权限 在 Android 6.0(API 级别 23)及以上版本,需要在运行时请求权限: ```java import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,可以进行后续操作 } else { // 权限被拒绝 } } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值