編輯:關於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;
}
}
}
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;
}
}

Android中ListView + CheckBox實現單選、多選效果
還是先來看看是不是你想要的效果:不廢話,直接上代碼,很簡單,代碼裡都有注釋1 單選public class SingleActivity extends AppCompa
Android實現將應用崩潰信息發送給開發者並重啟應用的方法
本文實例講述了Android實現將應用崩潰信息發送給開發者並重啟應用的方法。分享給大家供大家參考,具體如下:在開發過程中,雖然經過測試,但在發布後,在廣大用戶各種各樣的運
Memcached 源碼分析--網絡模型流程分析
一、功能介紹Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態
Android使用GridLayout繪制自定義日歷控件
效果圖思路:就是先設置Gridlayout的行列數,然後往裡面放置一定數目的自定義日歷按鈕控件,最後實現日歷邏輯就可以了。步驟:第一步:自定義日歷控件(初步)第二步:實現