項目中常會遇到的工具類 總結(jié)留存
首先Activity的抽象類 BaseActivity
/*** Activity 基類* @author KrisLight**/
public abstract class BaseActivity extends Activity {private static final String TAG = BaseActivity.class.getSimpleName(); /*** 消息類型默認(rèn)Default*/public static int MSGTYPE_DEFAULT = 0;/*** 消息類型為Info*/public static int MSGTYPE_INFO = 1;/*** 消息類型為Warning*/public static int MSGTYPE_WARNING = 2;/*** 消息類型為Error*/public static int MSGTYPE_ERROR = 3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}/**初始化**/protected abstract void init();/** 初始化監(jiān)聽器**/protected abstract void initListener();/** 得到字符串資源 **/public String getResStr(int id){return this.getResources().getString(id);}/** 短暫顯示Toast提示(來自res) **/protected void showShortToast(int resId) {Toast.makeText(this, getString(resId), Toast.LENGTH_SHORT).show();}/** 短暫顯示Toast提示(來自String) **/protected void showShortToast(String text) {Toast.makeText(this, text, Toast.LENGTH_SHORT).show();}/** 長時間顯示Toast提示(來自res) **/protected void showLongToast(int resId) {Toast.makeText(this, getString(resId), Toast.LENGTH_LONG).show();}/** 長時間顯示Toast提示(來自String) **/protected void showLongToast(String text) {Toast.makeText(this, text, Toast.LENGTH_LONG).show();}/** Debug輸出Log日志 **/protected void showLogDebug(String tag, String msg) {Log.d(tag, msg);}/** Error輸出Log日志 **/protected void showLogError(String tag, String msg) {Log.e(tag, msg);}/** 通過Class跳轉(zhuǎn)界面 **/protected void startActivity(Class<?> cls) {startActivity(cls, null);}/** 含有Bundle通過Class跳轉(zhuǎn)界面 **/protected void startActivity(Class<?> cls, Bundle bundle) {Intent intent = new Intent();intent.setClass(this, cls);if (bundle != null) {intent.putExtras(bundle);}if(intent.resolveActivity(getPackageManager()) != null){startActivity(intent);}else{showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());}overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);}/** 通過Action跳轉(zhuǎn)界面 **/protected void startActivity(String action) {Intent intent = new Intent();intent.setAction(action);if(intent.resolveActivity(getPackageManager()) != null){startActivity(intent);}else{showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());}}/**含有Date通過Action跳轉(zhuǎn)界面**/protected void startActivity(String action,Uri data) {Intent intent = new Intent();intent.setAction(action);intent.setData(data);if(intent.resolveActivity(getPackageManager()) != null){startActivity(intent);}else{showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());}}/** 含有Bundle通過Action跳轉(zhuǎn)界面 **/protected void startActivity(String action, Bundle bundle) {Intent intent = new Intent();intent.setAction(action);if (bundle != null) {intent.putExtras(bundle);}if(intent.resolveActivity(getPackageManager()) != null){startActivity(intent);}else{showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());}overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);}/** 含有標(biāo)題、內(nèi)容、兩個按鈕的對話框 **/protected void showAlertDialog(String title, String message,String positiveText,DialogInterface.OnClickListener onPositiveClickListener,String negativeText,DialogInterface.OnClickListener onNegativeClickListener) {AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title).setMessage(message).setPositiveButton(positiveText, onPositiveClickListener).setNegativeButton(negativeText, onNegativeClickListener).create();alertDialog.show();}/** 含有標(biāo)題、內(nèi)容、圖標(biāo)、兩個按鈕的對話框 **/protected void showAlertDialog(String title, String message,int icon, String positiveText,DialogInterface.OnClickListener onPositiveClickListener,String negativeText,DialogInterface.OnClickListener onNegativeClickListener) {AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title).setMessage(message).setIcon(icon).setPositiveButton(positiveText, onPositiveClickListener).setNegativeButton(negativeText, onNegativeClickListener).create();alertDialog.show();}/*** * @Function: com.light.mycal.base.BaseActivity* @Description:根據(jù)不同的信息類型彈出不同等級的對話框** @param i 資源id* @param iMsgType 信息類型** @version:v1.0* @author:KrisLight* @date:2013/9/4 下午4:56:39** Modification History:* Date Author Version Description* -----------------------------------------------------------------* 2013/9/4 KrisLight v1.0.0 create*/public void ShowMsgResStr(int i, int iMsgType){String sTitle = getResStr(R.string.app_name);int iconId = 0;if (iMsgType == MSGTYPE_INFO){sTitle = getResStr(R.string.msgTypeInfo);iconId = R.drawable.msgicon_info;}if (iMsgType == MSGTYPE_WARNING){sTitle = getResStr(R.string.msgTypeWarning);iconId = R.drawable.msgicon_warning;}if (iMsgType == MSGTYPE_ERROR){sTitle = getResStr(R.string.msgTypeError);iconId = R.drawable.msgicon_error;} AlertDialog.Builder dlg = new AlertDialog.Builder(this); dlg.setMessage(getResStr(i));dlg.setPositiveButton(getResStr(R.string.msgBoxButtonOk), null); dlg.setTitle(sTitle); dlg.setIcon(iconId); dlg.create();dlg.show();}/** 帶有右進(jìn)右出動畫的退出 **/public void finish() {super.finish();overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);}/** 默認(rèn)退出 **/protected void defaultFinish() {super.finish();}
}
配置文件工具Prefs
public class Prefs {/** Friend+'s Preference file name */public static final String PREF_FILE = "friends_plus_pref";/** Preference key[authToken] */public static final String KEY_AUTH_TOKEN = "auth_token";/** Preference key[clientId] */public static final String KEY_CLIENT_ID = "client_id";/** Preference key[login_email] */public static final String KEY_LOGIN_EMAIL = "login_email";/** Preference key[login_IMId] */public static final String KEY_LOGIN_IMID = "login_imid";/** Preference key[login_name] */public static final String KEY_LOGIN_NAME = "login_name";/** Preference key[last_update_contact_list] */public static final String KEY_LAST_UPDATE_CONTACT_LIST = "last_update_contact_list";public static final String KEY_REGISTRATION_STEP = "registration_step";public static final String REGISTRATION_STEP_AUTHENTICATE = "authenticate";public static final String KEY_REGISTRATION_AUTHEN_CODE = "authen_code";/*** get the app's preference data* * @param context* @param prefKey preference key* @return*/public static String getPreference(Context context, String prefKey) {return getPreference(context, prefKey, "");}/*** get the app's preference data* * @param context* @param prefKey preference key* @param defVal default value* @return*/public static String getPreference(Context context, String prefKey, String defVal) {if (TextUtils.isEmpty(prefKey))return null;SharedPreferences prefs = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);return prefs.getString(prefKey, defVal);}/*** write data to app's preference* * @param context* @param prefKey* @param prefValue*/public static void savePreference(Context context, String prefKey, String prefValue) {if (TextUtils.isEmpty(prefKey))return;SharedPreferences.Editor editor = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE).edit();editor.putString(prefKey, prefValue).commit();}/*** remove preference value from app's preference file* @param context* @param prefKey*/public static void removePreference(Context context, String prefKey){if (TextUtils.isEmpty(prefKey))return;SharedPreferences.Editor editor =context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE).edit();editor.remove(prefKey).commit();}}
DBHelper類
/*** DB工具類* @author KrisLight**/
public class DatabaseOpenHelper extends SQLiteOpenHelper
{private static final String TAG = DatabaseOpenHelper.class.getSimpleName();/** 數(shù)據(jù)庫操作結(jié)果 **/public enum Result{/** 成功 **/Success,/**未知錯誤**/errUnknown,/**無法插入新數(shù)據(jù)**/errCantInsertNewData, /**無法更新數(shù)據(jù)**/errCantUpdateData, /**無法創(chuàng)建Table**/errCantCreateTable, /**無法訪問數(shù)據(jù)庫**/errNoDbAccess,/**無法從表中獲取數(shù)據(jù)**/errCantGetDataFromTable, /**無法查到數(shù)據(jù)**/errCantFindData,/**無法得到數(shù)據(jù)**/errCantGetData, /**無法刪除數(shù)據(jù)**/errCantDeleteData,/**表不存在**/errTableNotExists,/**不能為該字段指定值**/errCantSetValuesForDataRow,/**不能從該字段得到值**/errCantGetValuesFromDataRow,};/** 表名 **/public static final String TABLE_NAME = "appointments";/** 臨時表名 **/public static final String TEMP_TABLE_NAME = "tempDb";/** 數(shù)據(jù)庫名 **/private static final String DB_NAME = "MyCal.db";private SQLiteDatabase db = null;/** 版本號 **/private static final int DB_VERSION = 1;/**創(chuàng)建Table的結(jié)果**/private Result resultDbTablesCreated = Result.errUnknown; public DatabaseOpenHelper(Context context, String name, CursorFactory factory,int version) {super(context, DB_NAME, factory, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {DataRow nDataRow = new NoteDataRow();String create_sql = getSqlTableDefinition(nDataRow.GetTableName(), nDataRow.GetTableDef());Log.d(TAG, "create_sql: ---------------------"+create_sql+ "------------");try{sqLiteDatabase.execSQL(create_sql);resultDbTablesCreated = DatabaseOpenHelper.Result.Success; }catch (Exception e) {resultDbTablesCreated = DatabaseOpenHelper.Result.errCantCreateTable; }}/*** 得到創(chuàng)建表的SQL語句* @param sTableName 表名* @param vecTableDef 表的字段數(shù)組* @return*/public String getSqlTableDefinition(String sTableName, DataField[] vecTableDef){String def = "CREATE TABLE " + sTableName + " (";for (int i = 0; i < vecTableDef.length; i++){def += vecTableDef[i].GetColumnDefinition();if (i < (vecTableDef.length - 1))//中間逗號分隔def += ", ";} def += ")";return def;}/* (non-Javadoc)* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (newVersion) {case 2:/** only add column on old table**/
// String add_column_sql = getSqlTableAddColumn(TABLE_NAME,newColumn);
// Log.d(TAG, "add_column_sql:--------------"+add_column_sql+"----------");
// db.execSQL(add_column_sql);
// break;case 3://原來的字段集合List<String> columns = getColumns(db, TABLE_NAME);String rename_sql = getSqlTableRename(TABLE_NAME);Log.d(TAG, "rename_sql:--------------"+rename_sql+"----------");//重命名db.execSQL(rename_sql);//創(chuàng)建新表onCreate(db);//舊字段和新的字段求交集columns.retainAll(getColumns(db, TABLE_NAME));String cols = Utils.join(columns, ",");//將舊的數(shù)據(jù)插入到新表 db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TABLE_NAME, cols, cols, TABLE_NAME));String drop_sql = getSqlTableDrop(TEMP_TABLE_NAME);Log.d(TAG, "drop_sql:--------------"+drop_sql+"----------");db.execSQL(drop_sql);break;default:String ds = getSqlTableDrop(TABLE_NAME);Log.d(TAG, "drop_sql:--------------"+ds+"----------");break;}}/*** 得到重命名SQL*/private String getSqlTableRename(String tableName){StringBuffer sb = new StringBuffer();sb.append("ALTER TABLE ");sb.append(tableName);sb.append(" RENAME TO temp_");sb.append(tableName);return sb.toString();}/*** 得到刪除表SQL*/private String getSqlTableDrop(String tableName){StringBuffer sb = new StringBuffer();sb.append("DROP TABLE IF EXISTS ");sb.append(tableName);return sb.toString();}/*** 得到新增字段的表SQL*/private String getSqlTableAddColumn(String tableName,String columnName){StringBuffer sb = new StringBuffer();sb.append("ALTER TABLE ");sb.append(tableName);sb.append(" ADD COLUMN ");sb.append(columnName);return sb.toString();}/*** 得到這個Table中的所有字段組成的List集合*/public static List<String> getColumns(SQLiteDatabase db, String tableName) {List<String> ar = null;Cursor c = null;try {//查一條數(shù)據(jù)得到所有字段c = db.rawQuery("select * from " + tableName + " limit 1", null);if (c != null) {ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));}} catch (Exception e) {e.printStackTrace();} finally {if (c != null)c.close();}return ar;}/*** 得到數(shù)據(jù)庫的名字* */public final String getName(){return DB_NAME;}/** 得到錯誤信息描述 **/public static int getErrDesc(Result result){int msgId = R.string.errUnknown;if (result == Result.errCantInsertNewData)msgId = R.string.errCantInsertNewData;if (result == Result.errCantUpdateData)msgId = R.string.errCantUpdateData;if (result == Result.errCantCreateTable)msgId = R.string.errCantCreateTable;if (result == Result.errNoDbAccess)msgId = R.string.errNoDbAccess;if (result == Result.errCantGetDataFromTable)msgId = R.string.errCantGetDataFromTable;if (result == Result.errCantFindData)msgId = R.string.errCantFindData;if (result == Result.errCantGetData)msgId = R.string.errCantGetData;if (result == Result.errCantDeleteData)msgId = R.string.errCantDeleteData;if (result == Result.errTableNotExists)msgId = R.string.errTableNotExists;if (result == Result.errCantSetValuesForDataRow)msgId = R.string.errCantSetValuesForDataRow;if (result == Result.errCantGetValuesFromDataRow)msgId = R.string.errCantGetValuesFromDataRow; return msgId;}/**關(guān)閉DB**/public void close(){if (isOpened())db.close();}/**判斷DB是否打開**/public boolean isOpened(){if (db != null)return true;return false;}/**得到DB寫操作類 **/public SQLiteDatabase getWriteSQLiteDb(){return getWritableDatabase();}/**得到DB讀操作類 **/public SQLiteDatabase getReadSQLiteDb(){return getReadableDatabase();}/**查詢Table是否存在**/public boolean isTableExists(String sTableName){boolean bResult = false;if (isOpened()){String sql = "select name from sqlite_master where type = 'table' and name = '%s'"; sql = String.format(sql, sTableName); Cursor cr = db.rawQuery(sql, null); if (cr.getCount() > 0)bResult = true;cr.close();}return bResult;}/** 建表是否成功 **/public boolean TablesCreated(){return resultDbTablesCreated == Result.Success; }/** 判斷DB是否準(zhǔn)備好了**/public synchronized boolean DatabaseReady(){return (isOpened() && TablesCreated());}/** 返回創(chuàng)建表的結(jié)果 是成功還是失敗 **/public Result TablesCreationResult(){return resultDbTablesCreated; }}
表中字段類DataField
/*** 表中的字段類* @author KrisLight*/
public class DataField
{//types /** Type枚舉 如:INT,TEXT,BOOL**/public static enum Type { INT, TEXT, BOOL };//fields /** Calendar實例 **/private Calendar dateOut = Calendar.getInstance();//fields /** 對應(yīng)的數(shù)據(jù)類型 **/private DataRow dataRow = null;/** 對應(yīng)字段的值 **/private ContentValues values = null;//fields/**字段索引**/private int index = 0;/** ContentValues存放鍵值對的鍵值 **/private String sName = "";/** 字段類型 從Type枚舉中取一個類型的值 默認(rèn)為Int **/private Type FieldType = Type.INT;/**是否可以為空**/private boolean bCanBeNull = true;/**是否是主鍵**/private boolean bPrimaryKey = false;//methods/*** 構(gòu)造方法 * @param index 索引* @param sName 字段名* @param FieldType 字段類型* @param bCanBeNull 是否為空* @param bPrimaryKey 是否為主鍵*/public DataField(int index, String sName, Type FieldType, boolean bCanBeNull, boolean bPrimaryKey){this.index = index;this.sName = sName;this.FieldType = FieldType;this.bCanBeNull = bCanBeNull;this.bPrimaryKey = bPrimaryKey;}/*** 得到每一個字段描述 形如: "name int PRIMARY KEY Not Null"* @return*/public String GetColumnDefinition(){String s = sName + " " + GetSqlType(FieldType);if (bPrimaryKey)s += " PRIMARY KEY";if (!bCanBeNull)s += " NOT NULL";return s;}public Type GetType(){return FieldType;}public int GetIndex(){return index;}/** 根據(jù)SqlType返回真實的類型字段 注意BOOL對應(yīng)的是Integer 其他類型的用Text **/public String GetSqlType(Type value){switch (value){case INT: return "INTEGER";case TEXT: return "TEXT";case BOOL: return "INTEGER";}return "TEXT";}/** 設(shè)置這個字段對應(yīng)的數(shù)據(jù)類型 **/public void SetParentRow(DataRow dataRow){this.dataRow = dataRow;this.values = this.dataRow.GetContentValues();}/** 得到字段的名字 **/public String GetName(){return sName;}//getters/** 字符串類型的字段的值 **/public String asString(){return values.getAsString(sName);}/** Long類型的字段的值 **/public long asLong(){return values.getAsLong(sName);}/** Boolean類型的字段的值 **/public boolean asBoolean(){return (values.getAsLong(sName) == 1);}/** 判斷是否為Null **/public boolean isNull(){return (values.get(sName) == null); }/** 將Long類型的日期類型轉(zhuǎn)換成標(biāo)準(zhǔn)的日期時間 **/public Calendar asCalendar(){dateOut.setTimeInMillis(values.getAsLong(sName));return dateOut; }//setters/** 設(shè)置字符串值 **/public void set(String value){ values.put(sName, value);}/** 設(shè)置整型值 **/public void set(long value){ values.put(sName, value);} /** 設(shè)置布爾值 **/public void set(boolean value){int i = (value)?1:0;values.put(sName, i); } /** 設(shè)置日期值 **/public void set(Calendar value){values.put(sName, value.getTimeInMillis());}/** 設(shè)置Null值 **/public void setNull(){values.put(sName, (String)null);}}
數(shù)據(jù)原型類DataRow
/*** 抽象的數(shù)據(jù)類型類,* 所有的數(shù)據(jù)原型都要繼承這個類* @author KrisLight**/
public abstract class DataRow
{/** 這個類型對應(yīng)表中的字段集合 **/private DataField[] vecTableDef = null;/** 這個類型對應(yīng)表中的字段的值 用ContentValues形式存放 **/private ContentValues values = new ContentValues();/** 構(gòu)造方法 **/public DataRow(){}/*** 設(shè)置字段集合并綁定* @param vecTableDef 字段集合*/public void SetTableDefinition(DataField[] vecTableDef){this.vecTableDef = vecTableDef; UpdateDataFieldsParentRow(this);}/** 將數(shù)據(jù)類型綁定其對應(yīng)的所有字段 **/public void UpdateDataFieldsParentRow(DataRow row){for (int i = 0; i < vecTableDef.length; i++)vecTableDef[i].SetParentRow(row);}/** 拷貝另一個DataRow中的所有字段 **/public void CopyTableDefinition(DataRow data){ SetTableDefinition(data.vecTableDef); }/** 得到表中的所有字段 **/public DataField[] GetTableDef(){return vecTableDef;}/** 驗證方法 **/public boolean Validate(){return false;}/** 清空ContentValues **/public void ClearContentValues(){values.clear();}/** 得到ContentValues **/public ContentValues GetContentValues(){return values;}/** 設(shè)置ContentValues **/public void SetContentValues(ContentValues values){this.values = values;UpdateDataFieldsParentRow(this);}/** 拷貝ContentValues **/public boolean CopyContentValues(ContentValues values){this.values = values;UpdateDataFieldsParentRow(this);try{GetValuesFromDataRow();return true;} catch (Exception e) {} return false;}/** 根據(jù)索引取出字段 **/public DataField Value(int idx){return vecTableDef[idx];}/** 得到索引位置的字段名 **/public String fieldName(int idx){return vecTableDef[idx].GetName(); } /** 查詢結(jié)果 遍歷Cursor結(jié)果集給對應(yīng)的字段賦值 **/public boolean GetValuesFromCursor(Cursor cr){if ((cr != null) && (cr.getPosition() != -1)){//遍歷for (int idx = 0; idx < vecTableDef.length; idx++){DataField field = Value(idx);//check if null valueif (cr.isNull(idx)){//如果查出的值為空 ,設(shè)置為空field.setNull();} else {//根據(jù)其對應(yīng)的類型取值final DataField.Type t = field.GetType();//parse value by typeif (t == DataField.Type.INT)field.set(cr.getLong(idx));if (t == DataField.Type.TEXT)field.set(cr.getString(idx));if (t == DataField.Type.BOOL)field.set((cr.getInt(idx) == 1)?true:false);} }return true;}return false;}//sets fields values data (ContentValues values contener) from parent object fields/** 為字段賦值 **/public abstract void SetValuesForDataRow();//gets data from fields values (ContentValues values contener) to parent object fields/** 得到這個數(shù)據(jù)類型對應(yīng)的所有的字段的值 **/public abstract void GetValuesFromDataRow();/** 得到表名 **/public abstract String GetTableName(); }
Table類
/*** 數(shù)據(jù)庫中的表類 包含了該表對應(yīng)的數(shù)據(jù)類型以及對表的增刪改查操作方法* @author KrisLight*/
public class DataTable
{/** 這個表綁定的數(shù)據(jù)類型 **/private DataRow dataRow = null;/** DB輔助類 **/private DatabaseOpenHelper helper;/*** 更據(jù)DataRow來決定是哪一個Table* @param dataRow*/public DataTable(DataRow dataRow,DatabaseOpenHelper helper){this.dataRow = dataRow;this.helper = helper;}/** 得到表名 **/public String getTableName(){return dataRow.GetTableName();}//DataRow getter()public DataRow getDataRow(){return dataRow;}/** 基本的插入操作 **/public long insertValues(){long lRowId = helper.getWritableDatabase().insert(getTableName(), null, dataRow.GetContentValues());return lRowId; }/** 基本的根據(jù)ID更新操作 **/public long updateValues(long lRowId){String sWhere = String.format("_ID = %d", lRowId);long lRowsUpdated = helper.getWritableDatabase().update(getTableName(), dataRow.GetContentValues(), sWhere, null);return lRowsUpdated;}/** 基本的根據(jù)ID刪除操作 **/public long deleteDataRow(long lRowId){String sWhere = String.format("_ID = %d", lRowId);long lRowsUpdated = helper.getWritableDatabase().delete(getTableName(), sWhere, null);return lRowsUpdated;}/** 基本的根據(jù)Id查詢表中的所有字段值 **/public Cursor locateDataRow(long lRowId){List<String> columnNames = getColumn();String cols = Utils.join(columnNames, ",");final String s = "select %s from %s where _ID = %d"; String sql = String.format(s, cols, getTableName(), lRowId);Cursor cr = helper.getReadableDatabase().rawQuery(sql, null);//if cursor valid, set first data row as currentif ((cr != null) && (cr.getCount() > 0))cr.moveToFirst();return cr;}/** 基本的根據(jù)類型和REF_ID查詢鬧鈴提醒功能表的所有字段數(shù)據(jù) **/public Cursor locateAlarmDataRow(int iType, long lRefID){List<String> columnNames = getColumn();String cols = Utils.join(columnNames, ",");final String s = "select %s from %s where Type = %d and RefID = %d"; String sql = String.format(s, cols, getTableName(), iType, lRefID);Cursor cr = helper.getReadableDatabase().rawQuery(sql, null);if ((cr != null) && (cr.getCount() > 0))cr.moveToFirst();return cr;} /*** 封裝的saveOrUpdate操作* @param bInsertMode 是否是插入模式 為true的話是插入新的數(shù)據(jù) 為false則直接更新舊數(shù)據(jù)* @param lEditRowId ID* @return*/public DatabaseOpenHelper.Result updateData(boolean bInsertMode, long lEditRowId){DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;if (helper.isOpened()){ try{//為字段賦值dataRow.SetValuesForDataRow();} catch (Exception e) {//異常就拋出錯誤信息 不能為數(shù)據(jù)類型的字段賦值return DatabaseOpenHelper.Result.errCantSetValuesForDataRow; }//select update modeif (bInsertMode){//insert new data rowlong lRowId = insertValues();if (lRowId > 0){//插入成功result = DatabaseOpenHelper.Result.Success;} else {//插入失敗result = DatabaseOpenHelper.Result.errCantInsertNewData;}} else {//update existing data rowlong lRowsUpdated = updateValues(lEditRowId);if (lRowsUpdated == 1){//更新成功result = DatabaseOpenHelper.Result.Success;} else {//更新失敗result = DatabaseOpenHelper.Result.errCantUpdateData;} }} else { result = DatabaseOpenHelper.Result.errNoDbAccess;}return result;}/** 封裝的根據(jù)Id刪除 **/public DatabaseOpenHelper.Result deleteData(long iRowId){ DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;if (helper.isOpened()){ if (helper.isTableExists(getTableName())){long lRowsDeleted = deleteDataRow(iRowId);if (lRowsDeleted == 1){result = DatabaseOpenHelper.Result.Success;} else {result = DatabaseOpenHelper.Result.errCantDeleteData;}} else {result = DatabaseOpenHelper.Result.errTableNotExists;}} else { result = DatabaseOpenHelper.Result.errNoDbAccess;}return result; }/** 封裝的根據(jù)ID查詢數(shù)據(jù) **/public DatabaseOpenHelper.Result getRowDataForEdit(long lRowId){DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;//get requested data rowCursor cr = locateDataRow(lRowId);if (cr == null){//如果返回為空 結(jié)果為errCantGetDataresult = DatabaseOpenHelper.Result.errCantGetData;} else {if (cr.getCount() > 0){if (dataRow.GetValuesFromCursor(cr)){try{dataRow.GetValuesFromDataRow();} catch (Exception e) {return DatabaseOpenHelper.Result.errCantGetValuesFromDataRow; } result = DatabaseOpenHelper.Result.Success;} else {//無法從表中取出數(shù)據(jù)result = DatabaseOpenHelper.Result.errCantGetDataFromTable; }//關(guān)閉光標(biāo)cr.close();} else {//無法找到數(shù)據(jù)result = DatabaseOpenHelper.Result.errCantFindData;}}return result;}/** 得到這個表中的所有字段 **/public List<String> getColumn() {List<String> ar = new ArrayList<String>();try {DataField[] fields = dataRow.GetTableDef();for(DataField f : fields){ar.add(f.GetName());}} catch (Exception e) {e.printStackTrace();} return ar;}
}
安裝程序類Installating
public class Installation {private static String sID = null;private static final String INSTALLATION = "INSTALLATION";public synchronized static String id(Context context) {if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION);try {if (!installation.exists()){writeInstallationFile(installation, context);}sID = readInstallationFile(installation);} catch (Exception e) {//throw new RuntimeException(e);}}return sID;}private static String readInstallationFile(File installation) throws IOException {RandomAccessFile f = new RandomAccessFile(installation, "r");byte[] bytes = new byte[(int) f.length()];f.readFully(bytes);f.close();return new String(bytes);}private static void writeInstallationFile(File installation, Context context) throws IOException {FileOutputStream out = new FileOutputStream(installation);String id = "";try{id = Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);id+=id;}catch(Exception e){id = UUID.randomUUID().toString();}out.write(id.getBytes());out.close();}
}
獲取資源類SearchResource
public class SearchResource {public static int getDrawableResId(Context cnt, String name) throws NotFoundException {int resid = 0;resid = cnt.getResources().getIdentifier(name, "drawable", cnt.getPackageName());if (resid == 0)resid = cnt.getResources().getIdentifier( "transparent_background", "drawable", cnt.getPackageName());return resid;}public static int getStringResId(Context cnt, String name) throws NotFoundException {int resid = 0;resid = cnt.getResources().getIdentifier(name, "string", cnt.getPackageName());if (resid == 0)resid = cnt.getResources().getIdentifier("empty_string", "string", cnt.getPackageName());return resid;}public static int getLayoutResId(Context cnt, String name) throws NotFoundException {int resid = 0;resid = cnt.getResources().getIdentifier(name, "layout", cnt.getPackageName());if (resid == 0)resid = cnt.getResources().getIdentifier("empty_layout","layout", cnt.getPackageName());return resid;}public static int getItemResId(Context cnt, String name) throws NotFoundException {int resid = cnt.getResources().getIdentifier(name, "id", cnt.getPackageName());return resid;}public static int getAnimResId(Context cnt, String name) throws NotFoundException {int resid = cnt.getResources().getIdentifier(name, "anim", cnt.getPackageName());return resid;}public static int getAttrResId(Context cnt, String attrName) throws NotFoundException {int resid = cnt.getResources().getIdentifier(attrName, "attr", cnt.getPackageName());return resid;}public static int getStyleResId(Context cnt, String attrName) throws NotFoundException {int resid = cnt.getResources().getIdentifier(attrName, "style", cnt.getPackageName());return resid;}public static int getMenuResId(Context cnt, String name) throws NotFoundException {int resid = cnt.getResources().getIdentifier(name, "menu", cnt.getPackageName());return resid;}public static int[] getStyleableArray(Context cnt, String name) {return null;}
}
發(fā)送短信類SendMessage
public class SendMessage {private static final String TAG = "SendMessage";private Context m_contect;private ArrayList<HashMap<String, Object>> m_ContactList;private ArrayList<HashMap<String, Object>> m_ContactListbuffer;private String m_strMessageContent;private int m_intMessageSendCount=0;private int m_intMessageSendTotalParts;private int m_intMessageSendParts;public static final String SENT = "com.commez.psmd.SMS_SENT"; public static final String DELIVERED = "com.commez.psmd.SMS_DELIVERED"; private ArrayList<String> m_phoneList;private ListView m_ltvDialogContactList;private CustomDialogAdapter m_DialogAdapter;private Dialog dialog;private boolean m_isSendCancel;private static Handler m_handler = new Handler();private BroadcastReceiver m_bcrSend;private BroadcastReceiver m_bcrDelivred;public SendMessage(Context context, ArrayList<HashMap<String, Object>> contactList, String messageContent){this.m_contect = context;this.m_strMessageContent = messageContent;m_ContactListbuffer = new ArrayList<HashMap<String,Object>>(contactList);m_isSendCancel = false;fillPhoneNumber();}public void startSendMessage(){showSendingListDialog();registerBroadCastReceivers();m_intMessageSendCount = 0;sendSMS(m_phoneList.get(m_intMessageSendCount).toString(), m_strMessageContent); }private void fillPhoneNumber(){if(m_ContactListbuffer!=null){m_ContactList = new ArrayList<HashMap<String,Object>>();HashMap<String , Object> temp; for(int j=0; j<m_ContactListbuffer.size(); j++){temp=new HashMap<String, Object>(); if(m_ContactListbuffer.get(j).get("name")!=null) temp.put("name", m_ContactListbuffer.get(j).get("name").toString()); if(m_ContactListbuffer.get(j).get("number")!=null)temp.put("number", m_ContactListbuffer.get(j).get("number").toString()); if(m_ContactListbuffer.get(j).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(j).get("contentid").toString()); if(j==m_intMessageSendCount)temp.put("sendstatus", "sending"); elsetemp.put("sendstatus", "unsend"); m_ContactList.add(temp); }m_phoneList = new ArrayList<String>();for(int i=0; i<m_ContactList.size(); i++){m_phoneList.add(m_ContactList.get(i).get("number").toString());}}}private void sendNextMessage(){if(thereAreSMSToSend()){//m_phoneList.//m_DialogAdapter.notifyDataSetChanged(); /*if(m_ContactList!=null)m_ContactList.clear();HashMap<String , Object> temp; for(int j=0; j<m_ContactListbuffer.size(); j++){temp=new HashMap<String, Object>(); if(m_ContactListbuffer.get(j).get("name")!=null) temp.put("name", m_ContactListbuffer.get(j).get("name").toString()); if(m_ContactListbuffer.get(j).get("number")!=null)temp.put("number", m_ContactListbuffer.get(j).get("number").toString()); if(m_ContactListbuffer.get(j).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(j).get("contentid").toString()); if(j<m_intMessageSendCount)temp.put("sendstatus", "sent"); else if(j==m_intMessageSendCount)temp.put("sendstatus", "sending"); elsetemp.put("sendstatus", "unsend"); m_ContactList.add(j,temp); }*/HashMap<String , Object> temp =new HashMap<String, Object>(); if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null) temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString()); temp.put("sendstatus", "sending"); m_ContactList.set(m_intMessageSendCount,temp); sendSMS(m_phoneList.get(m_intMessageSendCount).toString(), m_strMessageContent);m_DialogAdapter.notifyDataSetChanged(); }else{Toast.makeText(m_contect, "All SMS have been sent",Toast.LENGTH_SHORT).show();dialog.dismiss();unRegisterBroadCastReceivers();}}private void unRegisterBroadCastReceivers() {m_contect.unregisterReceiver(m_bcrSend);m_contect.unregisterReceiver(m_bcrDelivred); }private boolean thereAreSMSToSend(){return m_intMessageSendCount < m_phoneList.size();}private void sendSMS(String strPhoneNumber, String message){SmsManager sms = SmsManager.getDefault();ArrayList<String> parts = sms.divideMessage(message);m_intMessageSendTotalParts = parts.size();ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();PendingIntent sentPI = PendingIntent.getBroadcast(m_contect, 0, new Intent(SENT), 0);PendingIntent deliveredPI = PendingIntent.getBroadcast(m_contect, 0, new Intent(DELIVERED), 0);for(int j=0; j<m_intMessageSendTotalParts; j++){sentIntents.add(sentPI);deliveryIntents.add(deliveredPI);}m_intMessageSendParts = 0;/**************************************************************//* SystemClock.sleep(50);m_intMessageSendParts++;if(m_intMessageSendParts == m_intMessageSendTotalParts){m_intMessageSendCount++;sendNextMessage();m_DialogAdapter.notifyDataSetChanged(); }/******************************************************************/// sms.sendMultipartTextMessage(strPhoneNumber, null, parts, sentIntents, deliveryIntents);//m_handler.removeCallbacks(updatTimer);//m_handler.postDelayed(updatTimer, 3000);}private Runnable updatTimer = new Runnable() {public void run() {if(m_intMessageSendCount<m_ContactList.size()){HashMap<String , Object> temp =new HashMap<String, Object>(); if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null) temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString()); temp.put("sendstatus", "sent"); m_ContactList.set(m_intMessageSendCount,temp); m_intMessageSendCount++;sendNextMessage();}}};private void registerBroadCastReceivers() {IntentFilter intentFilter = new IntentFilter(SENT);m_bcrSend = new BroadcastReceiver() {@Overridepublic void onReceive(Context arg0, Intent arg1) {switch(getResultCode()){case Activity.RESULT_OK:m_intMessageSendParts++;if(m_intMessageSendParts == m_intMessageSendTotalParts && !m_isSendCancel){HashMap<String , Object> temp =new HashMap<String, Object>(); if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null) temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString()); temp.put("sendstatus", "sent"); m_ContactList.set(m_intMessageSendCount,temp); m_intMessageSendCount++;sendNextMessage();} //Toast.makeText(m_contect, "SMS sent",Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(m_contect, "Generic failure",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(m_contect, "No service",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(m_contect, "No PDU",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_RADIO_OFF:Toast.makeText(m_contect, "Radio off",Toast.LENGTH_SHORT).show();break; } } };m_contect.registerReceiver(m_bcrSend, intentFilter); IntentFilter intentFilter1 = new IntentFilter(DELIVERED);m_bcrDelivred = new BroadcastReceiver() {@Overridepublic void onReceive(Context arg0, Intent arg1) {switch(getResultCode()){case Activity.RESULT_OK:break;case Activity.RESULT_CANCELED:break;} } };m_contect.registerReceiver(m_bcrDelivred, intentFilter1); /*m_contect.registerReceiver(new BroadcastReceiver(){@Overridepublic void onReceive(Context arg0, Intent arg1) {switch(getResultCode()){case Activity.RESULT_OK:m_intMessageSendParts++;if(m_intMessageSendParts == m_intMessageSendTotalParts && !m_isSendCancel){HashMap<String , Object> temp =new HashMap<String, Object>(); if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null) temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString()); if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString()); temp.put("sendstatus", "sent"); m_ContactList.set(m_intMessageSendCount,temp); m_intMessageSendCount++;sendNextMessage();} //Toast.makeText(m_contect, "SMS sent",Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(m_contect, "Generic failure",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(m_contect, "No service",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(m_contect, "No PDU",Toast.LENGTH_SHORT).show();break; case SmsManager.RESULT_ERROR_RADIO_OFF:Toast.makeText(m_contect, "Radio off",Toast.LENGTH_SHORT).show();break; } } }, new IntentFilter(SENT));m_contect.registerReceiver(new BroadcastReceiver(){@Overridepublic void onReceive(Context arg0, Intent arg1) {switch(getResultCode()){case Activity.RESULT_OK:break;case Activity.RESULT_CANCELED:break;} } }, new IntentFilter(DELIVERED)); */}private void showSendingListDialog() {LayoutInflater factory = LayoutInflater.from(m_contect);View dialogView = factory.inflate(R.layout.sms_send_list, null);m_ltvDialogContactList = (ListView) dialogView.findViewById(R.id.lv_sendlist);setDialogAdapter();TextView dialogContent = (TextView) dialogView.findViewById(R.id.dialog_sendlist_content);dialogContent.setText(R.string.dtl_SendList);Button rightButton = (Button) dialogView.findViewById(R.id.dialog_sendlist_rightbtn);rightButton.setText(R.string.dmg_SendBackground);Button leftButton = (Button) dialogView.findViewById(R.id.dialog_sendlist_leftbtn);leftButton.setText(R.string.dmg_SendCancel);rightButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});leftButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});dialog = new Dialog(m_contect);dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);dialog.setCancelable(false);dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));dialog.setContentView(dialogView);dialog.show();/*dialog = new AlertDialog.Builder(m_contect).setTitle(R.string.dtl_SendList).setView(dialogView).setPositiveButton(R.string.dmg_SendCancel, new DialogInterface.OnClickListener() { @Overridepublic void onClick(DialogInterface dialog, int which) {m_isSendCancel = true;unRegisterBroadCastReceivers();}}).setNegativeButton(R.string.dmg_SendBackground, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).create();dialog.show();*/}private void setDialogAdapter() {m_DialogAdapter = new CustomDialogAdapter(m_contect, R.layout.sms_send_list_item, m_ContactList); m_ltvDialogContactList.setAdapter(m_DialogAdapter);}private class CustomDialogAdapter extends ArrayAdapter<HashMap<String, Object>> { public CustomDialogAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) { super(context, textViewResourceId, Strings); } private class ViewHolder{ TextView txvContact;TextView txvSendStatus;ProgressBar prgbSend;} ViewHolder viewHolder; @Override public View getView(final int position, View convertView, ViewGroup parent) { if(convertView==null){ LayoutInflater inflater = (LayoutInflater) m_contect.getSystemService( Context.LAYOUT_INFLATER_SERVICE );convertView = inflater.inflate(R.layout.sms_send_list_item, null); viewHolder=new ViewHolder(); viewHolder.txvContact=(TextView) convertView.findViewById(R.id.txvSendlistitem_name); viewHolder.txvSendStatus=(TextView) convertView.findViewById(R.id.txvSendlistitem_status); viewHolder.prgbSend=(ProgressBar) convertView.findViewById(R.id.pb_sending); convertView.setTag(viewHolder); } viewHolder=(ViewHolder) convertView.getTag(); viewHolder.txvContact.setText(m_ContactList.get(position).get("number").toString()); String isSend = m_ContactList.get(position).get("sendstatus").toString();if(isSend=="sent"){viewHolder.prgbSend.setVisibility(View.GONE);viewHolder.txvSendStatus.setVisibility(View.VISIBLE);viewHolder.txvSendStatus.setText(R.string.dmg_Sent);}else if(isSend=="sending"){viewHolder.prgbSend.setVisibility(View.VISIBLE);viewHolder.txvSendStatus.setVisibility(View.GONE);}else if(isSend=="unsend"){viewHolder.prgbSend.setVisibility(View.GONE);viewHolder.txvSendStatus.setVisibility(View.VISIBLE);viewHolder.txvSendStatus.setText(R.string.dmg_SendWait);}return convertView; } } /*public static void sendMessage(Context context, String strAddress, String strMessage){try { Uri smsUri = Uri.parse("tel:123456");Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);intent.putExtra("sms_body", "");intent.setType("vnd.android-dir/mms-sms"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);} catch (ActivityNotFoundException e) {Log.e(TAG, "Send SMS failed", e);}}*/}
時間字符串處理類1:
public class C_DateUtils {private static final String TAG = C_DateUtils.class.getSimpleName();/*** check date is today* @param date* @return*/public static boolean isToday(Date date){return isSameDate(new Date(), date);}/*** check Date is same day* @param baseDate* @param thenDate* @return*/public static boolean isSameDate(Date baseDate, Date thenDate){Time time = new Time();time.set(thenDate.getTime());int thenYear = time.year;int thenMonth = time.month;int thenMonthDay = time.monthDay;time.set(baseDate.getTime());return (thenYear == time.year)&& (thenMonth == time.month)&& (thenMonthDay == time.monthDay);}/*** caculate day counts between startDate and endDate* @param startDate* @param endDate* @return*/public static int diffDays(Date startDate, Date endDate){return (int)((endDate.getTime() - startDate.getTime()) / DateUtils.DAY_IN_MILLIS);}/*** caculate week counts between startDate and endDate* @param startDate* @param endDate* @return*/public static int diffWeeks(Date startDate, Date endDate){return (int)((endDate.getTime() - startDate.getTime()) / DateUtils.WEEK_IN_MILLIS);}/*** caculate month counts between startDate and endDate* @param startDate* @param endDate* @return*/public static int diffMonths(Date startDate, Date endDate){Time startTime = new Time();startTime.set(startDate.getTime());Time endTime = new Time();endTime.set(endDate.getTime());int diffYears = endTime.year - startTime.year;return diffYears * 12 + endTime.month - startTime.month;}/*** caculate year counts between startDate and endDate* @param startDate* @param endDate* @return*/public static int diffYears(Date startDate, Date endDate){Time startTime = new Time();startTime.set(startDate.getTime());Time endTime = new Time();endTime.set(endDate.getTime());int diffYears = endTime.year - startTime.year;return diffYears;}/*** return date is Saturday or Sunday* @param date* @return*/public static boolean isWeekend(Date date){Time time = new Time();time.set(date.getTime());return (time.weekDay == Time.SATURDAY || time.weekDay == Time.SUNDAY);}}
時間字符串處理類2:
/*** 工具類* @author KrisLight**/
public class Utils
{/*** 透明度動畫變化持續(xù)時間*/public static int ANIM_ALPHA_DURATION = 100;/*** 平移動畫持續(xù)時間*/public static int ANIM_TRANSLATE_DURATION = 30; /*** 周別格式 EEEE*/private SimpleDateFormat dateFormatWeekDay = new SimpleDateFormat("EEEE");/*** 月份格式 MMMM*/private SimpleDateFormat dateFormatMonth = new SimpleDateFormat("MMMM");/*** 包括年,月,日,周的日期格式 EEEE, d MMMM yyyy*/private SimpleDateFormat dateFormatLong = new SimpleDateFormat("EEEE, d MMMM yyyy");/*** 包括年,月,日的日期格式 dd-MM-yyyy*/private SimpleDateFormat dateFormatShort = new SimpleDateFormat("dd-MM-yyyy");/*** Sql中的日期格式 dd-MM-yyyy kk:mm.ss*/private SimpleDateFormat dateFormatSql = new SimpleDateFormat("dd-MM-yyyy kk:mm.ss");//UTILSpublic Utils(){}/*** 得到周別的日期字符串 */public String GetWeekDay(Calendar date){return dateFormatWeekDay.format(date.getTime());}/*** 得到月的日期字符串 */public String GetMonth(Calendar date){return dateFormatMonth.format(date.getTime());}/*** 得到包括年,月,日,周的日期格式字符串 */public String GetLongDate(Calendar date){return dateFormatLong.format(date.getTime());}/*** 得到包括年,月,日的日期格式字符串 */public String GetShortDate(Calendar date){return dateFormatShort.format(date.getTime());}/*** * @Function: pl.magot.vetch.ancal.Utils.GetLongTime* @Description: 得到時和分** @param date 日期* @param b24HourMode 是否24小時制: true 是 false 否* @return 由小時和分鐘組成的字符串 如: 12:20** @version:v1.0* @author:KrisLight* @date:2013/9/4 下午4:51:27** Modification History:* Date Author Version Description* -----------------------------------------------------------------* 2013/9/4 KrisLight v1.0.0 create*/public String GetLongTime(Calendar date, boolean b24HourMode){String s = "";if (b24HourMode){//k: 24 小時制的小時 M: 小時中的分鐘s = String.format("%tk:%tM", date, date);} else { //l: 12 小時制的小時 M: 小時中的分鐘if (date.get(Calendar.AM_PM) == 0) //AM s = String.format("%tl:%tM am", date, date, date.get(Calendar.AM_PM));if (date.get(Calendar.AM_PM) == 1) //PM s = String.format("%tl:%tM pm", date, date, date.get(Calendar.AM_PM));}return s; }/*** * @Function: pl.magot.vetch.ancal.Utils.SqlStrToDate* @Description: 將用Sql語句查出來的日期字符串轉(zhuǎn)換成對應(yīng)的日期Date** @param s sql format: "dd-MM-yyyy kk:mm.ss"* @param dateOut 轉(zhuǎn)換成功的日期* @param dateFail 轉(zhuǎn)換失敗默認(rèn)的日期* @return** @version:v1.0* @author:KrisLight* @date:2013/9/4 下午5:07:40** Modification History:* Date Author Version Description* -----------------------------------------------------------------* 2013/9/4 KrisLight v1.0.0 create*/public static Calendar SqlStrToDate(String s, Calendar dateOut, Calendar dateFail){if (s.length() == 19){int dd = Integer.parseInt(s.substring(0, 2));int MM = Integer.parseInt(s.substring(3, 5));int yyyy = Integer.parseInt(s.substring(6, 10));int kk = Integer.parseInt(s.substring(11, 13));int mm = Integer.parseInt(s.substring(14, 16));int ss = Integer.parseInt(s.substring(17, 19));// set(int year, int month, int day, int hourOfDay, int minute, int second) 這裡月從0開始 1月對應(yīng)的是0dateOut.set(yyyy, MM - 1, dd, kk, mm, ss);return dateOut;}return dateFail; }/*** * @Function: pl.magot.vetch.ancal.Utils.DateToSqlStr* @Description:將日期轉(zhuǎn)換成SQL中需要的日期格式** @param date* @return** @version:v1.0* @author:KrisLight* @date:2013/9/4 下午5:11:29** Modification History:* Date Author Version Description* -----------------------------------------------------------------* 2013/9/4 KrisLight v1.0.0 create*/public String DateToSqlStr(Calendar date){return dateFormatSql.format(date.getTime());}/*** 將時間轉(zhuǎn)換成秒*/public static int GetTimeAsSeconds(Calendar date){return (date.get(Calendar.HOUR_OF_DAY) * 3600) +date.get(Calendar.MINUTE) * 60;}/*** 清除日期*/public static void ClearCalendarTime(Calendar cal){cal.clear(Calendar.MILLISECOND);cal.clear(Calendar.SECOND);cal.clear(Calendar.MINUTE);cal.clear(Calendar.HOUR_OF_DAY);}/*** 判斷日期是否相等*/public static boolean YearDaysEqual(Calendar calDate, Calendar calDateTo){if (calDate.get(Calendar.YEAR) == calDateTo.get(Calendar.YEAR))if (calDate.get(Calendar.MONTH) == calDateTo.get(Calendar.MONTH))if (calDate.get(Calendar.DAY_OF_MONTH) == calDateTo.get(Calendar.DAY_OF_MONTH))return true;return false;}/*** 判斷前一個日期是否大於后一個*/public static boolean YearDaysGreater(Calendar calDate, Calendar calDateTo){if (calDate.get(Calendar.YEAR) >= calDateTo.get(Calendar.YEAR))if (calDate.get(Calendar.MONTH) >= calDateTo.get(Calendar.MONTH))if (calDate.get(Calendar.DAY_OF_MONTH) >= calDateTo.get(Calendar.DAY_OF_MONTH))return true;return false;}/*** 判斷前一個時間是否等於或晚於後面一個時間 * 用於設(shè)置鬧鐘的時候與當(dāng)前時間判斷* 設(shè)置的鬧鈴時間必須晚於當(dāng)前時間*/public static boolean IsTimeOverdued(Calendar calDate, Calendar calDueDate){if ((calDueDate.compareTo(calDate) == 0) || (calDueDate.compareTo(calDate) == 1))return true;return false;}//compare time: for calendar view displaypublic static boolean IsInTimeRange(Calendar calDateStart, Calendar calDate, int iDurationInMinutes){if (calDate.get(Calendar.HOUR_OF_DAY) == calDateStart.get(Calendar.HOUR_OF_DAY))if (calDate.get(Calendar.MINUTE) >= calDateStart.get(Calendar.MINUTE))if (calDate.get(Calendar.MINUTE) <= (calDateStart.get(Calendar.MINUTE) + iDurationInMinutes))return true;return false;} /*** 將時間轉(zhuǎn)換成long類型 形如: 200712122359*/public static long GetDateTimeKey(Calendar calDate){long lYear = calDate.get(Calendar.YEAR) * 100000000;long lMonth = calDate.get(Calendar.MONTH) * 1000000;long lDay = calDate.get(Calendar.DAY_OF_MONTH) * 10000;long lHour = calDate.get(Calendar.HOUR_OF_DAY) * 100;long lMinute = calDate.get(Calendar.MINUTE);return lYear + lMonth + lDay + lHour + lMinute;}/*** 首字母大寫*/public static String CapitalizeFirstLetter(String sText){return sText.substring(0,1).toUpperCase() + sText.substring(1, sText.length()).toLowerCase();}/*** 得到App版本*/public static String getAppVersionName(Context ctx){try{PackageInfo pi = ctx.getPackageManager().getPackageInfo("pl.magot.vetch.ancal", 0);return pi.versionName;} catch (NameNotFoundException e) {}return "";}/*** * @Function: com.light.mycal.util.Utils.join* @Description: 集合中的元素以指定分隔符隔開** @param list 集合List* @param delim 分隔符* @return 用分隔符隔開的集合元素字符串** @version: v1.0* @author: KrisLight* @date: 2013/9/5 上午10:20:51** Modification History:* Date Author Version Description* -----------------------------------------------------------------* 2013/9/5 KrisLight v1.0.0 create*/public static String join(List<String> list, String delim) {StringBuilder buf = new StringBuilder();int num = list.size();for (int i = 0; i < num; i++) {if (i != 0){buf.append(delim);}buf.append((String) list.get(i));}return buf.toString();}/*** 開始alpha動畫*/public static void startAlphaAnimIn(View view){AlphaAnimation anim = new AlphaAnimation(0.5F, 1);anim.setDuration(ANIM_ALPHA_DURATION);anim.startNow();view.startAnimation(anim);}/*** 開始translate動畫*/public static void startTranslateAnimIn(View view){TranslateAnimation anim = new TranslateAnimation(0, 0, - view.getHeight(), 0);anim.setDuration(ANIM_TRANSLATE_DURATION);anim.startNow();view.startAnimation(anim);} }
圖像處理類?
1.圖像緩存
public class BitmapCache {private static final String TAG = "ImageCache";private static final int DEFAULT_MEM_CACHE_SIZE = 1024 * 1024 * 8; // 8MBprivate static final int DEFAULT_DISK_CACHE_SIZE = 1024 * 1024 * 20; // 20MB// Compression settings when writing images to disk cacheprivate static final CompressFormat DEFAULT_COMPRESS_FORMAT = CompressFormat.JPEG;private static final int DEFAULT_COMPRESS_QUALITY = 70;private static final int DISK_CACHE_INDEX = 0;// Constants to easily toggle various cachesprivate static final boolean DEFAULT_MEM_CACHE_ENABLED = true;private static final boolean DEFAULT_DISK_CACHE_ENABLED = true;private static final boolean DEFAULT_CLEAR_DISK_CACHE_ON_START = false;private static final boolean DEFAULT_INIT_DISK_CACHE_ON_CREATE = false;private LruDiskCache mDiskLruCache;private LruMemoryCache<String, Bitmap> mMemoryCache;private ImageCacheParams mCacheParams;private final Object mDiskCacheLock = new Object();private boolean mDiskCacheStarting = true;/*** Creating a new ImageCache object using the specified parameters.** @param cacheParams The cache parameters to use to initialize the cache*/public BitmapCache(ImageCacheParams cacheParams) {init(cacheParams);}/*** Initialize the cache, providing all parameters.** @param cacheParams The cache parameters to initialize the cache*/private void init(ImageCacheParams cacheParams) {mCacheParams = cacheParams;// Set up memory cacheif (mCacheParams.memoryCacheEnabled) {mMemoryCache = new LruMemoryCache<String, Bitmap>(mCacheParams.memCacheSize) {/*** Measure item size in bytes rather than units which is more practical* for a bitmap cache*/@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return BitmapCommonUtils.getBitmapSize(bitmap);}};}// By default the disk cache is not initialized here as it should be initialized// on a separate thread due to disk access.if (cacheParams.initDiskCacheOnCreate) {// Set up disk cacheinitDiskCache();}}/*** Initializes the disk cache. Note that this includes disk access so this should not be* executed on the main/UI thread. By default an ImageCache does not initialize the disk* cache when it is created, instead you should call initDiskCache() to initialize it on a* background thread.*/public void initDiskCache() {// Set up disk cachesynchronized (mDiskCacheLock) {if (mDiskLruCache == null || mDiskLruCache.isClosed()) {File diskCacheDir = mCacheParams.diskCacheDir;if (mCacheParams.diskCacheEnabled && diskCacheDir != null) {if (!diskCacheDir.exists()) {diskCacheDir.mkdirs();}if (BitmapCommonUtils.getUsableSpace(diskCacheDir) > mCacheParams.diskCacheSize) {try {mDiskLruCache = LruDiskCache.open(diskCacheDir, 1, 1, mCacheParams.diskCacheSize);} catch (final IOException e) {mCacheParams.diskCacheDir = null;Log.e(TAG, "initDiskCache - " + e);}}}}mDiskCacheStarting = false;mDiskCacheLock.notifyAll();}}/*** Adds a bitmap to both memory and disk cache.* @param data Unique identifier for the bitmap to store* @param bitmap The bitmap to store*/public void addBitmapToCache(String data, Bitmap bitmap) {if (data == null || bitmap == null) {return;}// Add to memory cacheif (mMemoryCache != null && mMemoryCache.get(data) == null) {mMemoryCache.put(data, bitmap);}synchronized (mDiskCacheLock) {if (mDiskLruCache != null && mDiskLruCache.getDirectory()!= null ) {if(!mDiskLruCache.getDirectory().exists())mDiskLruCache.getDirectory().mkdirs();final String key = FileNameGenerator.generator(data);OutputStream out = null;try {LruDiskCache.Snapshot snapshot = mDiskLruCache.get(key);if (snapshot == null) {final LruDiskCache.Editor editor = mDiskLruCache.edit(key);if (editor != null) {out = editor.newOutputStream(DISK_CACHE_INDEX);bitmap.compress(mCacheParams.compressFormat, mCacheParams.compressQuality, out);editor.commit();out.close();}} else {snapshot.getInputStream(DISK_CACHE_INDEX).close();}} catch (final IOException e) {Log.e(TAG, "addBitmapToCache - " + e);} catch (Exception e) {Log.e(TAG, "addBitmapToCache - " + e);} finally {try {if (out != null) {out.close();}} catch (IOException e) {}}}}}/*** Get from memory cache.** @param data Unique identifier for which item to get* @return The bitmap if found in cache, null otherwise*/public Bitmap getBitmapFromMemCache(String data) {if (mMemoryCache != null) {final Bitmap memBitmap = mMemoryCache.get(data);if (memBitmap != null) {return memBitmap;}}return null;}/*** @param data* @return*/public Bitmap getBitmapFromDiskCache(String data) {final String key = FileNameGenerator.generator(data);synchronized (mDiskCacheLock) {while (mDiskCacheStarting) {try {mDiskCacheLock.wait();} catch (InterruptedException e) {}}if (mDiskLruCache != null) {InputStream inputStream = null;try {final LruDiskCache.Snapshot snapshot = mDiskLruCache.get(key);if (snapshot != null) {inputStream = snapshot.getInputStream(DISK_CACHE_INDEX);if (inputStream != null) {final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;}}} catch (final IOException e) {Log.e(TAG, "getBitmapFromDiskCache - " + e);} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {}}}return null;}}/*** Clears both the memory and disk cache associated with this ImageCache object. Note that* this includes disk access so this should not be executed on the main/UI thread.*/public void clearCache() {clearMemoryCache();synchronized (mDiskCacheLock) {mDiskCacheStarting = true;if (mDiskLruCache != null && !mDiskLruCache.isClosed()) {try {mDiskLruCache.delete();} catch (IOException e) {Log.e(TAG, "clearCache - " + e);}mDiskLruCache = null;initDiskCache();}}}public void clearMemoryCache(){if (mMemoryCache != null) {mMemoryCache.evictAll();}}/*** Flushes the disk cache associated with this ImageCache object. Note that this includes* disk access so this should not be executed on the main/UI thread.*/public void flush() {synchronized (mDiskCacheLock) {if (mDiskLruCache != null) {try {mDiskLruCache.flush();} catch (IOException e) {Log.e(TAG, "flush - " + e);}}}}/*** Closes the disk cache associated with this ImageCache object. Note that this includes* disk access so this should not be executed on the main/UI thread.*/public void close() {synchronized (mDiskCacheLock) {if (mDiskLruCache != null) {try {if (!mDiskLruCache.isClosed()) {mDiskLruCache.close();mDiskLruCache = null;}} catch (IOException e) {Log.e(TAG, "close - " + e);}}}}/*** A holder class that contains cache parameters.*/public static class ImageCacheParams {public int memCacheSize = DEFAULT_MEM_CACHE_SIZE;public int diskCacheSize = DEFAULT_DISK_CACHE_SIZE;public File diskCacheDir;public CompressFormat compressFormat = DEFAULT_COMPRESS_FORMAT;public int compressQuality = DEFAULT_COMPRESS_QUALITY;public boolean memoryCacheEnabled = DEFAULT_MEM_CACHE_ENABLED;public boolean diskCacheEnabled = DEFAULT_DISK_CACHE_ENABLED;public boolean clearDiskCacheOnStart = DEFAULT_CLEAR_DISK_CACHE_ON_START;public boolean initDiskCacheOnCreate = DEFAULT_INIT_DISK_CACHE_ON_CREATE;public ImageCacheParams(File diskCacheDir) {this.diskCacheDir = diskCacheDir;}public ImageCacheParams(String diskCacheDir) {this.diskCacheDir = new File(diskCacheDir);}/*** @param context棿*/public void setMemCacheSizePercent(Context context, float percent) {if (percent < 0.05f || percent > 0.8f) {throw new IllegalArgumentException("setMemCacheSizePercent - percent must be "+ "between 0.05 and 0.8 (inclusive)");}memCacheSize = Math.round(percent * getMemoryClass(context) * 1024 * 1024);}public void setMemCacheSize(int memCacheSize) {this.memCacheSize = memCacheSize;}public void setDiskCacheSize(int diskCacheSize) {this.diskCacheSize = diskCacheSize;}private static int getMemoryClass(Context context) {return ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();}}}
圖像處理類
public class BitmapCommonUtils {private static final String TAG = "BitmapCommonUtils";/*** @param context* @return*/public static File getDiskCacheDir(Context context, String uniqueName) {final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath();return new File(cachePath + File.separator + uniqueName);}/*** @param bitmap* @return*/public static int getBitmapSize(Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}/*** @param context* @return*/public static File getExternalCacheDir(Context context) {final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);}/*** @param path* @return*/public static long getUsableSpace(File path) {try{final StatFs stats = new StatFs(path.getPath());return (long) stats.getBlockSize() * (long) stats.getAvailableBlocks();}catch (Exception e) {e.printStackTrace();return -1;}}}
圖像Decoder類
public class BitmapDecoder {private static final String TAG = "BitmapDecoder";private BitmapDecoder(){}public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;options.inPurgeable = true;BitmapFactory.decodeResource(res, resId, options);options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);options.inJustDecodeBounds = false;try {return BitmapFactory.decodeResource(res, resId, options);} catch (OutOfMemoryError e) {e.printStackTrace();return null;}}public static Bitmap decodeSampledBitmapFromFile(String filename,int reqWidth, int reqHeight) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;options.inPurgeable = true;BitmapFactory.decodeFile(filename, options);options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);options.inJustDecodeBounds = false;try {return BitmapFactory.decodeFile(filename, options);} catch (OutOfMemoryError e) {e.printStackTrace();return null;}}public static Bitmap decodeSampledBitmapFromDescriptor(FileDescriptor fileDescriptor, int reqWidth, int reqHeight) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;options.inPurgeable = true;BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);options.inJustDecodeBounds = false;try {return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);} catch (OutOfMemoryError e) {// Log.e(TAG, "decodeSampledBitmapFromDescriptor");e.printStackTrace();return null;}}public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {final int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;if (height > reqHeight || width > reqWidth) {if (width > height) {inSampleSize = Math.round((float) height / (float) reqHeight);} else {inSampleSize = Math.round((float) width / (float) reqWidth);}final float totalPixels = width * height;final float totalReqPixelsCap = reqWidth * reqHeight * 2;while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {inSampleSize++;}}return inSampleSize;}
}
圖像顯示配置類
public class BitmapDisplayConfig {private int bitmapWidth;private int bitmapHeight;private Animation animation;private int animationType;private Bitmap loadingBitmap;private Bitmap loadfailBitmap;public int getBitmapWidth() {return bitmapWidth;}public void setBitmapWidth(int bitmapWidth) {this.bitmapWidth = bitmapWidth;}public int getBitmapHeight() {return bitmapHeight;}public void setBitmapHeight(int bitmapHeight) {this.bitmapHeight = bitmapHeight;}public Animation getAnimation() {return animation;}public void setAnimation(Animation animation) {this.animation = animation;}public int getAnimationType() {return animationType;}public void setAnimationType(int animationType) {this.animationType = animationType;}public Bitmap getLoadingBitmap() {return loadingBitmap;}public void setLoadingBitmap(Bitmap loadingBitmap) {this.loadingBitmap = loadingBitmap;}public Bitmap getLoadfailBitmap() {return loadfailBitmap;}public void setLoadfailBitmap(Bitmap loadfailBitmap) {this.loadfailBitmap = loadfailBitmap;}public class AnimationType{public static final int userDefined = 0;public static final int fadeIn = 1;}}
圖像流讀取類
public class BitmapProcess {private static final String TAG = "BitmapProcess";private boolean mHttpDiskCacheStarting = true;private int cacheSize;private static final int DEFAULT_CACHE_SIZE = 20 * 1024 * 1024; // 20MBprivate LruDiskCache mOriginalDiskCache;private final Object mHttpDiskCacheLock = new Object();private static final int DISK_CACHE_INDEX = 0;private File mOriginalCacheDir;private Downloader downloader;private boolean neverCalculate = false;public BitmapProcess(Downloader downloader,String filePath,int cacheSize) {this.mOriginalCacheDir = new File(filePath+"/original");this.downloader = downloader;if(cacheSize<=0)cacheSize = DEFAULT_CACHE_SIZE;this.cacheSize = cacheSize;}public void configCalculateBitmap(boolean neverCalculate){this.neverCalculate = neverCalculate;}public Bitmap processBitmap(String data, BitmapDisplayConfig config) {final String key = FileNameGenerator.generator(data);FileDescriptor fileDescriptor = null;FileInputStream fileInputStream = null;LruDiskCache.Snapshot snapshot;synchronized (mHttpDiskCacheLock) {// Wait for disk cache to initializewhile (mHttpDiskCacheStarting) {try {mHttpDiskCacheLock.wait();} catch (InterruptedException e) {}}if (mOriginalDiskCache != null) {try {snapshot = mOriginalDiskCache.get(key);if (snapshot == null) {LruDiskCache.Editor editor = mOriginalDiskCache.edit(key);if (editor != null) {if (downloader.downloadToLocalStreamByUrl(data,editor.newOutputStream(DISK_CACHE_INDEX))) {editor.commit();} else {editor.abort();}}snapshot = mOriginalDiskCache.get(key);}if (snapshot != null) {fileInputStream = (FileInputStream) snapshot.getInputStream(DISK_CACHE_INDEX);fileDescriptor = fileInputStream.getFD();}} catch (IOException e) {Log.e(TAG, "processBitmap - " + e);} catch (IllegalStateException e) {Log.e(TAG, "processBitmap - " + e);} finally {if (fileDescriptor == null && fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {}}}}}Bitmap bitmap = null;if (fileDescriptor != null) {if(neverCalculate)bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);elsebitmap = BitmapDecoder.decodeSampledBitmapFromDescriptor(fileDescriptor, config.getBitmapWidth(),config.getBitmapHeight());}if (fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {}}return bitmap;}public void initHttpDiskCache() {if (!mOriginalCacheDir.exists()) {mOriginalCacheDir.mkdirs();}synchronized (mHttpDiskCacheLock) {if (BitmapCommonUtils.getUsableSpace(mOriginalCacheDir) > cacheSize) {try {mOriginalDiskCache = LruDiskCache.open(mOriginalCacheDir, 1, 1,cacheSize);} catch (IOException e) {mOriginalDiskCache = null;}}mHttpDiskCacheStarting = false;mHttpDiskCacheLock.notifyAll();}}public void clearCacheInternal() {synchronized (mHttpDiskCacheLock) {if (mOriginalDiskCache != null && !mOriginalDiskCache.isClosed()) {try {mOriginalDiskCache.delete();} catch (IOException e) {Log.e(TAG, "clearCacheInternal - " + e);}mOriginalDiskCache = null;mHttpDiskCacheStarting = true;initHttpDiskCache();}}}public void flushCacheInternal() {synchronized (mHttpDiskCacheLock) {if (mOriginalDiskCache != null) {try {mOriginalDiskCache.flush();} catch (IOException e) {Log.e(TAG, "flush - " + e);}}}}public void closeCacheInternal() {synchronized (mHttpDiskCacheLock) {if (mOriginalDiskCache != null) {try {if (!mOriginalDiskCache.isClosed()) {mOriginalDiskCache.close();mOriginalDiskCache = null;}} catch (IOException e) {Log.e(TAG, "closeCacheInternal - " + e);}}}}}
下載類
public interface Downloader {public boolean downloadToLocalStreamByUrl(String urlString, OutputStream outputStream);
}
public class SimpleHttpDownloader implements Downloader{private static final String TAG = "BitmapDownloader";private static final int IO_BUFFER_SIZE = 8 * 1024; //8kpublic boolean downloadToLocalStreamByUrl(String urlString, OutputStream outputStream) {HttpURLConnection urlConnection = null;BufferedOutputStream out = null;FlushedInputStream in = null;try {final URL url = new URL(urlString);urlConnection = (HttpURLConnection) url.openConnection();in = new FlushedInputStream(new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE));out = new BufferedOutputStream(outputStream, IO_BUFFER_SIZE);int b;while ((b = in.read()) != -1) {out.write(b);}return true;} catch (final IOException e) {Log.e(TAG, "Error in downloadBitmap - "+urlString +" : " + e);} finally {if (urlConnection != null) {urlConnection.disconnect();}try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (final IOException e) {}}return false;}public class FlushedInputStream extends FilterInputStream {public FlushedInputStream(InputStream inputStream) {super(inputStream);}@Overridepublic long skip(long n) throws IOException {long totalBytesSkipped = 0L;while (totalBytesSkipped < n) {long bytesSkipped = in.skip(n - totalBytesSkipped);if (bytesSkipped == 0L) {int by_te = read();if (by_te < 0) {break; // we reached EOF} else {bytesSkipped = 1; // we read one byte}}totalBytesSkipped += bytesSkipped;}return totalBytesSkipped;}}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/krislight1105/p/3748354.html
總結(jié)
以上是生活随笔 為你收集整理的常用工具类总结 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。