⑴ android如何存儲一個ArrayList數組到本地
ArrayListlist=newArrayList();
SharedPreferencespreferences=getSharedPreferences("base64",
MODE_PRIVATE);
//創建位元組輸出流
ByteArrayOutputStreambaos=newByteArrayOutputStream();
try{
//創建對象輸出流,並封裝位元組流
ObjectOutputStreamoos=newObjectOutputStream(baos);
//將對象寫入位元組流
oos.writeObject(list);
//將位元組流編碼成base64的字元竄
Stringlist_Base64=newString(Base64.encodeBase64(baos
.toByteArray()));
Editoreditor=preferences.edit();
editor.putString("list",list_Base64);
editor.commit();
}catch(IOExceptione){
//TODOAuto-generated
}
Log.i("ok","存儲成功");
⑵ Android JNI部分得到jbytearray,java用byte[]數組進行接收。該如何實現
利用
jni
的回調機制
java層定義
native方法
private
void
aa(string
c)
{
output(c);
};
JNI層添加native數組
static
JNINativeMethod
array
=
{
{
「aa",
"(JString)V",
(void*)JNI_aa,
},
};
jni層調用注冊的方法
jclass
cls
=
(*env)->GetObjectClass(env,
log);
jmethodID
jmid
=
(*env)->GetMethodID(env,
cls,
"aa",
"(Ljava/lang/String;)V");
jstring
info
=
(*env)->NewStringUTF(env,
"out!");
(*env)->CallVoidMethod(env,log,
jmid,info);
//調用方法
//釋放string
(*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env,
info,
FALSE));
⑶ Android 怎樣用sqlite儲存byte數組
在進行Android開發過程中,我們經常會接觸到Drawable對象(官方開發文檔:A Drawable is a general abstraction for "something that can be drawn."),那麼,若要使用資料庫來進行存儲及讀取.
@Override
public void onCreate(SQLiteDatabase database) {
executeSQLScript(database, "create.sql");
}
private void executeSQLScript(SQLiteDatabase database, string dbname){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
try{
inputStream = assetManager.open(dbname);
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
String[] createScript = outputStream.toString().split(";");
for (int i = 0; i < createScript.length; i++) {
String sqlStatement = createScript[i].trim();
// TODO You may want to parse out comments here
if (sqlStatement.length() > 0) {
database.execSQL(sqlStatement + ";");
}
}
} catch (IOException e){
// TODO Handle Script Failed to Load
} catch (SQLException e) {
// TODO Handle Script Failed to Execute
}
}
⑷ Android開發之如何讀寫文件
【轉】
首先介紹如何存儲數據,顯然,要將數據從應用中輸出到文件中,必須得到一個輸出流outPutStream,然後往輸出流中寫入數據,在這里Android自帶了一個得到應用輸出流的方法
FileOutputStream fos =context.openFileOutput(「yuchao.txt」,Context.MODE_PRIVATE); (1)
其中第一個屬性為文件名,第二個屬性為讀寫模式(有關讀寫模式的說明下面將詳細闡述),
然後在文件輸出流fos中便可以寫入數據
Fos.write(「Hi,」I』m Chao Yu!」.getBytes());
用完文件輸出流之後記得關閉
fos.close();
這樣,在/data/data/packageName/file目錄下就生成了一個文件名為yuchao.txt的文件,文件中的內容為」 Hi,I』m Chao Yu!」
有關(1)中讀寫模式其實就是制定創建文件的許可權以及在讀寫的時候的方式,Android中提供了以下幾種讀寫模式
Context.MODE_PRIVATE = 0
該模式下創建的文件其他應用無權訪問,並且本應用將覆蓋原有的內容
Context.MODE_APPEND = 32768
該模式下創建的文件其他應用無權訪問,並且本應用將在原有的內容後面追加內容
Context.MODE_WORLD_READABLE = 1
該模式下創建的文件其他應用有讀的許可權
Context.MODE_WORLD_WRITEABLE = 2
該模式下創建的文件其他應用有寫的許可權
如果需要將文件設置為外部應用可以讀寫,可將讀寫模式設置為Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
一般情況下,各個應用維護的數據都在一個特定的文件夾中,即上面所提到的/data/data/packageName/file(存在於手機存儲中),但手機內存畢竟有限,所以有些情況下,我們需要往SD卡中寫入數據文件,這其實和普通的java web 應用步驟一樣,都是先創建特針對特定目錄特定文件的輸出流,然後往輸出流中寫數據,這里要注意一個方法,就是獲取SD卡根目錄的方法,隨著Android系統不斷升級,SD卡的根目錄隨時都有可能改變,Android中得到SD卡根目錄的方法是
File sdCardDir = Environment.getExternalStorageDirectory();
然後就可以進行下面的步驟
File saveFile = new File(sdCardDir, 「yuchao.txt」);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Hi,I』m ChaoYu".getBytes());
outStream.close();
值得注意的是,在往SD卡中寫數據的時候,健壯的代碼必須考慮SD卡不存在或者防寫的情況,故在寫入之前,先做判斷
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
……
}
接著,我們來學習下我們的應用程序如何讀取文件中的數據,其實就是寫的逆向過程
若要讀取應用程序默認維護的文件(即/data/data/packageName/file目錄下的文件),首先得到文件輸入流
FileInputStream istream = this.context.openFileInput(「yuchao.txt」);
然後在內存中開辟一段緩沖區
byte[] buffer = new byte[1024];
然後創建一個位元組數組輸出流
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
讀出來的數據首先放入緩沖區,滿了之後再寫到字元輸出流中
while((len=istream.read(buffer))!=-1){
ostream.write(buffer, 0, len);
}
最後關閉輸入流和輸出流
istream.close();
ostream.close();
將得到的內容以字元串的形式返回便得到了文件中的內容了,這里的流操作較多,故以一張圖片來說明,見圖1
return new String(ostream.toByteArray());
從SD卡中讀取數據與上述兩個步驟類似,故不再贅述,留給讀者自己思考
如在開發過程中進行SD卡地讀寫,切忌忘了加入許可權
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
至此,Android系統中有關文件數據的讀寫介紹完畢。
⑸ android 字元串轉byte數組
Android 字元串、byte數組與16進制數組間的轉換
<spanstyle="font-family:SimSun;font-size:14px;">//字元串轉換成16進制文字列的方法
publicStringtoHex(Stringstr){
StringhexString="0123456789ABCDEF";
byte[]bytes=str.getBytes();
StringBuilderhex=newStringBuilder(bytes.length*2);
for(inti=0;i<bytes.length;i++){
hex.append(hexString.charAt((bytes[i]&0xf0)>>4));//作用同n/16
hex.append(hexString.charAt((bytes[i]&0x0f)>>0));//作用同n
hex.append('');//中間用空格隔開
}
returnhex.toString();
}
//將16進制數組轉換為字元串
publicstaticStringdecode(Stringbytes){
StringhexString="0123456789ABCDEF";
ByteArrayOutputStreambaos=newByteArrayOutputStream(bytes.length()/2);
//將每2位16進制整數組裝成一個位元組
//for(inti=0;i<bytes.length();i+=2)
//baos.write((hexString.indexOf(bytes.charAt(i))<<4|hexString.indexOf(bytes.charAt(i+1))));
//將每3位(第3位為空格)中的前2位16進制整數組裝成一個位元組
for(inti=0;i<bytes.length();i+=3){
baos.write((hexString.indexOf(bytes.charAt(i))<<4|hexString.indexOf(bytes.charAt(i+1))));
}
returnnewString(baos.toByteArray());
}</span>
詳細
⑹ android圖片壓縮避免OOM
簡單吹下牛:很多app都會要載入圖片,但是如果不壓縮圖片就很容易OOM,
個人看來OOM 出現原因總的來說分為兩種:
一種是內存溢出(好像在扯淡,OOM本身就是內存溢出)
另一種是:圖片過大,一個屏幕顯示不完全造成,似乎也是一。。 如有錯誤純屬扯淡;
為了避免上面的情況:載入圖片的時候可以進行壓縮,上傳的時候要可以進行壓縮,在圖片不可見的時候進行回收(onDetach()),再吹一句 用了fresco+壓縮之後載入圖片完全沒問題了。
一、質量壓縮方法:
privateBitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos =newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100, baos);//質量壓縮方法,這里100表示不壓縮,把壓縮後的數據存放到baos中
intoptions =100;
while( baos.toByteArray().length /1024>100) {//循環判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮後的數據存放到baos中
options -=10;//每次都減少10
}
ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());//把壓縮後的數據baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream數據生成圖片
returnbitmap;
}
二、圖片按比例大小壓縮方法(根據Bitmap圖片壓縮)
privateBitmap comp(Bitmap image) {
ByteArrayOutputStream baos =newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100, baos);
if( baos.toByteArray().length /1024>1024) {//判斷如果圖片大於1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢出
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG,50, baos);//這里壓縮50%,把壓縮後的數據存放到baos中
}
ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts =newBitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
newOpts.inJustDecodeBounds =true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);
newOpts.inJustDecodeBounds =false;
intw = newOpts.outWidth;
inth = newOpts.outHeight;
//現在主流手機比較多是800*480解析度,所以高和寬我們設置為
floathh = 800f;//這里設置高度為800f
floatww = 480f;//這里設置寬度為480f
//縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
intbe =1;//be=1表示不縮放
if(w > h && w > ww) {//如果寬度大的話根據寬度固定大小縮放
be = (int) (newOpts.outWidth / ww);
}elseif(w < h && h > hh) {//如果高度高的話根據寬度固定大小縮放
be = (int) (newOpts.outHeight / hh);
}
if(be <=0)
be =1;
newOpts.inSampleSize = be;//設置縮放比例
//重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了
isBm =newByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);
returncompressImage(bitmap);//壓縮好比例大小後再進行質量壓縮
}
⑺ android如何顯示blob欄位求答案
android如何顯示blob方法如下:
BOLB表示二進制大對象,這種數據類型通過用來保存圖片,圖象,視頻等。
一,使用場景:
http://blog.sina.com.cn/s/blog_8cfbb99201012oqn.html
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
1,重寫構造方法
public MySQLiteOpenHelper(Context context, String name,
CursorFactory cursor, int version) {
super(context, name, cursor, version);
}
2, 創建資料庫的方法
public void onCreate(SQLiteDatabase db) {
3, 創建一個資料庫,表名:imagetable,欄位:_id、image。
db.execSQL("CREATE TABLE imagetable (_id INTEGER PRIMARY KEY AUTOINCREMENT,image BLOB)");
}
4, 更新資料庫的方法
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
5,創建助手類的實例
// CursorFactory的值為null,表示採用默認的工廠類
mySQLiteOpenHelper = new MySQLiteOpenHelper(this, "saveimage.db", null,1);
6, 創建一個可讀寫的資料庫
mydb = mySQLiteOpenHelper.getWritableDatabase();
7,將圖片轉化為點陣圖
Bitmap bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.erweima);
int size=bitmap1.getWidth()*bitmap1.getHeight()*4;
//創建一個位元組數組輸出流,流的大小為size
ByteArrayOutputStream baos=new ByteArrayOutputStream(size);
//設置點陣圖的壓縮格式,質量為100%,並放入位元組數組輸出流中 bitmap1.compress(Bitmap.CompressFormat.PNG, 100, baos);
//將位元組數組輸出流轉化為位元組數組byte[]
byte[] imagedata1=baos.toByteArray();
//將位元組數組保存到資料庫中
ContentValues cv=new ContentValues();
cv.put("_id", 1);
cv.put("image", imagedata1);
mydb.insert("imagetable", null, cv);
//關閉位元組數組輸出流
baos.close();
二,從資料庫中查詢的方法:
1,創建一個指針
Cursor cur=mydb.query("imagetable", new String[]{"_id","image"}, null, null, null, null, null);
byte[] imagequery=null;
if(cur.moveToNext()){
2,將Blob數據轉化為位元組數組imagequery=cur.getBlob(cur.getColumnIndex("image"));
}
3,將位元組數組轉化為點陣圖
Bitmap imagebitmap=BitmapFactory.decodeByteArray(imagequery, 0, imagequery.length);
iv1=(ImageView) findViewById(R.id.imageView1);
4,將點陣圖顯示為圖片
iv1.setImageBitmap(imagebitmap);