在main.xml上,我们需要放入ImageView、Button、EditText这样三个控件,到时候,我们点击按钮的时候就可以从editText中获取刚才我们获取的地址字符串,并通过一系列操作获取图片数据,再通过ImageView的setImageBitmap(bitmap)方法在界面上把图片显示出来。以下是详细代码,我一行一行给大家解读一下
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class GetNetImageActivity extends Activity { //声明三个控件
private TextView address;
private Button show;
private ImageView pic;
String path=”http://images.chinagate.cn/attachement/jpg/site1020/20100313/000cf1a487860d0567ba40.jpg”;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//实例化三个控件
address=(TextView)findViewById(R.id.textview);
show=(Button)findViewById(R.id.showImage);
pic=(ImageView)findViewById(R.id.iamgeview);
//设置button的点击事件,一点击就可以看到图片
show.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
try{ //显示出图片需要位图对象,即星号表明的这一行,而位图对象需要用图片数据来生成,而这个数据的获得就是下面那个方法所指出的。
byte[] data =GetNetImageActivity.this. getData();
* Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
pic.setImageBitmap(bitmap);
}catch(Exception e){}
}
});
}//这个方法用于获得图片的二进制数据
private byte[] getData() throws Exception {//这个path就是我们的那张图片的网络地址,URL就像是我们使用浏览器时候的那个地址栏对象,他包装了网址对象。
URL url = new URL(path);//调用URL对象的.openConnection() 返回一个HttpURLConnection 对象http
HttpURLConnection http = (HttpURLConnection) url.openConnection();//设置访问延时时间秒数,一般要在5秒以内。否则程序可能会出现错误
http.setConnectTimeout(3000);//设置请求的方法,我们可以用GET方法,也可以用POST方法
http.setRequestMethod(“GET”); //调用http的关键方法:getInputStream(),这个getInputStream()方法用来获取网络资源文件的流对象,比如我们现在做的实验室获取图片,那么getInputStream()方法就给我们图片数据流
InputStream in = http.getInputStream();//我们刚才获得了图片数据流,还不能马上转化成我们要显示的图片,而是需要进行转换,这个转换方法封装在getDta()这个方法里面,这个getData()方法需要我们传入InputStream对象,并返回一个byte[] 对象,我们接下来看看这个getData()方法
byte[] b = GetNetImageActivity.this. getByte(in);
return b;
}
public byte[] getByte(InputStream i ) throws IOException{//字节数组输出流,这个流就是起到缓冲的作用,
ByteArrayOutputStream out = new ByteArrayOutputStream();//构造一个字节数组,这个字节数组的大小是1024个字节,用于让输入流读取数据到其中 byte[] buffer = new byte[1024];//这个len起到监督货物有没有搬运完的作用。如果没有搬运完,则len不会小于0,否则等于-1,当等于-1的时候,就表达货物搬运完成
int len = 0;//i.read()方法表示把流读到字节数组中,返回的是读取到的内容的长度,在这个while里面我们判断len的数值大小,当len不小于0的时候,我们就一直搬运货物,直到小于0我们才不搬
while((len=i.read(buffer))!=-1){//在一边读的时候,我们就一边写,即调用输出流的write()方法,把数据读到内存里面,读多少,写多少,意思是每次搬运buffer这样容量的货物。
out.write(buffer,0,len);
}
i.close();
return out.toByteArray();
}
}