從網路擷取圖片,資料為InputStream流對象,然後調用BitmapFactory的decodeStream()方法解碼擷取圖片。代碼如下:
private Bitmap getUrlBitmap(String url)
{
Bitmap bm;
try{
URL imageUrl=new URL(url);
HttpURLConnection conn=(HttpURLConnection)imageUrl.openConnection();
conn.connect();
InputStream is=conn.getInputStream();
//byte[] bt=getBytes(is); //注釋部分換用另外一種方式解碼
//bm=BitmapFactory.decodeByteArray(bt,0,bt.length);
bm=BitmapFactory.decodeStream(is); //如果採用這種解碼方式在低版本的API上會出現解碼問題
is.close();
conn.disconnect();
return bm;
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
結果在運行時編譯器提示: DEBUG/skia(xxx): --- decoder->decode returned false
已經確定從網路擷取的資料流沒有出現問題,而是在圖片解碼時出現錯誤。上網尋找了不少資料,也沒有得出確切的原因,不過有幾條意見值得關注。
一種說法是在android 較低版本的api中會有不少內部的錯誤,My Code運行時選擇2.1API Level 7和2.2API Level 8都會出現這個問題,而選擇2.3 API Level 9後能夠正常解碼圖片。
我的另外一種做法是換用別的解碼方式對圖片解碼,見代碼中被注釋的那倆行,使用decodeByteArray()方法在低版本的API上也能夠正常解碼,解決了這個問題。
其中getBytes(InputStream is)是將InputStream對象轉換為Byte[]的方法,具體代碼如下:
private byte[] getBytes(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();
}
byte[] bytes = baos.toByteArray();
return bytes;
}