1.创建URL对象
2.通过URL对象调用openConnection()方法获得HttpURLConnection对象
3.HttpURLConnection对象设置其他连接属性
4.HttpURLConnection对象调用getInputStream()方法向服务器发送http请求
并获取到服务器返回的输入流
5.读取输入流,转换成String字符串
package com.example.abc.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Main2Activity extends AppCompatActivity {
private Button btn;//点击按钮访问
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
btn = findViewById(R.id.main2_btn);//绑定ID
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {//监听按钮
new Thread(new Runnable() {//创建子线程
@Override
public void run() {
getwebinfo();//把路径选到MainActivity中
}
}).start();//启动子线程
}
});
}
private void getwebinfo() {
try {
//1,找水源--创建URL
URL url = new URL("https://www.baidu.com/");//放网站
//2,开水闸--openConnection
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//3,建管道--InputStream
InputStream inputStream = httpURLConnection.getInputStream();
//4,建蓄水池蓄水-InputStreamReader
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
//5,水桶盛水--BufferedReader
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer buffer = new StringBuffer();
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
//取水--如果不为空就一直取
buffer.append(temp);
}
bufferedReader.close();//记得关闭
reader.close();
inputStream.close();
Log.e("MAIN",buffer.toString());//打印结果
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在打印的结果中看到类似这种出现网页代码的基本上就已经访问到了。
package com.example.abc.app3131;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class ImgActivity extends AppCompatActivity {
private Button btn;
private ImageView im;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_img);
im=findViewById(R.id.img_iv);
btn=findViewById(R.id.img_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImgLoadTask imgLoadTask=new ImgLoadTask(im,btn);
imgLoadTask.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
//启动
}
});
}
}
package com.example.abc.app3131;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.Button;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Administrator on 2018/3/13.
*/
public class ImgLoadTask extends AsyncTask<String,Integer,Bitmap>{
private ImageView imageView;
private Button btn;
public ImgLoadTask(ImageView im, Button btn) {
this.imageView=im;
this.btn=btn;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
btn.setEnabled(false);
btn.setText("加载完成");
}
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap bm=null;
try {
URL url=new URL(strings[0]);
//创建URL对象
HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
//使用openConnection获取HttpURLConnection对象
InputStream inputStream=httpURLConnection.getInputStream();
//输入流inputStream
bm= BitmapFactory.decodeStream(inputStream);
//图片
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bm;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);//把结果图片放到控件上
}
}
下载需要权限先将权限设置好。
按键点击下载并显示图片。
图片下载的图片网上路径。
下载下来需要放在本地文件中
创建图片所需要文件目录。
创建文件所需要的文件路径。
判断文件目录是否存在,没有创建。
判断文件是否存在,没有创建,有则返回结束。
文件不存在用URl查找。
判断返回值是否是200,错误返回返回值。
创建缓存区将文件下载到文件路径中。
显示图片
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>`
compile 'com.master.android:permissionhelper:1.4'
有PermissionHelper 的地方就是权限所需的条件
package com.example.abc.app3141;
import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.master.permissionhelper.PermissionHelper;
public class MainActivity extends AppCompatActivity {
private Button btn;
private ImageView img;
private PermissionHelper permissionHelper;
private String filename = "http://img03.sogoucdn.com/app/a/100520093/e18d20c94006dfe0-9eef65073f0f6be0-893885322f6eaef864e687f1df8bc129.jpg";
//图片路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();//绑定ID
permissionHelper = new PermissionHelper(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
permissionHelper.request(new PermissionHelper.PermissionCallback() {
@Override
public void onPermissionGranted() {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {//赋予权限可以上网,和使用本地
DownloadTask task=new DownloadTask(MainActivity.this, btn, img);//新建
//(上下文,按钮,图片)
task.execute(filename, "5n1.jpg");//启动
//(网上路径,下载到本地时的图片名称)
}
});
}
@Override
public void onIndividualPermissionGranted(String[] grantedPermission) {
}
@Override
public void onPermissionDenied() {
}
@Override
public void onPermissionDeniedBySystem() {
}
});
}
private void bindID() {
btn = findViewById(R.id.main_btn);
img = findViewById(R.id.main_img);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissionHelper != null) {
permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
package com.example.abc.app3141;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Administrator on 2018/3/14.
*/
public class DownloadTask extends AsyncTask<String, Integer, Integer> {
private String dirpath;//下载文件的目录 例如:c/wenjian 具体到文件所在地
private String filepath;//文件存储的具体路径 例如:c/wenjian/123.jpg 具体到文件到在哪
private Context context;//上下文环境
private Button btn;
private ImageView img;
public DownloadTask(Context context, Button btn, ImageView img) {//构造方法
this.context = context;
this.btn = btn;
this.img = img;
}
@Override
protected Integer doInBackground(String... strings) {
String filename = strings[1];//将MainActivity中的第二个文件名赋给filename
dirpath = Environment.getExternalStorageDirectory() + "/download_picture/";
//把外部环境+要开创的新的路径赋给dirpath
File dir = new File(dirpath);//创建一个新 File 实例。
if (!dir.exists()) {//判断dir是否存在
//不存在就创建空目录
dir.mkdir();
}
filepath = dirpath + filename;//filepath是详细地址=文件路径+文件名(filename=string【1】)
File file = new File(filepath);//创建一个新 File 实例。
if (!file.exists()) {//判断文件是否存在
try {
file.createNewFile();//不存在创建新文件
} catch (IOException e) {
e.printStackTrace();
}
} else {
return -1;//不存在则返回返回值(-1=文件已存在)
}
InputStream inputStream = null;//定义一个InputStream变量 ,输入流
OutputStream outputStream = null;//定义一个InputStream变量 ,输出流
/*下载图片时--输入流是网络,输出流是本地*/
/*上传图片时--输出流是网络,输入流是本地*/
try {
URL url = new URL(strings[0]);//创建URL对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//用openConnection获取HttpURLConnection对象
if (connection.getResponseCode() == 200) {
//判断返回值是否为200(200为正常值,404为客户端错误,505为服务器错误)
inputStream = connection.getInputStream();
} else {
return -2;//错误则返回返回值(-2=网络错误)
}
outputStream = new FileOutputStream(file);//输出流到本地
int length = 0;//下载总量
byte[] buffer = new byte[4 * 1024];//缓存区(4*1204=4k)
while ((length = inputStream.read(buffer)) != -1) {
//下载一直持续到最后一波正好结束再返回时发现没东西时结束(或者有空余)。
outputStream.write(buffer, 0, length);
//输入流写缓存区内容,从0到总长度
}
inputStream.close();//关闭输入流
outputStream.close();//关闭输出流
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 1;//返回值设为1(1=下载完成)
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer) {//使用switch语句对几个不同的返回值做回应
case 1:
//(1=下载完成)
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();//把状态都Toast出来
Bitmap bitmap = BitmapFactory.decodeFile(filepath);//将filepath(图片详细路径)从本地图库调用出来
img.setImageBitmap(bitmap);//把值赋给控件
//下载完成显示图片
break;
case -1:
//(-1=文件已存在)
Toast.makeText(context, "文件已存在", Toast.LENGTH_SHORT).show();
Bitmap bm = BitmapFactory.decodeFile(filepath);
img.setImageBitmap(bm);
break;
case -2:
//(-2=网络错误)
Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show();
break;
}
}
}