在AndroidManifest.xml配置网络访问权限:

  <!-- 访问网络是危险的行为 所以需要权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 设置壁纸是危险的行为 所以需要权限 -->
<uses-permission android:name="android.permission.SET_WALLPAPER" />

在 app/build.gradle 加入

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

  然后点击 sync now 下载okhttp支持包

MainActivity

package liudeli.async.okhttp2;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; import java.io.IOException;
import java.io.InputStream; import liudeli.async.R;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response; public class MainActivity extends Activity { private final static String TAG = MainActivity.class.getSimpleName(); // 图片地址
private final String PATH = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000" +
"&sec=1544714792699&di=3c2de372608ed6323f583f1c1b445e51&imgtype=0&src=http%3A%2F%2Fp" +
"2.qhimgs4.com%2Ft0105d27180a686e91f.jpg"; private ImageView imageView;
private Button bt_set_wallpaper;
private ProgressDialog progressDialog; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); imageView = findViewById(R.id.iv_image);
bt_set_wallpaper = findViewById(R.id.bt_set_wallpaper); Button bt_get_image = findViewById(R.id.bt_get_image);
bt_get_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 弹出进度条
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Download ...");
progressDialog.show(); /**
* 第一种方式下载图片 普通
*/
/*new Thread(){
@Override
public void run() {
super.run();
downloadImage1();
}
}.start();*/ /**
* 第二种方式下载图片 异步
*/
downloadImage2();
}
}); bt_set_wallpaper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != bitmap) {
try {
setWallpaper(bitmap);
Toast.makeText(MainActivity.this, "壁纸设置成功", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "壁纸设置失败", Toast.LENGTH_LONG).show();
}
}
}
});
} private Bitmap bitmap; /**
* 第一种方式
* 使用okhttp 普通下载图片
*/
private void downloadImage1() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder()
.url(PATH)
.build();
try {
Response response = client.newCall(request).execute();
InputStream inputStream = response.body().byteStream(); if (200 == response.code()) {
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
showUI(bitmap);
} else {
showUI(null);
} } catch (IOException e) {
e.printStackTrace();
showUI(null);
}
} /**
* 第二种方式
* 使用okhttp 异步下载图片
*/
private void downloadImage2() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder()
.url(PATH)
.build();
try {
Call call = client.newCall(request); // 使用client去请求 call.enqueue(new Callback() { // 回调方法,>>> 可以获得请求结果信息
@Override
public void onFailure(Call call, IOException e) {
showUI(null); // 下载失败,更新UI
} @Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream(); if (200 == response.code()) {
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
showUI(bitmap);
} else {
showUI(null);
}
}
}); } catch (Exception e) {
e.printStackTrace();
showUI(null);
}
} /**
* 显示UI 此方法是可以在 主线程 子线程 对UI操作显示的哦
* @param bitmap
*/
private void showUI(final Bitmap bitmap) {
this.bitmap = bitmap;
runOnUiThread(runnable);
} Runnable runnable = new Runnable() {
@Override
public void run() {
if (bitmap != null) { // 故意放慢两秒,模仿网络差的效果
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 设置从网上下载的图片
imageView.setImageBitmap(bitmap);
// 设置为可以点击
bt_set_wallpaper.setEnabled(true); // 关闭进度条
progressDialog.dismiss(); Toast.makeText(MainActivity.this, "下载成功", Toast.LENGTH_SHORT).show();
}
}, 2000);
} else { //失败
bt_set_wallpaper.setEnabled(false);
Toast.makeText(MainActivity.this, "下载失败,请检查原因", Toast.LENGTH_LONG).show();
// 关闭进度条
progressDialog.dismiss();
}
}
};
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/bt_get_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取图片"
android:onClick="getImage"
android:layout_marginLeft="20dp"
/> <Button
android:id="@+id/bt_set_wallpaper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置壁纸"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:enabled="false"
/> <ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt_get_image" /> </RelativeLayout>

执行结果:

Android-okhttp下载网络图片并设置壁纸的更多相关文章

  1. IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置

    原文:IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置 站点--右键属性--http头 ...

  2. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  3. android下载网络图片,设置宽高,等比缩放

    使用Picasso组件去下载图片会发现图片宽高会变形不受等比缩放控制,即使设置了图片的 scaleType,可能是对Picasso的api没有用对, Picasso.with(this.activit ...

  4. Android异步下载网络图片

    最近新做的一个项目,里面需要下载网络上的图片,并显示在UI界面上,学Android有个常识,就是Android中在主线程中没法直接更新UI的,要想更新UI必须另外开启一个线程来实现,当开启的线程完成图 ...

  5. Android-获取网络图片设置壁纸

    下载图片,设置壁纸 的代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog ...

  6. Android开发学习—— 下载网络图片

    现在几乎所有的应用都在使用网络来达到浏览的目的.对于特定领域 使用xnpp协议 像即时通讯软件.但大多数还是使用HTTP协议来交互. 网络图片查看器 HTTP协议 下载网络 图片 <Relati ...

  7. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  8. Android OkHttp文件上传与下载的进度监听扩展

    http://www.loongwind.com/archives/290.html 上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时 ...

  9. android下载网络图片并缓存

    异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ...

随机推荐

  1. java性能优化之for循环

    完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...

  2. Delphi,C语言互通脚本引擎研究

    基于大神akuma的脚本引擎. 下面是demo

  3. Java的反射技术

    什么是反射机制 Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能调用它的任意属性和方法.这种动态获取信息以及动态调用对象属性和方法的即使称为J ...

  4. Java中的逆变与协变 很直接不饶弯的讲出来了

    ```java 协变 extends只能new 辈分比自己低的家伙 List<? extends Number> list001 = new ArrayList<Integer> ...

  5. 虚函数与bind 实现设计模式的练习

    相同模式使用虚函数与bind function进行实现对比 #include "stdafx.h" #include <iostream> #include <f ...

  6. 清华大学 TUNA 协会

    https://tuna.moe/ 技术,实力,优越感,环境..,镜像

  7. NOIP2017普及组T2题解

    还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...

  8. java JNI 实现原理 (二) Linux 下如何 load JNILibrary

    在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是 ...

  9. MySQL批量修改表前缀

    error_reporting(0); $old_pre = 'tdr_'; // 原表前缀 $new_pre = 'db_'; // 新表前缀 // 配置连接 $db = new mysqli('1 ...

  10. if结构和逻辑运算符

    一 :if选择结构 语法结构: 01.单个if if(表达式){ 如果满足表达式 则执行的代码 } 02.if(表达式) else if(表达式){ 如果满足表达式 则执行的代码 }else{ 不满足 ...