android获取网络图片的用法 BitmapFactory.decodeByteArray

时间:2021-10-15 22:37:41

资源描述:

关于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(); 
}


-------------------------------------------------------------------------------------------------------------------
android写入数据库、读取sqlite中的图片

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;

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();

  
        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);

        /**
         * 将数据流关闭
         */
                
             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 {

      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
 {

  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
  }
 }
}