android.os.Environment.getExternalStorageState

本文介绍了如何在Android应用中正确设置SD卡权限,包括在AndroidManifest文件中添加必要的权限声明,检查SD卡是否存在以及如何获取SD卡文件目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 在AndroidManifest文件中加入sdcard操作权限
  * <!--在SDCard中创建与删除文件权限 -->
  * <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
  * <!--往SDCard写入数据权限 --> 
  * <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
* 2 确认sdcard的存在
  * android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
* 3 获取扩展存储设备的文件目录
  * android.os.Environment.getExternalStorageDirectory();
package com.example.myapplication; import android.content.Context; import android.os.Build; import android.os.Environment; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class FileSaveQQ { public static boolean saveUserInfo(Context context, String account, String password) { FileOutputStream fos = null; String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { String SDPath ; if (Build.VERSION.SDK_INT > 29) { SDPath = context.getExternalFilesDir(null).getAbsolutePath(); } else { SDPath = Environment.getExternalStorageDirectory().getPath(); } File file = new File(SDPath, "data.txt"); try { fos = new FileOutputStream(file); fos.write((account + ":" + password).getBytes()); //将数据转换为字节码的形式写入data.txt文件中 fos.close(); } catch (Exception e) { e.printStackTrace(); } } return true; } //从data.txt文件中获取存储的QQ账号和密码 public static Map<String, String> getUserInfo(Context context) { String content = ""; FileInputStream fis = null; String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { String SDPath ; if (Build.VERSION.SDK_INT > 29) { SDPath = context.getExternalFilesDir(null).getAbsolutePath(); } else { SDPath = Environment.getExternalStorageDirectory().getPath(); } File file = new File(SDPath, "data.txt"); try { fis = new FileInputStream(file); //获取文件的输入流对象fis byte[] buffer = new byte[fis.available()]; fis.read(buffer);//通过read()方法读取字节码中的数据
最新发布
03-24
<think>好的,用户的问题是关于在Android应用中如何保存和读取用户信息到外部存储,需要示例代码。首先,我需要回忆一下Android的外部存储机制。记得外部存储分为公共目录和私有目录,公共目录如音乐、下载等,而应用的私有目录不需要权限,但可能需要在AndroidManifest.xml中声明权限。 然后,用户提到需要保存和读取用户信息,可能涉及到检查外部存储是否可用。我记得在Android中,使用Environment.getExternalStorageState()来检查存储状态是否为MEDIA_MOUNTED,这样确保存储可写。同时,从Android 10(API 29)开始,作用域存储(Scoped Storage)被引入,可能需要使用MediaStore或特定目录来保存文件,但如果是应用的私有目录,可能不需要请求权限。 接下来,权限方面,对于外部存储,如果是公共目录,可能需要WRITE_EXTERNAL_STORAGE权限,但如果是应用的私有外部目录(通过getExternalFilesDir()),则不需要权限。不过,从Android 10开始,作用域存储限制了应用访问其他应用的私有目录,所以应该优先使用私有目录。 然后,保存文件的步骤大致是:检查存储状态,创建文件对象,写入数据。读取的话则是打开文件输入流,读取内容。用户信息可能以文本形式保存,比如JSON或键值对,所以示例代码可以使用简单的字符串读写。 现在需要编写示例代码,包括保存和读取的方法。保存时需要处理可能的IO异常,读取时同样。同时,要处理Android版本差异,但可能用户需要基本示例,暂时不考虑版本适配。 权限方面,需要在AndroidManifest.xml中添加写和读的权限,但如果是私有目录,可能不需要,但为了兼容旧版本,可能还是需要声明WRITE_EXTERNAL_STORAGE,但如果是目标SDK版本较高,可能需要动态请求。不过用户可能希望简单示例,所以先声明权限。 然后,用户可能需要处理文件名和目录结构,比如在外部存储的私有目录下创建文件,使用getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)来获取路径。 最后,测试代码是否覆盖了异常情况,比如存储不可用时的处理,以及正确读写数据。确保代码符合最新的Android开发实践,比如使用Context的getExternalFilesDir()而不是Environment.getExternalStoragePublicDirectory(),因为后者在较新版本中已被弃用。 总结步骤: 1. 检查外部存储是否可用。 2. 创建文件路径,使用应用的私有外部目录。 3. 写入数据到文件。 4. 读取时打开文件流读取内容。 5. 处理可能的异常。 6. 添加必要的权限声明。 现在需要将这些步骤转化为代码,并确保语法正确,同时给出说明。可能还需要注意字符编码,比如使用UTF-8来保证正确性。另外,读取时可能需要检查文件是否存在,避免FileNotFoundException。</think>### Android外部存储用户信息操作示例 根据Android存储规范,外部存储操作需遵循以下步骤: ### 保存用户信息到外部存储 ```java // 检查存储可用性 public boolean saveUserInfo(Context context, String fileName, String content) { if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { return false; } File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), fileName); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(content.getBytes(StandardCharsets.UTF_8)); return true; } catch (IOException e) { e.printStackTrace(); return false; } } ``` ### 读取用户信息 ```java public String readUserInfo(Context context, String fileName) { File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), fileName); if (!file.exists()) return null; try (FileInputStream fis = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) { StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } return sb.toString(); } catch (IOException e) { e.printStackTrace(); return null; } } ``` ### 权限配置(AndroidManifest.xml) ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- 适配Android 9及以下 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> ``` ### 关键要点说明: 1. **存储位置选择**:使用`getExternalFilesDir()`访问应用专属外部存储目录,无需运行时权限[^3] 2. **编码规范**:强制指定UTF-8编码保证字符正确性 3. **异常处理**:使用try-with-resources自动关闭流,防止资源泄漏 4. **版本适配**:通过maxSdkVersion限定传统存储权限范围,兼容Android 10+的作用域存储[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值