根据it之家的文章做的Android小demo。
http://www.ithome.com/html/win10/211310.htm
获取bing 15天前到明天壁纸,并可设置为手机壁纸。
使用 SmartImageView来加载网络图片,实际过程中遇到点小问题,当时没看源码,不知道它将缓存放哪了,在哪可以调用。
虽然imageView有函数可以获取当前显示的缓存,但是他是获取的当前屏幕所显示的规格(就像截图一样)。
好在在整个项目中它有WebImage这个类, 有函数返回Bitmap。
但是这样的话就进行了两次网络请求。。。
程序可以切换查询的地区,用listview承载。
下面是主要代码:
//设置壁纸
public void setWallpaper() {
new Thread() {
public void run() {
try {
WebImage web = new WebImage(imgRealPath);
Bitmap bmp = web.getBitmap(MainActivity.this);
Message msg = new Message();
msg.obj = bmp;
msg.what = 2;
mHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
public void Prev(View v)// 前一张
{
if (MyUtils.SelectDay == 15) {
Toast.makeText(this, "您只能预览明天到15天前的必应壁纸哦,已经到最前面的壁纸啦", 300).show();
} else {
MyUtils.SelectDay += 1;
if (MyUtils.SelectDay == 0)
Toast.makeText(this, "今天的壁纸", 300).show();
else
Toast.makeText(this, MyUtils.SelectDay + "天前的壁纸", 300).show();
}
buildPath();
}
//拼接完整的请求地址
public void buildPath() {
path = "http://test.dou.ms/bing/day/" + MyUtils.SelectDay + "/mkt/" + MyUtils.SelectCountry;
gogetImage();
}
public void Next(View v)// 后一张
{
if (MyUtils.SelectDay == -1) {
Toast.makeText(this, "您只能预览明天到15天前的必应壁纸哦,已经到明天的壁纸啦", 300).show();
} else {
MyUtils.SelectDay -= 1;
if (MyUtils.SelectDay == -1)
Toast.makeText(this, "明天的壁纸", 300).show();
else if (MyUtils.SelectDay == 0)
Toast.makeText(this, "今天的壁纸", 300).show();
else
Toast.makeText(this, MyUtils.SelectDay + "天前的壁纸", 300).show();
}
buildPath();
}
public void gogetImage() {
new Thread() {
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
String result = EncodingUtils.getString(baf.toByteArray(), "UTF-8");
String realimgpath = GetBingImageUrl(result);
int code = conn.getResponseCode();
if (code == 200) {
Message msg = new Message();
msg.obj = realimgpath;
msg.what = 1;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
// 截取字符串中 图片的地址
public static String GetBingImageUrl(String str) {
strArray = str.split("地址:");
return strArray[1];
}
在handler中更新UI
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
// 取出消息中的数据
flag++;
if (msg.what == 1) {
imgRealPath = (String) msg.obj;
iv_pic.setImageUrl(imgRealPath);
tv_desc.setText(strArray[0]);
} else if (msg.what == 2) {
WallpaperManager instance = WallpaperManager.getInstance(MainActivity.this);
int desiredMinimumWidth = getWindowManager().getDefaultDisplay().getWidth();
int desiredMinimumHeight = getWindowManager().getDefaultDisplay().getHeight();
instance.suggestDesiredDimensions(desiredMinimumWidth, desiredMinimumHeight);
Bitmap bmp = (Bitmap) msg.obj;
try {
instance.setBitmap(bmp);
Snackbar.make(fab, "设置成功", 300).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
主要记住了 设置壁纸, Snackbar的使用。
还有一点就是 在Android Studuio中 compileSdkVersion 23的话要使用 useLibrary 'org.apache.http.legacy'
不然网络请求的一些包(apche.http.utils)是找不到的