Android 手机存储及sd卡操作--案例登录记住帐号密码

原创 2016年08月29日 03:40:39

手机分为内部存储和外部存储。内部存储,即在本工程目录下。外部存储在sd卡上。手机没有sd卡也能运行程序。

判断sd是否存在

<span style="white-space:pre">		</span>//MEDIA_UNKNOWN:不能识别sd卡
    		//MEDIA_REMOVED:没有sd卡
    		//MEDIA_UNMOUNTED:sd卡存在但是没有挂载
    		//MEDIA_CHECKING:sd卡正在准备
    		//MEDIA_MOUNTED:sd卡已经挂载,可用
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

1,手机零散信息的读写方法一般用SharedPreferences方法,这个方法存储路径data/data/本包名/shared_prefs/文件名.xml。登录时,从本地获取帐号密码
package com.example.shpaerdemo01;

import java.io.File;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Toast;

import com.example.shpaerdemo02.R;

public class MainActivity extends Activity implements OnClickListener, OnCheckedChangeListener {
//	实现点击记住密码,用户登录时读取到密码
	private EditText word;
	private EditText pass;
	private Button but;
	private CheckBox cb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initview();
        initword();
    }
	private void initword() {
<span style="white-space:pre"></span><pre name="code" class="html">//		获取到存储info文件
		shared = getSharedPreferences("info", MODE_PRIVATE);
		//1,为文件中的键.2,如果没有键默认显示为空
		String names = shared.getString("word", "");
		String words = shared.getString("pass", "");
		if (names != null && words != null) {//当内容都不是空的时候执行
			checkBox.setChecked(true);
			word.setText(names);
			pass.setText(words);
		}
	}
	private void initview() {
		word = (EditText) findViewById(R.id.editText1);
		pass = (EditText) findViewById(R.id.editText2);
		but = (Button) findViewById(R.id.button1);
		cb = (CheckBox) findViewById(R.id.checkBox1);
		but.setOnClickListener(this);
//		多选按钮的事件
		cb.setOnCheckedChangeListener(this);
	}
	@Override
	public void onClick(View v) {
		String w = word.getText().toString().trim();
		String p = pass.getText().toString().trim();
//		判断是否被选中
		if (cb.isChecked()) {
	//		获取到存储文件 //1.文件名,2.文件读写模式一般都为私有
	//		info保存为xml文件。不需要给后缀名。
			SharedPreferences shared = getSharedPreferences("info",MODE_PRIVATE);
	//		获取到编辑器
			Editor editor = shared.edit();
	//		键值对形式
			editor.putString("word", w);
			editor.putString("pass", p);
	//		提交
			editor.commit();
		}
		Toast.makeText(this, "登录成功", 0).show();
		
	}
	
		
	}


    
}



2,文件外部存储,在sd卡上。首先要判断sd卡是否存在。

//MEDIA_UNKNOWN:不能识别sd卡
    //MEDIA_REMOVED:没有sd卡
    //MEDIA_UNMOUNTED:sd卡存在但是没有挂载
    //MEDIA_CHECKING:sd卡正在准备
    //MEDIA_MOUNTED:sd卡已经挂载,可用

package com.itheima.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()){
    		//  获取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, "sd", 0).show();
    }
    
}

3,sd卡内存的内存大小的获取方法
package com.itheima.getsdavail;

import java.io.File;

import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.app.Activity;
import android.text.format.Formatter;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		File path = Environment.getExternalStorageDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize;
        long totalBlocks;
        long availableBlocks;
        
        //获取当前系统版本的等级     判断是否大于4.3版本
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
			//大于的话用新的api显示long
        	 blockSize = stat.getBlockSizeLong();
             totalBlocks = stat.getBlockCountLong();
             availableBlocks = stat.getAvailableBlocksLong();
        }
        else{
			//小于的话用旧的api显示int
        	blockSize = stat.getBlockSize();
            totalBlocks = stat.getBlockCount();
            availableBlocks = stat.getAvailableBlocks();
        }
        
        TextView tv = (TextView) findViewById(R.id.tv);
		//存储卡的计算方法是,每一个单位的存储的字节数*字节
        tv.setText(formatSize(availableBlocks * blockSize));
	}
	//调用系统
	private String formatSize(long size) {
        return Formatter.formatFileSize(this, size);
    }

}

4,内部存储用流的读取
package com.itheima.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.apirwinrom.R;

