在学习黎活明的Android视频的时候,有一讲是说怎么从网络中获取图片。这里,我就做一个笔记和总结吧。
首先,我们要知道图片这种文件,不能以我们印象中那些基本数据类型来定义或是以这些类型从网络中获取图片。
所以我们需要用到二进制(计算机的世界就是一个二进制的世界啊。。。)数据类型。
说到网络,我们就会想网址。是的,这里,我们从网络上获取一张图片,也得知道这张图片的网址。
本用例中,我用的是写死一个图片地址,大家也可以用各种方法来把这个地址不写死,做成一个浏览的效果。
这里,我们还要用到一个位图(Bitmap)类。
在获取图片二进制时,我们首先用openConnection()打开一个图片连接;再设置请求命令将被发送到远程HTTP服务器;最后通过输入流输入图片数据。
GetImageActivity.java
package com.image.ui; import com.image.servce.ImageServce; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class GetImageActivity extends Activity { TextView textView; ImageView imageView; private final static String TAG = "GetImageActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button)this.findViewById(R.id.buttonShowImage); textView = (TextView)this.findViewById(R.id.pathName); imageView = (ImageView)this.findViewById(R.id.imageView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String path = textView.getText().toString(); try { byte[] data = ImageServce.getNetImage(path); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // 生成位图 imageView.setImageBitmap(bitmap); // 显示位图 } catch (Exception e) { // TODO Auto-generated catch block Toast.makeText(GetImageActivity.this, R.string.error, 1).show(); // 显示错误信息 Log.e(TAG, e.toString()); // 生成异常日志 } } }); } }
ImageServce.java
package com.image.servce; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.image.utils.StreamTool; public class ImageServce { private final static int ONE_SECOND = 1000; // 定义一秒 private final static String URL_HTTP = "http://a.hiphotos.bdimg.com/album/s%3D740%3Bq%3D90/sign=493c3a7f9e82d158bf825bb5b03168e5/1c950a7b02087bf492e4eb78f0d3572c11dfcf13.jpg"; public static byte[] getNetImage(String path) throws Exception { // 给定一条网络路径 URL url = new URL(URL_HTTP); HttpURLConnection huconn = (HttpURLConnection) url.openConnection(); // url用openConnection()打开连接 huconn.setRequestMethod("GET"); // 设置用GET请求命令将被发送到远程HTTP服务器 huconn.setConnectTimeout(5 * ONE_SECOND); // 设置超时时间5秒 InputStream inStream = huconn.getInputStream(); // 通过输入流输入图片数据 return StreamTool.getNetImage(inStream); } }
StreamTool.java
package com.image.utils; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class StreamTool { public static byte[] getNetImage(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; // 读取到流的末尾,返回-1 // 这里为只要还没有读到流的末尾,就一直往内存中输出二进制数据 while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } }
效果图:
这里我给出一个我上传到CSDN上的资源源码。Android程序从网络上获取一张图片【代码】