Android开发,从网上下载指定地址的图片
安卓客户端界面的图标分为两类,
一类是存在 resource中的,这类图片是固定不变的,比如app下方标题栏“消息”,“联系人”,“设置”等图标是不变,除非版本更新才可能变化。
二类是客户端请求服务器,服务器响返回相应的图片,准确说应用的大部分图片背景都是从服务器返回的。
这个demo中,涉及Bitmap类型,对于Bitmap的相关知识,小白不是特别懂,感兴趣的朋友可以深入了解以下:
关于bitmap的总结-----徐福记456
具体操作方法如下:
- 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- 新建一个类,只有一个方法用于从网上下载图片,并存储于外部存储器,返回Bitmap类型:
public static Bitmap loadPicture(String c_url){
}
httpurlPicture.java
方法内容老规矩如下:
//实例化url
URL url = new URL(c_url);
//建立http连接
HttpUrlConnection conn = (HttpUrlConnection)url.openConnection();
//设置读取超时限制,设置请求方式
conn.setReadTimeOut(5000);
conn.setRequestMethod("GET");
//获取字节流
InputStream stream = new InputStream();
//设置文件名
String filename = String.valueOf(System.currentTimeMillis);
//声明读入路径
file enterpath = null;
//声明从外界读入流,从本地读取是FileInputStream
FileOutputStream fileOutputStream = null;
//获得外存储器的状态,只有Medio_Mouted(挂载且可读可写)
if(Environment.getExternalStorState().equals(Environment.MEDIO_MOUTED)){
//获取外部存储器的目录路径
File stor_path = Environment.getExternalStorDirection();
//建立读入路径,两个参数,分别为外部目录,文件名
enterpath = new File(stor_path,filename);
//绑定读入路径的读入流
fileOutputStream = new FileOutputStream(enterpath);
}
//设置一次性读入量
int lens=0;
//建立2M大小的缓冲区
byte bytes = new byte[2*1024];
//读入流不为空时,开始进入读取
if(fileOutputStream!=null){
while((lens=stream.read(bytes)!=-1){//读入量不为空时
fileOutputStream.write(bytes,0,lens);
}
//返回 下载文件的路径的全路径的文件
return BitmapFactory.decodeFile(enterpath.getAbsolutePath);
}
- 在Activity.java文件中, 新建一个内部类,并继承AsyncTask<Void,Void,Bitmap>类,
重写 doInBackground方法,重写 onPostExecute方法,具体如下:
package com.ilikelxystill.fuxi;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class InternetPictureActivity extends AppCompatActivity {
private ImageView imageview;
private SendUrlTask sendUrlTask;
private int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_internet_picture);
init_all();
clickpituremax();
}
public void init_all(){
imageview = (ImageView)findViewById(R.id.imgview);
sendUrlTask = new SendUrlTask("http://img4.sycdn.imooc.com/5c7f636b000193f509600960-140-140.jpg");
sendUrlTask.execute();
}
//点击图片方大
public void clickpituremax(){
imageview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (i==0){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(300,
300);//两个400分别为添加图片的大小
imageview.setLayoutParams(params);
i=1;
}else{
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);//两个400分别为添加图片的大小
imageview.setLayoutParams(params);
i=0;
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (sendUrlTask!=null){
sendUrlTask.cancel(true);
}
}
private class SendUrlTask extends AsyncTask<Void,Void,Bitmap>{
private String Url;
public SendUrlTask(String c_url){
Url = c_url;
}
@Override
protected Bitmap doInBackground(Void... voids) {
return httpurlPicture.loadPicture(Url);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if(bitmap!=null) {
imageview.setImageBitmap(bitmap);
}
}
}
}
- xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".InternetPictureActivity">
<ImageView
android:id="@+id/imgview"
android:layout_gravity="center_horizontal"
android:layout_marginTop="250dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
运行后就可得到指定地址的图片,对于Bitmap的相关知识需要更细一步学习,今后开发会经常遇到,同时,有许多的优秀的网络开源框架,不需要写原生代码。学无止境,加油哦。