您的位置:首页 > 理论基础 > 计算机网络

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

2012-08-24 15:56 567 查看


资源描述:

关于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

  }

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息