編輯:關於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); //再次進入應用時,先判斷用戶是否點擊了保存按鈕,如果保存的話,則回顯出保存的內容 MapuserInfo = 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 MapgetUserInfo(){ 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集合中 HashMap map = 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; } }
還是先來看看是不是你想要的效果:不廢話,直接上代碼,很簡單,代碼裡都有注釋1 單選public class SingleActivity extends AppCompa
本文實例講述了Android實現將應用崩潰信息發送給開發者並重啟應用的方法。分享給大家供大家參考,具體如下:在開發過程中,雖然經過測試,但在發布後,在廣大用戶各種各樣的運
一、功能介紹Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態
效果圖思路:就是先設置Gridlayout的行列數,然後往裡面放置一定數目的自定義日歷按鈕控件,最後實現日歷邏輯就可以了。步驟:第一步:自定義日歷控件(初步)第二步:實現