import android.os.Bundle;
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(){
		//FilesDir所保存的不能系统检测到删除,cachedir目录下的当系统内存不足时,会删除。
//    	File file = new File(getFilesDir(), "info.txt");
    	File file = new File(getCacheDir(), "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()){
    		//返回一个File对象,其路径是data/data/com.itheima.apirwinrom/files
//    		File file = new File(getFilesDir(), "info.txt");
    		
    		//返回值也是一个File对象,其路径是data/data/com.itheima.apirwinrom/cache
    		File file = new File(getCacheDir(), "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();
			}
    	}
    	
    }
    
}

5,这个可以直接复制粘贴当作判断sd卡是否存在的工具类

package com.xdl.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;

import com.xdl.bean.User;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Environment;
import android.os.Message;
import android.provider.MediaStore;
/**
 * 判断SD卡是否存在
 * @author Administrator
 *
 */
public class SdcardTools {

	public static boolean sdcard(){
		String state = Environment.getExternalStorageState();
		if (state.equals(Environment.MEDIA_MOUNTED)) {
			return true;
		}
		return false;
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

Android获取不同手机 自身存储和外置SD卡存储路径的解决方案

最近在给一个应用里面做一个内置的文件管理器,期间遇到一个问题,就是选择不同手机的sd卡存储和手机本身存储。可以在两者之间来回切换,经过一系列测试发现,现在的很多手机厂家定制的手机内存和sd卡内存的路径...
  • qq_34471736
  • qq_34471736
  • 2017年02月10日 10:46
  • 1591

android 获得手机外插SD卡 存储路径和存储空间

获取存储路径: /** * * * Description: 获取手机外插SD 存储路径 * * @date 2017-4-18 * ...
  • lxlmycsdnfree
  • lxlmycsdnfree
  • 2017年05月16日 17:17
  • 1213

如何区分手机内置存储卡与外置存储卡

android系统自从升级到2.3以后,多一个功能,可以判断存储卡是否是可以卸载的。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储...
  • JJMM2009
  • JJMM2009
  • 2013年10月17日 13:45
  • 15250

Android基础——SD卡的操作详解(存入和读取)

/** * * @author 刘中林 * */ //MainActivity类: public class MainActivity extends Activity { // 展示...
  • u012369385
  • u012369385
  • 2016年09月24日 16:56
  • 1274

android 6.0文件写入外置SD卡的问题!

在5.0之前开发如果要把文件写入到某一个地方,你只需要: public static String createSDCardDir(String folatName){ Str...
  • Rgen_xiao
  • Rgen_xiao
  • 2017年02月17日 15:22
  • 3351

安卓学习笔记获取手机内存与SD卡路径及大小

实现原理 通过反射,调用StorageManger被隐藏接口getVolumePaths(),来获得手机的存储路径,进而通过StatFs获取区块blockCount与blockSize的大小,以计...
  • qq_28261343
  • qq_28261343
  • 2016年04月17日 22:27
  • 1632

Android内部存储与外置SDCard

Android手机存储 通常有三个部分 1、Ram Ram 也就是相当于PC内存条的东东,没什么好说的。 2、手机存储 手机内通常内置一块eMMC存储设备,也就是常说的Rom。个人觉...
  • f467655008
  • f467655008
  • 2015年06月26日 17:08
  • 892

Android开发中将LOG存入SD卡

说一下,这不是我个人原创,本人非常尊重原创,但是我这人又比较糊涂,实在找不到这篇文章的出处了。 直接上代码:` package com.example.blood_demo.util;import...
  • xf396191344
  • xf396191344
  • 2015年09月07日 11:10
  • 1580

Android对外置sd卡的权限问题(上)

作者:许勇权         在调查图库中关于在内外存置卡之间移动/复制操作时,写了一个小程序测试在内外存储卡操作的可行性和性能问题,发现第三方应用无法访问外置存储卡。   调查后得知,在2....
  • maetelibom
  • maetelibom
  • 2016年06月30日 11:44
  • 7705

Android设备挂载的所有存储器 手机存储 ,sd卡

怎么获取Android设备所有存储器的位置呢?或者说获得所有的挂载点
  • u012889434
  • u012889434
  • 2015年05月08日 12:10
  • 1708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 手机存储及sd卡操作--案例登录记住帐号密码
举报原因:
原因补充:

(最多只允许输入30个字)