Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之sdcard保存數據

Android之sdcard保存數據

編輯:關於Android編程

Android中的sdcard是一個外部存儲目錄,是一個應用程序的私有目錄,只有當前應用程序有權限訪問讀寫,其他應用無權限訪問。一般用來存放一些安全性不高,但比較大的數據。

使用Sdcard注意事項:
1.權限問題:

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存儲數據的過程:

①布局文件代碼:

 



    
    

    
        

 

 

②MainActivity的代碼:

 

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;

	@Override
	protected 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 userInfo = UserInfoUtils.getUserInfo(); 
		if (userInfo != null) { //用戶信息不為空,則說明保存了信息
			et_username.setText(userInfo.get("username"));
			et_password.setText(userInfo.get("password"));
			//設置按鈕為選擇狀態
			cb_rem.setChecked(true);
		}
	}

	@Override
	public 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或G
			String 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;
		}
	}
}

③實現往sdcard中存、取數據的工具類:

 

 

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
			//創建file
			File file = new File(path, "userinfo.txt");
			//創建文件輸出流,把文件寫到sdcard
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(userInfo.getBytes());
			fos.close();
			return true; //如果保存成功,則返回true
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	/*
	 * 從sdcard中取出數據
	 */
	public static Map getUserInfo(){
		try {
			//讀取的路徑、文件和保存時的相同
			//指定保存的路徑
			String path = Environment.getExternalStorageDirectory().getPath();
			//創建file
			File 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集合中
			HashMapmap = new HashMap();
			map.put("username", split[0]);
			map.put("password", split[1]);
			//關流
			br.close();
			fis.close();
			//把map返回回去
			return map;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

④輸入用戶名和密碼,選中“記住密碼”,點擊“登錄按鈕”,退出後,下次再進入用戶名和密碼便會回顯出來,說明往sdcard中存取數據的功能實現了,效果圖如下:

 

\


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved