Android中的sdcard是一个外部存储目录,是一个应用程序的私有目录,只有当前应用程序有权限访问读写,其他应用无权限访问。一般用来存放一些安全性不高,但比较大的数据。

使用Sdcard注意事项:
1.权限问题:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.通过 Environment获取sdcard的路径:

Environment.getExternalStorageDirectory().getPath();

3.使用前需要判断sdcard状态:
if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){
 //sdcard状态是没有挂载的情况
Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
return ;
}

4.需要判断sdcard剩余空间:
File sdcard_file = Environment.getExternalStorageDirectory(); //获得sdcard目录对象
long usableSpace = sdcard_file.getUsableSpace(); //获取该目录下可用空间的大小
//将long类型的文件大小格式转换为M或G
String usableSpaceSize = Formatter.formatFileSize(this, usableSpace);
//假如下载一个电影需要100M,用户手机不足100M,则提示用户
if (usableSpace < 100*1024*1024) {
Toast.makeText(mContext, "sdcard剩余空间不足,剩余空间为:usableSpaceSize", 0).show();
return;
}

5.下面通过模拟一个登录页面,并实现保存用户名和密码的小案例,来详细介绍sdcard存储数据的过程:

①布局文件代码:

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"android:orientation="vertical" ><EditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名"/><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:layout_marginBottom="15dp"android:inputType="textPassword"android:hint="请输入密码"/><RelativeLayout android:layout_width="match_parent"android:layout_height="wrap_content"><CheckBox android:id="@+id/cb_rem"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:text="记住密码"/><Button android:id="@+id/btn_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:text="登 录"/></RelativeLayout>
</LinearLayout></span>

②MainActivity的代码:

<span style="font-size:18px;">package com.example.savedatatosd;import java.io.File;
import java.util.Map;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private EditText et_password;private EditText et_username;private CheckBox cb_rem;private Button btn_login;private Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;//初始化控件et_password = (EditText) findViewById(R.id.et_password);et_username = (EditText) findViewById(R.id.et_username);cb_rem = (CheckBox) findViewById(R.id.cb_rem);btn_login = (Button) findViewById(R.id.btn_login);//给登录按钮设置监听事件btn_login.setOnClickListener(this);//再次进入应用时,先判断用户是否点击了保存按钮,如果保存的话,则回显出保存的内容Map<String, String> userInfo = UserInfoUtils.getUserInfo(); if (userInfo != null) { //用户信息不为空,则说明保存了信息et_username.setText(userInfo.get("username"));et_password.setText(userInfo.get("password"));//设置按钮为选择状态cb_rem.setChecked(true);}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_login://获取用户输入的内容String password = et_password.getText().toString().trim();String username = et_username.getText().toString().trim();//记录CheckBox的选中状态boolean isChecked = cb_rem.isChecked();//1,判空if (TextUtils.isEmpty(password) || TextUtils.isEmpty(username)) {Toast.makeText(mContext, "用户名密码不能为空", 0).show();return;}//2,判断可用空间是否满足存储数据File sdcard_file = Environment.getExternalStorageDirectory(); //获得sdcard目录对象long usableSpace = sdcard_file.getUsableSpace(); //获取该目录下可用空间的大小//将long类型的文件大小格式转换为M或GString usableSpaceSize = Formatter.formatFileSize(this, usableSpace);//假如下载一个电影需要100M,用户手机不足100M,则提示用户if (usableSpace < 100*1024*1024) {Toast.makeText(mContext, "sdcard剩余空间不足,剩余空间为:usableSpaceSize", 0).show();return;}//如果上面的两个条件都满足,则执行下面的代码//如果CheckBox被选中,则保存用户信息if (isChecked) {//因为要保存到sdcard上,所以先判断sdcard是否挂载了if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//如果sdcard每个挂载,则提示用户Toast.makeText(mContext, "sdcard没有挂载或不可用", 0).show();}boolean result = UserInfoUtils.saveUserInfo(username, password);if (result) {Toast.makeText(mContext, "用户名密码保存成功", 0).show();}else {Toast.makeText(mContext, "用户名密码保存失败", 0).show();}}break;}}
}</span>

③实现往sdcard中存、取数据的工具类:

