Android简易实战教程--第十五话《在外部存储中读写文件》

第七话里面介绍了在内部存储读写文件 点击打开链接

这样有一个比较打的问题,假设系统内存不够用,杀本应用无法执行,或者本应用被用户卸载重新安装后。以前保存的用户名和密码都不会得到回显。所以,有必要注意这个问题

因此把文件保存到sd卡中。即今天所写的  第十五话《在外部存储中读写文件》

首先布局文件和第七话一样:

<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"
     >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"
        />
    <EditText
        android:id="@+id/et_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:hint="请输入密码"
        />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
		<CheckBox
		    android:id="@+id/cb"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:text="记住用户名和密码"
		    android:layout_centerVertical="true"
		    />
		<Button
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:layout_gravity="right"
		    android:text="登录"
		    android:layout_alignParentRight="true"
		    android:onClick="login"
		    />
	</RelativeLayout>
</LinearLayout>

接着是主界面的代码:

package com.itydl.rwinrom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

import org.apache.http.entity.InputStreamEntity;

import com.itheima.rwinsd.R;

import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name;
	private EditText et_pass;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_name = (EditText) findViewById(R.id.et_name);
    	et_pass = (EditText) findViewById(R.id.et_pass);

        readAccount();

    }

    public void readAccount(){
    	if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
	    	File file = new File("sdcard/info.txt");
	    	if(file.exists()){
		    	try {
					FileInputStream fis = new FileInputStream(file);
					//把字节流转换成字符流
					BufferedReader br = new BufferedReader(new InputStreamReader(fis));
					//读取txt文件里的用户名和密码
					String text = br.readLine();
					String[] s = text.split("##");

			    	et_name.setText(s[0]);
			    	et_pass.setText(s[1]);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	}
    	}
    }

    public void login(View v){

    	String name = et_name.getText().toString();
    	String pass = et_pass.getText().toString();

    	CheckBox cb = (CheckBox) findViewById(R.id.cb);
    	//判断选框是否被勾选
    	if(cb.isChecked()){
    		//Environment.getExternalStorageState()获取目前sdcard的状态
    		//MEDIA_UNKNOWN:不能识别sd卡
    		//MEDIA_REMOVED:没有sd卡
    		//MEDIA_UNMOUNTED:sd卡存在但是没有挂载
    		//MEDIA_CHECKING:sd卡正在准备
    		//MEDIA_MOUNTED:sd卡已经挂载,可用
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

	    		//返回一个File对象,其路径是sd卡的真实路径
	    		File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
	//    		File file = new File("sdcard/info.txt");
	    		FileOutputStream fos;
				try {
					fos = new FileOutputStream(file);
					fos.write((name + "##" + pass).getBytes());
					fos.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    		else{
    			Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show();
    		}
    	}

    	//创建并显示吐司对话框
    	Toast.makeText(this, "登录成功", 0).show();
    }

}

与在内存读写信息不同,sd卡的读写需要权限:

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

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

运行截图如下:

点击登录,土司后。再一次进入界面。会回显数据,因为打钩把用户名和密码都保存到了sd文件中了。再打开activity界面,直接读取sd文件中的数据急了

时间: 2024-11-24 22:29:01

Android简易实战教程--第十五话《在外部存储中读写文件》的相关文章

Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导,声明实际开发中不会用到这两种方式,这里指示提供一种思路和给初学者学习简单的api. 由于内容和之前的基本一样,不做过多的解释.直接上代码: xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

Android简易实战教程--第十八话《ListView显示,简单的适配器SimpleAdapter》

本篇介绍Listview的显示,对于listview有许多的适配器,如ArrayAdapter,BaseAdapter,SimpleAdapter等等.本篇先热身一下,介绍最简单的SimpleAdapter适配器. 对于安卓界面的显示. 首先在主界面布局文件main.xml加入如下代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http

Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》

监听文本输入情况,仅仅限于土司略显low点,这一篇就稍微"高大上"些,体验一下滚动和震动. 首先,需要两个文件.截图: 两个文件的内容分别如下: cycle_7: <?xml version="1.0" encoding="utf-8"?> <!-- 表示循环的次数 --> <cycleInterpolator xmlns:android="http://schemas.android.com/apk/re

Android简易实战教程--第十四话《模仿金山助手创建桌面Widget小部件》

打开谷歌api,对widget小部件做如下说明: App Widgets are miniature application views that can be embedded in otherapplications(such as the Home screen) and receive periodic updates. These views arereferred to as Widgets in the user interface,and you can publish one

Android 存储学习之在外部存储中读写文件

上节学习了如何在手机内部存储中读写文件,本节学习如何在手机的外部存储中读写文件.那就是如何在Sdcard中读写文件. 那我们还是用以前登录界面的例子举例说明,(登录界面请看上节Android 存储学习之在内部存储中读写文件) 先我们显示写的代码: 当点击确定并且自动登录的钩是选中的,则就会在sdcard文件夹写创建一个info.txt文件 public void login(View v) { String name = ed_nam.getText().toString(); String p

Android简易实战教程--第二十话《通过广播接收者,对拨打电话外加ip号》

没睡着觉,起来更篇文章吧哈哈!首先祝贺李宗伟击败我丹,虽然我是支持我丹的,但是他也不容易哈哈,值得尊敬的人!切入正题:这一篇来介绍个自定义广播接收者. 通常我们在外拨电话的时候,一般为使用网络电话.如果电话号码是某种类型的电话,会自动在前面加上ip号.从而节省费用.今天这一篇就模拟ip拨号.这个功能,是通过广播接收者来实现的.自定义广播接收者,"监听"外拨电话时候系统发出的广播(系统对我们注册的广播大喊:"亲爱的,我来了!"),收到信息后,给外拨电话前缀价格ip号码

Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》

之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接 这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射.如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接 首先,定义一个服务,在这个服务里面,完成土司的创建(小火箭布局创建) 烟的效果属于动画播放,而且要依托一个activity.(这个activity要定义为透明状态) 定义烟的activity的布局文件 <?xml version="1.0" encoding="utf-8"?>

Android简易实战教程--第十一话《获取手机所有应用信息Engine类详解》

如果想要获取系统手机应用的详细信息,那么下边代码可以直接作为模板使用.笔者对每一行代码都做了注解,供您参考.直接上代码: package com.example.itydl.engines; import java.io.File; import java.util.ArrayList; import java.util.List; import com.example.itydl.domain.AppBean; import android.content.Context; import an

Android简易实战教程--第二十二话《简单的水平进度条》

本打算写一篇自定义水平进度条,但是出于过度和文章的完整性,今天先来一篇简单的进度条. 需求:按钮点击,实现水平进度条加载进度.而且,进度条设置两个进度(到下边的例子里就能知道什么是"第二进度条"了) 配置文件代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re