Android实现每天更新一张图片

第一次写博客,记录一下自己学习android过程中做过的一些实例。

必应官网每天都会更新一张图片,我们可以通过这张图片的链接来获取这张图片,并让其显示在android app中。

一、图片的获取

必应提供了一个图片的接口,我们可以通过访问这个接口来获取每日更新的图片,接口链接如下所示:https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
通过浏览器访问该链接可以得到以下所示数据

{“images”:[{“startdate”:“20210124”,“fullstartdate”:“202101241600”,“enddate”:“20210125”,“url”:"/th?id=OHR.ChurchRock_ZH-CN6926315999_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",“urlbase”:"/th?id=OHR.ChurchRock_ZH-CN6926315999",“copyright”:“红石公园教堂岩附近的雷击,新墨西哥州 (© Tim Fitzharris/Minden Pictures)”,“copyrightlink”:“https://www.bing.com/search?q=%E7%BA%A2%E7%9F%B3%E5%85%AC%E5%9B%AD%E6%95%99%E5%A0%82&form=hpcapt&mkt=zh-cn”,“title”:"",“quiz”:"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20210124_ChurchRock%22&FORM=HPQUIZ",“wp”:true,“hsh”:“cdae6c57dbb4fe473dfd4f93b7870b8b”,“drk”:1,“top”:1,“bot”:1,“hs”:[]}],“tooltips”:{“loading”:“正在加载…”,“previous”:“上一个图像”,“next”:“下一个图像”,“walle”:“此图片不能下载用作壁纸。”,“walls”:“下载今日美图。仅限用作桌面壁纸。”}}

其中,url标签后的内容即为我们所需图片的地址,通过访问http://cn.bing.com+该地址就可以得到我们想要的图片,例如,上面得到的url为
/th?id=OHR.ChurchRock_ZH-CN6926315999_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
那我们访问

http://cn.bing.com/th?id=OHR.ChurchRock_ZH-CN6926315999_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp

就可以得到我们想要的图片。

二、在android上获取并显示图片

由于android自身的限制,网络操作只能在子线程中完成,这一点是我们写代码中特别需要注意的。因此我们要把访问api接口的代码写在子线程中。此外,在android中,与UI有关的操作只能在主线程或UI线程中完成,所以我们加载图片上要记得更换线程。

1.访问api接口

这里我们通过android自带的httpurlconnection来访问,并将访问得到的json返回文件存储到字符串response中。

private void sendRequestWithHttpURLConnection() {// 开启线程来发起网络请求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream in = connection.getInputStream();// 下面对获取到的输入流进行读取reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}parseJSONWithJSONObject(response.toString());// showResponse(response.toString());//Ui线程} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (connection != null) {connection.disconnect();}}}}).start();}

2.json的解析

这里我们直接通过android自带的JSONArray和JSONObject来进行json的解析,并将解析到的结果和http://cn.bing.com拼接起来,得到我们想要的图片的链接,并将其存储在字符串url1中。

private void parseJSONWithJSONObject(String jsonData) {try {// JSONArray jsonArray = new JSONArray(jsonData);JSONArray jsonArray = new JSONObject(jsonData).getJSONArray("images");for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);String url = jsonObject.getString("url");Log.d("MainActivity", "url is " + url);
String url1="http://cn.bing.com"+url;showResponse(url1);}} catch (Exception e) {e.printStackTrace();}}

3.图片的加载

利用开源框架Glide进行图片的加载。
注意,图片的加载要写在UI线程中。

private void showResponse(final String response) {runOnUiThread(new Runnable() {@Overridepublic void run() {// 在这里进行UI操作,将结果显示到界面上Glide.with(MainActivity.this).load(response).into(img);//  text.setText(response);Log.i("123",response);}});}

三、演示效果

四、源代码

1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/img"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

这部分代码比较简单,就是线性布局中加了一个imageview.

2.activity

public class MainActivity extends AppCompatActivity {TextView text;ImageView img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// text=findViewById(R.id.text);img=findViewById(R.id.img);sendRequestWithHttpURLConnection();}private void sendRequestWithHttpURLConnection() {// 开启线程来发起网络请求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream in = connection.getInputStream();// 下面对获取到的输入流进行读取reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}parseJSONWithJSONObject(response.toString());// showResponse(response.toString());//Ui线程} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (connection != null) {connection.disconnect();}}}}).start();}private void showResponse(final String response) {runOnUiThread(new Runnable() {@Overridepublic void run() {// 在这里进行UI操作,将结果显示到界面上Glide.with(MainActivity.this).load(response).into(img);//  text.setText(response);Log.i("123",response);}});}private void parseJSONWithJSONObject(String jsonData) {try {// JSONArray jsonArray = new JSONArray(jsonData);JSONArray jsonArray = new JSONObject(jsonData).getJSONArray("images");for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);String url = jsonObject.getString("url");Log.d("MainActivity", "url is " + url);
String url1="http://cn.bing.com"+url;showResponse(url1);}} catch (Exception e) {e.printStackTrace();}}}

Android实例之必应每日一图相关推荐

  1. Android 天气APP(九)细节优化、必应每日一图

    上一篇:Android 天气APP(八)城市切换 之 自定义弹窗与使用 重新定位.必应每日一图 新版------------------- 一.封装定位 二.重新定位 三.必应每日一图 ① 添加必应接 ...

  2. 轻量必应每日一图接口-前端网站源码 支持上传到又拍云调用

    简介: 众所周知,必应搜索官网每天会更新一张高质量的背景图. 许多同学想在接口中调用它们, 但必应的服务器在国内不算特别稳定(gt;500ms). Bing-upyun 可以把每天的必应图片上传至又拍 ...

  3. 必应每日一图php,自建必应每日一图API接口

    必应每日一图API接口,图片分辨率:1920*1080 调用方式   如需其他图片替换网址即可 PHP核心代码,其他的根据自己的需求修改即可<?php $str = file_get_conte ...

  4. 每天定时获取必应每日一图并保存做壁纸

    每天定时获取必应每日一图并保存做壁纸 ​ 必应每天会更新每日一图,这些图片都是特别好看,适合做封面壁纸等等.我做了一个自动脚本,让它每天定时获取每日一图,然后设置为个人主页博客的封面,封面和背景一共九 ...

  5. [Python] 抓取必应每日一图,设置为桌面壁纸

    在Windows 10 64位系统环境下,使用 Python 3.6 进行图片抓取和设置壁纸操作. 其中,图片链接 https://area.sinaapp.com/bingImg/ 为 Bing 每 ...

  6. 必应每日一图直接获取及接口

    必应官网:https://cn.bing.com/ 返回Json数据的接口 https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&am ...

  7. API 每日一图API

    推荐两个每日一图的api,都是高清无版权图片,可以作为背景等. 因为csdn的图片会转存到图床,所以展示图片仅为写文日的图片,有兴趣可以点击链接查看 1 魔图API 皓月自己整理制作的一个api接口, ...

  8. Python脚本 - 下载必应每日壁纸

    Python脚本 - 下载必应每日壁纸 必应每日壁纸可以通过链接 https://area.sinaapp.com/bingImg/ 访问,本文利用python脚本进行下载. 所需条件 操作系统:Wi ...

  9. C#获取bing每日一图的图片及图片故事(IDE为VS Code .net core)

    BingImage 获取必应每日一图及故事 获取图片api:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1 idx ...

最新文章

  1. WordPress首页调用QQ签名
  2. Swift 泛型函数补充
  3. Python3高并发定时更新任务进程池和线程池的使用
  4. 浮点数正则表达式_正则表达式的邮箱,手机号,身份证号,密码
  5. proto 指定字段json名_比json快5倍的protobuf了解一下
  6. 手把手带你写一个中断输入设备驱动
  7. linux6.5能安装的firefox,Centos6.5安装firefox
  8. 分类任务如何用逻辑回归实现_如何用逻辑回归构建金融评分卡模型?(上)
  9. MySQL数据库开发 (视频)
  10. 实例讲解如何利用jQuery设置图片居中放大或者缩小
  11. 判断php对象不包含的key,如何判断一个对象是否包含指定Key
  12. java输出各国人的问候语_世界各国问候语及发音.doc
  13. angular $element.html 数据展示不出来,element-ui Table 组件循环列表数据不显示?
  14. 百度飞桨EasyDL X 韦士肯:看轴承质检如何装上“AI之眼”
  15. 质量管理的三大概念:QA,QC,QM,你能给自己准确定位吗?
  16. 再记公式弱爆了!用 ChatGPT 将 Excel 工作效率提高 10 倍
  17. crypto加密解密
  18. (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  19. 32. Pandas借助Python爬虫读取HTML网页表格存储到Excel文件
  20. HLS / Chisel 实现CORDIC算法双曲系统

热门文章

  1. 人脑拆机三部曲:为什么我支持马斯克,而人类应该畏惧人工智能
  2. 【光学设计基础】--02球差
  3. arduino平衡车超声波_Arduino Nano DIY超声波测距平衡小车源码与资料分享
  4. 肿瘤靶向性红细胞膜包裹叶酸修饰的PLGA纳米粒|巨噬细胞膜包裹的PEG-PLGA载雷公藤红素纳米粒
  5. 淘宝/天猫盗图投诉之提交盗图申诉材料时,图片过大,如何缩小呢?
  6. 大一C语言图形界面点餐系统
  7. 微软中国正式宣布Win10政府版:专属定制安全功能
  8. 基于线性回归预测环境空气质量 代码+数据
  9. R语言dplyr包使用group_by函数和summarise函数构建频率表实战
  10. mysql leng() 与 char_length() 的区别,注意一下。