您的位置:首页 > 理论基础 > 计算机网络

安卓http请求(二)

2018-03-14 17:45 15 查看
1.利用http请求下载图片

这个是http请求中最难的,之前仅仅是加载图片,这次是将图片下载,放在本地文件中,然后直接从本地文件中获得图片。这个不仅仅需要网络权限,还要文件读取权限,这其中就要涉及安卓动态权限分配问题(安卓6.0版本以后)。

2.准备步骤

文件读取权限以及网络权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


安装插件

compile 'com.master.android:permissionhelper:1.3'


3.代码编写

package com.example.ll.skt;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
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 ll on 2018/3/14.
*/

public class DownLoad extends AsyncTask<String, Integer, Integer> {
private String dirPath;//下载图片的目录 例如/root/pic/
private String filePath;//下载存储的位置 例如/root/pic/a.jpg

private Context context;
private ImageView imageView;

public DownLoad(Context context, ImageView imageView) {
this.context = context;
this.imageView = imageView;
}

@Override
protected Integer doInBackground(String... strings) {
//耗时操作
String fileName = strings[1];//要存储图片的名字

//判断目录是否存在
dirPath = Environment.getExternalStorageDirectory() + "/download_pics/";

File dir = new File(dirPath);//目录对象
if (!dir.exists()) {
dir.mkdir();
}

//判断文件是否存在,若不存在,创建文件
filePath = dirPath + strings[1];
File file = new File(filePath);//创建文件对象
if (file.exists()) {
return -1;//已存在下载
} else {
try {
file.createNewFile();//不存在,创建出这个文件
} catch (IOException e) {
e.printStackTrace();
}
}

//输入流、输出流
InputStream inputStream = null;
OutputStream outputStream = null;

try {
//创建URL对象
URL url = new URL(strings[0]);
//通过URL对象得到HttpURLConnection
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//判断返回码是否正常,如果正常创建输入流,否则直接返回
if (httpURLConnection.getResponseCode() == 200) {
//得到输入流
inputStream = httpURLConnection.getInputStream();
} else {
return -2;
}
outputStream = new FileOutputStream(file);
int length = 0;
byte[] buffer = new byte[4 * 1024];//缓存区
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return 1;//下载完成
}

@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer) {
case 1:
//下载完成
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();
Bitmap bm = BitmapFactory.decodeFile(filePath);
imageView.setImageBitmap(bm);
break;
case -1:
//已存在下载
Toast.makeText(context, "已存在下载", Toast.LENGTH_SHORT).show();
break;
case -2:
//网络异常
Toast.makeText(context, "网络异常", Toast.LENGTH_SHORT).show();
break;
}
}
}


4.安卓6.0以上注意点

安卓6.0以上Activity编写不同,要添加动态权限分配

package com.example.ll.skt;
import android.Manifest;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.master.permissionhelper.PermissionHelper;

public class Main2Activity extends AppCompatActivity {
private ImageView downloadiv;
private Button downbtn;
private String url="http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg";
private PermissionHelper permissionHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bindId();
downbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
permissionHelper=new PermissionHelper(Main2Activity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
permissionHelper.request(new PermissionHelper.PermissionCallback() {
@Override
public void onPermissionGranted() {
//获取到了权限
// new DownLoad(Main2Activity.this).execute(url,"tupian.jpg");与下面效果一样
DownLoad task=new DownLoad(Main2Activity.this,downloadiv);
task.execute(url,"tupian2.jpg");
}
@Override
public void onIndividualPermissionGranted(String[] grantedPermission) {
}
@Override
public void onPermissionDenied() {
}
@Override
public void onPermissionDeniedBySystem() {
}
});
}
});
}
private void bindId() {
downbtn=findViewById(R.id.download);
downloadiv=findViewById(R.id.tupian3);
}
@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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android