關於android獲取網絡圖片主要是把網絡圖片的數據流讀入到內存中而後用
1.Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);
方法來將圖片流傳化爲bitmap類型 這樣才能用到
1.imageView.setImageBitmap(bitMap);
來進行轉化
在獲取bitmap時候出現null
錯誤代碼:
byte[] data = GetImageForNet.getImage(path);
int length = data.length;
Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);
imageView.setImageBitmap(bitMap);
下面是 GetImageForNet.getImage()方法的代碼清單
public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection httpURLconnection = (HttpURLConnection)url.openConnection();
httpURLconnection.setRequestMethod("GET");
httpURLconnection.setReadTimeout(6*1000);
InputStream in = null;
byte[] b = new byte[1024];
int len = -1;
if (httpURLconnection.getResponseCode() == 200) {
in = httpURLconnection.getInputStream();
in.read(b);
in.close();
return b;
}
return null;
}
看起來沒有問題 獲取網絡圖片輸入流,填充二進制數組,返回二進制數組,而後使用 Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length); data就是返回的二進制數組
獲取bitMap 看起來沒有問題,但是bitMap就是爲null!
BitmapFactory.decodeByteArray方法中所須要的data不必定是傳統意義上的字節數組,查看android api,最後發現BitmapFactory.decodeByteArray所須要的data字節數組並非想象中的數組!而是把輸入流傳化爲字節內存輸出流的字節數組格式
正確代碼:
try {
byte[] data = GetImageForNet.getImage(path);
String d = new String(data);
// File file = new File("1.jpg");
//OutputStream out = new FileOutputStream(file);
//out.write(data);
//out.close();
int length = data.length;
Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);
imageView.setImageBitmap(bitMap);
//imageView.seti
} catch (Exception e) {
Log.i(TAG, e.toString());
Toast.makeText(DataActivity.this, "獲取圖片失敗", 1).show();
}
下面是改進後的 GetImageForNet.getImage()方法的代碼清單
public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection httpURLconnection = (HttpURLConnection)url.openConnection();
httpURLconnection.setRequestMethod("GET");
httpURLconnection.setReadTimeout(6*1000);
InputStream in = null;
byte[] b = new byte[1024];
int len = -1;
if (httpURLconnection.getResponseCode() == 200) {
in = httpURLconnection.getInputStream();
byte[] result = readStream(in);
in.close();
return result;
}
return null;
}
public static byte[] readStream(InputStream in) throws Exception{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = in.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
in.close();
return outputStream.toByteArray();
}java
-------------------------------------------------------------------------------------------------------------------
android寫入數據庫、讀取sqlite中的圖片
mysql
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;android
public class AndroidTestActivity extends Activity {
/** Called when the activity is first created. */
private Button btn;
private SQLiteDatabase db = null;
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
* getWritableDatabase()和getReadableDatabase()方法均可以獲取一個用於操做數據庫的SQLiteDatabase實例。
* 但getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,
* 假若使用getWritableDatabase()打開數據庫就會出錯。getReadableDatabase()方法先以讀寫方式打開數據庫,
* 若是數據庫的磁盤空間滿了,就會打開失敗,當打開失敗後會繼續嘗試以只讀方式打開數據庫。
*/
DBHelper helper = new DBHelper(AndroidTestActivity.this, "mysql1.txt");
db = helper.getWritableDatabase();web
imageView=(ImageView)findViewById(R.id.imgView);
btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(
new Button.OnClickListener()
{
public void onClick(View v)
{
String fileName="mysql.db";
AssetManager assets = getAssets();
try {
InputStream is=assets.open(fileName);
Log.v("is.length", is.available()+"");
FileOutputStream fos=new FileOutputStream(Environment.getDataDirectory()+ "/data/com.xujie.test/databases/" + "mysql1.txt");
byte[]bytes=getInput(is);
// int b=0;
// while((b=is.read())!=-1)
// {
// fos.write(b);
// }
fos.write(bytes);sql
/**
* 將數據流關閉
*/
fos.flush();
fos.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Cursor cursor= get_equipment_by_id("3");
while(cursor.moveToNext())
{
Bitmap bitmap=getIconFromCursor(cursor, cursor.getColumnIndex("icon"));數據庫
Drawable drawable=new BitmapDrawable(bitmap);
imageView.setImageDrawable(drawable);
}
}
}
);
}
public Bitmap getIconFromCursor(Cursor c, int iconIndex) {
byte[] data = c.getBlob(iconIndex);
try {api
Log.v("BitmapFactory.decodeByteArray.length000:", "BitmapFactory.decodeByteArray.length");
Log.v("BitmapFactory.decodeByteArray.length:", BitmapFactory.decodeByteArray(data, 0, data.length).getWidth()+"");
Log.v("BitmapFactory.decodeByteArray.length111:", "BitmapFactory.decodeByteArray.length");
return BitmapFactory.decodeByteArray(data, 0, data.length);
} catch (Exception e) {
return null;
}
}數組
public byte[] getInput(InputStream is) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = 0;網絡
while ((len = is.read(b, 0, 1024)) != -1)
{
baos.write(b, 0, len);
baos.flush();
}
return baos.toByteArray();
}
/**
* @name get_equipment_by_id
* @desc 設備列表
* @author liwang
* @date 2011-12-28
* @param String type 設備類型
* @return Cursor
*/
public Cursor get_equipment_by_id(String id)
{
return db.query("equipments", null, "id=?", new String[]{id} ,null, null, null);
}
class DBHelper extends SQLiteOpenHelper
{app
public DBHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public DBHelper(Context context, String name)
{
super(context, name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
// TODO Auto-generated method stub
}
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }}