安卓http请求(二)
2018-03-14 17:45
15 查看
1.利用http请求下载图片
这个是http请求中最难的,之前仅仅是加载图片,这次是将图片下载,放在本地文件中,然后直接从本地文件中获得图片。这个不仅仅需要网络权限,还要文件读取权限,这其中就要涉及安卓动态权限分配问题(安卓6.0版本以后)。
2.准备步骤
文件读取权限以及网络权限
安装插件
3.代码编写
4.安卓6.0以上注意点
安卓6.0以上Activity编写不同,要添加动态权限分配
这个是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); } } }
相关文章推荐
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- Java发送http请求(httpUrlConnection)安卓客户端也可以使用
- 安卓Http请求(一)
- 关于安卓HTTP请求用HttpUrlConnection仍是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 安卓Http请求(三)
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 安卓自定义控件
- 安卓微信跳转页面、重定向页面空白,ios系统正常、pc正常、安卓浏览器正常。
- 安卓第三天————UI和布局介绍
- 安卓APP 汉字显示乱码解决办法
- 安卓初识基本控件_Gallery
- 安卓加载html代码片段
- 用c#开发安卓程序 (xamarin.android)
- 安卓开发中socket通信开发实例