项目中常会遇到的工具类 总结留存
首先Activity的抽象类 BaseActivity
/** * Activity 基類 * @author KrisLight * */ public abstract class BaseActivity extends Activity { private static final String TAG = BaseActivity.class.getSimpleName(); /** * 消息類型默認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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /**初始化**/ protected abstract void init(); /** 初始化監聽器**/ 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跳转界面 **/ protected void startActivity(Class<?> cls) { startActivity(cls, null); } /** 含有Bundle通过Class跳转界面 **/ 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跳转界面 **/ 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跳转界面**/ 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跳转界面 **/ 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); } /** 含有标题、内容、两个按钮的对话框 **/ 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(); } /** 含有标题、内容、图标、两个按钮的对话框 **/ 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:根據不同的信息類型彈出不同等級的對話框 * * @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(); } /** 带有右进右出动画的退出 **/ public void finish() { super.finish(); overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); } /** 默认退出 **/ 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(); /** 數據庫操作結果 **/ public enum Result { /** 成功 **/ Success, /**未知錯誤**/ errUnknown, /**無法插入新數據**/ errCantInsertNewData, /**無法更新數據**/ errCantUpdateData, /**無法創建Table**/ errCantCreateTable, /**無法訪問數據庫**/ errNoDbAccess, /**無法從表中獲取數據**/ errCantGetDataFromTable, /**無法查到數據**/ errCantFindData, /**無法得到數據**/ errCantGetData, /**無法刪除數據**/ errCantDeleteData, /**表不存在**/ errTableNotExists, /**不能為該字段指定值**/ errCantSetValuesForDataRow, /**不能從該字段得到值**/ errCantGetValuesFromDataRow, }; /** 表名 **/ public static final String TABLE_NAME = "appointments"; /** 臨時表名 **/ public static final String TEMP_TABLE_NAME = "tempDb"; /** 數據庫名 **/ private static final String DB_NAME = "MyCal.db"; private SQLiteDatabase db = null; /** 版本号 **/ private static final int DB_VERSION = 1; /**創建Table的結果**/ private Result resultDbTablesCreated = Result.errUnknown; public DatabaseOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, DB_NAME, factory, DB_VERSION); } @Override public 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; } } /** * 得到創建表的SQL語句 * @param sTableName 表名 * @param vecTableDef 表的字段數組 * @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) */ @Override public 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); //創建新表 onCreate(db); //舊字段和新的字段求交集 columns.retainAll(getColumns(db, TABLE_NAME)); String cols = Utils.join(columns, ","); //將舊的數據插入到新表 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 { //查一條數據得到所有字段 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; } /** * 得到數據庫的名字 * */ 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; } /**關閉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是否準備好了**/ public synchronized boolean DatabaseReady() { return (isOpened() && TablesCreated()); } /** 返回創建表的結果 是成功還是失敗 **/ 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 /** 對應的數據類型 **/ private DataRow dataRow = null; /** 對應字段的值 **/ private ContentValues values = null; //fields /**字段索引**/ private int index = 0; /** ContentValues存放鍵值對的鍵值 **/ private String sName = ""; /** 字段类型 从Type枚举中取一个类型的值 默認為Int **/ private Type FieldType = Type.INT; /**是否可以為空**/ private boolean bCanBeNull = true; /**是否是主鍵**/ private boolean bPrimaryKey = false; //methods /** * 构造方法 * @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; } /** 根據SqlType返回真實的類型字段 注意BOOL對應的是Integer 其他類型的用Text **/ public String GetSqlType(Type value) { switch (value) { case INT: return "INTEGER"; case TEXT: return "TEXT"; case BOOL: return "INTEGER"; } return "TEXT"; } /** 设置这个字段对应的数据类型 **/ 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类型的日期类型转换成标准的日期时间 **/ public Calendar asCalendar() { dateOut.setTimeInMillis(values.getAsLong(sName)); return dateOut; } //setters /** 设置字符串值 **/ public void set(String value) { values.put(sName, value); } /** 设置整型值 **/ public void set(long value) { values.put(sName, value); } /** 设置布尔值 **/ public void set(boolean value) { int i = (value)?1:0; values.put(sName, i); } /** 设置日期值 **/ public void set(Calendar value) { values.put(sName, value.getTimeInMillis()); } /** 设置Null值 **/ public void setNull() { values.put(sName, (String)null); } }
数据原型类DataRow
/** * 抽象的数据类型类, * 所有的数据原型都要继承这个类 * @author KrisLight * */ public abstract class DataRow { /** 这个类型对应表中的字段集合 **/ private DataField[] vecTableDef = null; /** 这个类型对应表中的字段的值 用ContentValues形式存放 **/ private ContentValues values = new ContentValues(); /** 構造方法 **/ public DataRow(){} /** * 設置字段集合并綁定 * @param vecTableDef 字段集合 */ public void SetTableDefinition(DataField[] vecTableDef) { this.vecTableDef = vecTableDef; UpdateDataFieldsParentRow(this); } /** 將數據類型綁定其對應的所有字段 **/ 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; } /** 設置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; } /** 根據索引取出字段 **/ public DataField Value(int idx) { return vecTableDef[idx]; } /** 得到索引位置的字段名 **/ public String fieldName(int idx) { return vecTableDef[idx].GetName(); } /** 查詢結果 遍歷Cursor結果集給對應的字段賦值 **/ 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 value if (cr.isNull(idx)) { //如果查出的值為空 ,設置為空 field.setNull(); } else { //根據其對應的類型取值 final DataField.Type t = field.GetType(); //parse value by type if (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 /** 得到這個數據類型對應的所有的字段的值 **/ public abstract void GetValuesFromDataRow(); /** 得到表名 **/ public abstract String GetTableName(); }
Table类
/** * 數據庫中的表類 包含了该表对应的数据类型以及对表的增删改查操作方法 * @author KrisLight */ public class DataTable { /** 這個表綁定的數據類型 **/ private DataRow dataRow = null; /** DB輔助類 **/ private DatabaseOpenHelper helper; /** * 更據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; } /** 基本的根據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; } /** 基本的根據ID刪除操作 **/ public long deleteDataRow(long lRowId) { String sWhere = String.format("_ID = %d", lRowId); long lRowsUpdated = helper.getWritableDatabase().delete(getTableName(), sWhere, null); return lRowsUpdated; } /** 基本的根據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 current if ((cr != null) && (cr.getCount() > 0)) cr.moveToFirst(); return cr; } /** 基本的根據類型和REF_ID查詢鬧鈴提醒功能表的所有字段數據 **/ 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的話是插入新的數據 為false則直接更新舊數據 * @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) { //異常就拋出錯誤信息 不能為數據類型的字段賦值 return DatabaseOpenHelper.Result.errCantSetValuesForDataRow; } //select update mode if (bInsertMode) { //insert new data row long lRowId = insertValues(); if (lRowId > 0) { //插入成功 result = DatabaseOpenHelper.Result.Success; } else { //插入失敗 result = DatabaseOpenHelper.Result.errCantInsertNewData; } } else { //update existing data row long lRowsUpdated = updateValues(lEditRowId); if (lRowsUpdated == 1) { //更新成功 result = DatabaseOpenHelper.Result.Success; } else { //更新失敗 result = DatabaseOpenHelper.Result.errCantUpdateData; } } } else { result = DatabaseOpenHelper.Result.errNoDbAccess; } return result; } /** 封装的根據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; } /** 封装的根據ID查詢數據 **/ public DatabaseOpenHelper.Result getRowDataForEdit(long lRowId) { DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown; //get requested data row Cursor cr = locateDataRow(lRowId); if (cr == null) { //如果返回為空 結果為errCantGetData result = 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 { //無法從表中取出数据 result = DatabaseOpenHelper.Result.errCantGetDataFromTable; } //关闭光标 cr.close(); } else { //无法找到数据 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; } }
发送短信类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"); else temp.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"); else temp.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() { @Override public 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() { @Override public 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(){ @Override public 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(){ @Override public 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() { @Override public void onClick(View v) { dialog.dismiss(); } }); leftButton.setOnClickListener(new OnClickListener() { @Override public 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() { @Override public void onClick(DialogInterface dialog, int which) { m_isSendCancel = true; unRegisterBroadCastReceivers(); }}) .setNegativeButton(R.string.dmg_SendBackground, new DialogInterface.OnClickListener() { @Override public 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 { /** * 透明度動畫變化持續時間 */ public static int ANIM_ALPHA_DURATION = 100; /** * 平移動畫持續時間 */ 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"); //UTILS public 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語句查出來的日期字符串轉換成對應的日期Date * * @param s sql format: "dd-MM-yyyy kk:mm.ss" * @param dateOut 轉換成功的日期 * @param dateFail 轉換失敗默認的日期 * @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月對應的是0 dateOut.set(yyyy, MM - 1, dd, kk, mm, ss); return dateOut; } return dateFail; } /** * * @Function: pl.magot.vetch.ancal.Utils.DateToSqlStr * @Description:將日期轉換成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()); } /** * 將時間轉換成秒 */ 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; } /** * 判斷前一個時間是否等於或晚於後面一個時間 * 用於設置鬧鐘的時候與當前時間判斷 * 設置的鬧鈴時間必須晚於當前時間 */ 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 display public 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; } /** * 將時間轉換成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; // 8MB private static final int DEFAULT_DISK_CACHE_SIZE = 1024 * 1024 * 20; // 20MB // Compression settings when writing images to disk cache private 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 caches private 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 cache if (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 */ @Override protected 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 cache initDiskCache(); } } /** * 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 cache synchronized (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 cache if (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; // 20MB private 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 initialize while (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); else bitmap = 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; //8k public 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); } @Override public 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; } } }