SDCard权限设置

本文介绍了如何解决Android项目中遇到的SDCard读写权限问题。通过CMD使用adb shell进入root权限,执行chmod命令修改sdcard目录权限至0755。此外,还提到了通过AndroidManifest.xml添加权限申请,以及使用Environment.getExternalStorageDirectory()获取SDCard路径的方法。
AI助手已提取文章相关产品:

最近在做Android项目,发现之前能对sdcard卡进行读写操作突然不能了,细找之下,发现如下修改权限途径:
设置DDMS(File Explorer)目录下的sdcard目录的权限

1、打开cmd命令   
2、输入adb shell(成功后进入adb的root用户状态#) 
3、你可以用 ls 命令看下当前文件夹下目录,你会发现sdcard目录在这下面
4、修改sdcard权限,因为此时sdcard是only-read的状态,
5、修改目录命令:chmod 075 (不要直接用777,不能成功执行的) 
6、sdcard目录的读写权限修改完成。可在其中导入文件。

其它命令:
adb shell mount -o remount rw /
注意,/表示的是根目录,因此这个不仅仅是对sdcard,其他文件也可以读写。rw表示读写权限,mount重挂载文件系统

如图:



程序中访问SDCard,需要申请访问SDCard权限,在AndroidManifest.xml加入访问SDCard权限

如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

得到当前SDCARD的位置
Environment.getExternalStorageDirectory()

这个是外部存储路径,比使用绝对路径好 。

在android模拟器中删除系统应用程序

首先启动android模拟器。
打开cmd命令行窗口。输入
adb -s emulator-5554 shell
此时可以管理系统文件夹了,再输入
ls
可以看到列出了文件夹和文件,输入
cd system/app
再输入
ls
可以看到系统自带的应用程序apk文件,删除你想要删除的,例如Phone.apk,输入
rm Phone.apk
此时会看到提示说
rm failed for Phone.apk, Read-only file system
那是因为这些是只读文件,我们没有权限删除它。
所以接下来要做的是获取权限,首先查看权限,输入
mount
可以看到
/dev/block/mtdblock0 /system yaffs2 ro 0 0
说明在system这个地方我们没有权限
那么接下来我们就来获取权限,输入
mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system
没有提示错误,再次查看权限,输入
mount
可以看到
/dev/block/mtdblock0 /system yaffs2 rw 0 0
说明我们已经获取到权限了
此时再输入
rm Phone.apk
就可以成功删除了
 
最后一点,就算你成功删除了,android模拟器每次启动时也会恢复回来。
那么如何永久删除呢,很简单,删除SdkSetup.apk,输入
rm SdkSetup.apk
还没完,找到avd目录(一般在我的文档),进入xxxx.avd目录,删除cache.img和userdata-qemu.img
还有还有,找到%SDK_HOME%/platforms/android-X/images/system.img,复制到上面的目录中。
最后最后,再重启模拟器,大功告成!

您可能感兴趣的与本文相关内容

<think>好的,我现在需要回答用户关于Android访问SD所需权限的问题。用户已经提供了一些站内引用,我需要结合这些引用内容来给出准确的回答。 首先,用户的问题集中在访问SD需要的权限上。根据引用[1],Android从6.0开始引入了运行时权限,应用在访问存储时需要申请权限。在Android 9.0中,即使应用声明了权限,也可能出现权限被拒绝的情况,这可能是因为版本差异导致的权限管理变化。 接下来,引用[2]和[3]提到了在AndroidManifest.xml中注册READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限的必要性。这说明在清单文件中声明这些权限是基本步骤,但可能还需要运行时动态申请。 然后,引用[5]指出,如果应用同时使用机身存储SD,可能无法在SD修改数据,只能往主存储写入。这可能涉及到Android版本对SD访问的限制,特别是在更高版本中可能更严格。 用户提供的引用中有关于Android 9.0的问题,可能需要注意版本差异。例如,在Android 10及以上,作用域存储(Scoped Storage)被引入,进一步限制了对外部存储的访问,可能需要不同的处理方式,比如使用MediaStore API或者请求所有文件访问权限(MANAGE_EXTERNAL_STORAGE)。不过用户的问题可能集中在Android 9.0,所以需要明确区分版本。 另外,引用[4]提到用户尝试重新创建AVD并设置SD大小,这可能涉及到模拟器中的配置问题,但核心还是权限声明是否正确。 总结下来,访问SD需要的步骤包括: 1. 在AndroidManifest.xml中声明读写权限。 2. 在运行时动态申请这些权限。 3. 处理不同Android版本的限制,特别是Android 9.0及以上可能需要额外注意。 需要确保用户知道动态申请权限的重要性,否则即使静态声明了权限,应用也可能无法访问SD。此外,如果应用需要访问SD上的特定目录,可能需要使用存储访问框架(SAF)或者其他API,特别是在较新的Android版本中。 可能还需要提醒用户,从Android 11开始,作用域存储成为强制要求,进一步限制了对SD的直接访问,但用户的问题可能不涉及这么高的版本。不过根据引用[5],Android 9.0的应用可能无法同时使用机身存储SD,这可能涉及多存储设备的情况,需要特别注意路径的访问权限。 最后,生成的相关问题需要覆盖权限声明、运行时处理、版本差异和访问方法等方面,帮助用户全面理解。</think>### Android访问SD所需权限说明 在Android系统中访问SD需要按照不同版本要求配置权限,具体步骤如下: #### 1. 声明静态权限AndroidManifest.xml) 在应用配置文件中添加存储读写权限声明: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` > 注意:Android 6.0+ 需要动态申请权限,仅声明静态权限无法直接使用[^1][^2] #### 2. 动态权限申请(Android 6.0+) 在运行时发起权限请求: ```java // 检查权限状态 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 弹出权限申请对话框 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` #### 3. Android 9.0+ 特殊要求 在Android 9.0(API 28)及以上版本: - 需要确保应用**同时申请且被授予**读写权限 - 使用`Environment.getExternalStorageDirectory()`获取路径时需注意分区存储限制 - 若需要访问非应用专属目录,建议使用存储访问框架(SAF)[^5] #### 4. 文件路径访问限制 从Android 10(API 29)开始: - 强制启用**作用域存储**(Scoped Storage) - 访问媒体文件需通过`MediaStore` API - 特殊权限`MANAGE_EXTERNAL_STORAGE`需要单独申请 #### 5. SD特殊处理 当设备存在**多存储设备**时: ```java // 获取所有存储File[] volumes = Context.getExternalFilesDirs(null); // volumes[0] 为机身存储 // volumes[1] 为SD(如果存在) ``` 需注意:直接访问SD根目录需要用户通过系统选择器授权
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值