<span style="font-size:18px;">package com.example.savedatatosd;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import android.os.Environment;public class UserInfoUtils {/** 保存用户信息到sdcard* 参数为用户输入的用户名和密码*/public static boolean saveUserInfo(String username, String password) {try {//封装传过来的用户名和密码,"##"为分割符,一般用正则表达式或file.separator()String userInfo = username + "##" + password;//指定保存的路径(通过API获得)String path = Environment.getExternalStorageDirectory().getPath();System.out.println(path);//我用的是genymotion虚拟机,保存路径为: /storage/emulated/0//创建fileFile file = new File(path, "userinfo.txt");//创建文件输出流,把文件写到sdcardFileOutputStream fos = new FileOutputStream(file);fos.write(userInfo.getBytes());fos.close();return true; //如果保存成功,则返回true} catch (Exception e) {e.printStackTrace();}return false;}/** 从sdcard中取出数据*/public static Map<String, String> getUserInfo(){try {//读取的路径、文件和保存时的相同//指定保存的路径String path = Environment.getExternalStorageDirectory().getPath();//创建fileFile file = new File(path, "userinfo.txt");//使用缓冲流把数据读出(也可以使用内存流),这里使用缓存流,是因为其有readLine方法,可以逐行读取FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis));//读取一行String readLine = br.readLine();//对读取的内容按照标记进行分割String[] split = readLine.split("##");//把分割后的数据保存到HashMap集合中HashMap<String, String>map = new HashMap<String, String>();map.put("username", split[0]);map.put("password", split[1]);//关流br.close();fis.close();//把map返回回去return map;} catch (Exception e) {e.printStackTrace();}return null;}
}</span><span style="font-size:14px;">
</span>

④输入用户名和密码,选中“记住密码”,点击“登录按钮”,退出后,下次再进入用户名和密码便会回显出来,说明往sdcard中存取数据的功能实现了,效果图如下:

Android之sdcard保存数据相关推荐

  1. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

  2. Android开发中保存数据的四种方法方法

    本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...

  3. android数据写入文件格式,Android 本地文件保存数据(2020-08-07)

    文件操作需要手机权限,需要在AndroidManifest.xml添加 --------------------------------第一种方式--------------------------- ...

  4. Android使用SQLite保存数据

    要使用SQLite首先要建表,建表要继承SQLiteOpenHelper,如下: package com.example.sqlitedemo4;import android.content.Cont ...

  5. 安卓Android sqllite实现保存数据和读数据

    1.数据库创建 public class DatabaseHolder extends SQLiteOpenHelper {//创建数据库school.dbpublic DatabaseHolder( ...

  6. Android doc|Getting Started|部分 --转载 保存数据

    保存数据 大多数 Android 应用需要保存数据,即使仅保存在 onPause() 过程中与应用状态有关的信息,以便用户进度不会丢失 . 大多数非平凡应用也需要保存用户设置,并且有些应用必须在文件和 ...

  7. Android onSaveInstanceState、onRestoreInstanceState保存数据

    先看例子: @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState ...

  8. android view 存值,使用ViewModel保存数据

    使用viewModel保存数据,使App被系统kill后,再次启动依然可以恢复被kill前的数据 下面的 model = ViewModelProviders.of(this,new SavedSta ...

  9. Android产品研发(十)--尽量不使用静态变量保存数据

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android开发过程中几种常见网络协议:xml,json,protobuf等,以及它们各自的优缺点,一般而言当我们的App涉及到了网络传输时都会 ...

  10. android mysql储存动态数据_Android中数据的保存

    1. 概述 在Android中有以下几种保存数据方式: 1). 使用sharedPreference去保存:只有应用程序自己可以访问 2). 保存在应用程序私有的文件夹下:只有应用程序自己可以访问 3 ...

最新文章

  1. 把两个文件捆绑压缩成一个文件命令
  2. ROS学习之包的概念
  3. Proj.4 升级新版本5.x和6.x
  4. leetcode 反转字符串
  5. bfs理解——hdu6386好题
  6. 使用Maven创建Web项目后,jsp引入静态文件提示报错。JSP 报错:javax.servlet.ServletException cannot be resolved to a type...
  7. 【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护
  8. 修改样式_Word小技巧:如何设置样式 快速修改文本格式
  9. 查看本机的用户 net user
  10. 安装Vmware虚拟机弹出此安装程序不支持降级解决办法
  11. 视觉里程计02 基于特征匹配的位姿估计
  12. java模拟洗衣机程序,JAVA洗衣机仿真程序实验报告及代码
  13. Android签名总结
  14. 从零开始了解 kubernetes,还有谁不会?
  15. android 6.0 讯飞TTS
  16. linux只能单向ping通,两机只能单向Ping通的原因、ping的原理
  17. mysql mariadb libs_mysql 安装 【解决】mariadb-libs is obsoleted by *** - Ctrl+CCtrl+V - ITeye博客...
  18. android手机误删短信恢复软件,苹果手机短信误删恢复工具_安卓手机已删除短信恢复软件-万能数据恢复大师官网...
  19. 用html做一个漂亮的网站,个人网页,css
  20. 理解shallow heap 和 retained heap

热门文章

  1. 文件后缀名obju为什么打不开_obj是什么文件格式,obj扩展名文件如何打开?
  2. mac更新后Git无法使用的问题
  3. ens33网卡出问题<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  4. NFS 服务器启动失败
  5. td中的块元素居中问题
  6. 面试题:PCB包括哪些内容
  7. 两个不同包里有相同的类
  8. 已解决ValueError: Of the four parameters: start, end, periods, and freq, exactly three must be specifie
  9. Microsoft Live Account for Mail, space, onecare
  10. 北京理工计算机科学与应用,沈蒙_北京理工大学计算机学院