日期2018.9.12


第二部分:获取bing每日一图

通过访问   http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=5&mkt=zh-CN  可以得到一组json数据,如下:

{"images":
[{"startdate":"20180911",
"fullstartdate":"201809111600",
"enddate":"20180912",
"url":"/az/hprichbg/rb/BlackBrowed_ZH-CN11903207028_1920x1080.jpg",
"urlbase":"/az/hprichbg/rb/BlackBrowed_ZH-CN11903207028",
"copyright":"回到福克兰群岛的黑眉信天翁 (© Cultura RM/Alamy)",
"copyrightlink":"http://www.bing.com/search?q=%E9%BB%91%E7%9C%89%E4%BF%A1%E5%A4%A9%E7%BF%81&form=hpcapt&mkt=zh-cn",
"title":"",
"quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180911_BlackBrowed%22&FORM=HPQUIZ",
"wp":true,
"hsh":"12948b177d0c26492dcb1049700602ea",
"drk":1,"top":1,"bot":1,"hs":[]},
{"startdate":"20180910",
"fullstartdate":"201809101600",
"enddate":"20180911",
"url":"/az/hprichbg/rb/ShinjukuKiku_ZH-CN8446848393_1920x1080.jpg",
"urlbase":"/az/hprichbg/rb/ShinjukuKiku_ZH-CN8446848393",
"copyright":"管物菊,日本东京都新宿区 (© I love Photo and Apple./Getty images)",
"copyrightlink":"http://www.bing.com/search?q=%E7%AE%A1%E7%89%A9%E8%8F%8A&form=hpcapt&mkt=zh-cn",
"title":"","quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180910_ShinjukuKiku%22&FORM=HPQUIZ",
"wp":true,
"hsh":"c79ceca8823a08c1c93373f4b26c9996",
"drk":1,"top":1,"bot":1,"hs":[]},
{"startdate":"20180909",
"fullstartdate":"201809091600",
"enddate":"20180910",
"url":"/az/hprichbg/rb/Honeycomb_ZH-CN7204448210_1920x1080.jpg",
"urlbase":"/az/hprichbg/rb/Honeycomb_ZH-CN7204448210",
"copyright":"蜂巢 (© Heidi and Hans-Juergen Koch/Minden Pictures)",
"copyrightlink":"http://www.bing.com/search?q=%E8%9C%82%E5%B7%A2&form=hpcapt&mkt=zh-cn",
"title":"",
"quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180909_Honeycomb%22&FORM=HPQUIZ",
"wp":true,
"hsh":"956060a94d566e18964ea6aff9a7a2aa",
"drk":1,"top":1,"bot":1,"hs":[]},
{"startdate":"20180908",
"fullstartdate":"201809081600",
"enddate":"20180909",
"url":"/az/hprichbg/rb/RoyalOntarioMuseum_ZH-CN10362892998_1920x1080.jpg",
"urlbase":"/az/hprichbg/rb/RoyalOntarioMuseum_ZH-CN10362892998",
"copyright":"皇家安大略博物馆,加拿大多伦多 (© Ken Straiton/Aurora Photos)",
"copyrightlink":"http://www.bing.com/search?q=%E7%9A%87%E5%AE%B6%E5%AE%89%E5%A4%A7%E7%95%A5%E5%8D%9A%E7%89%A9%E9%A6%86&form=hpcapt&mkt=zh-cn",
"title":"",
"quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180908_RoyalOntarioMuseum%22&FORM=HPQUIZ",
"wp":false,
"hsh":"ed4c961d60ff9e9ebc17f94a4fa5e8cb",
"drk":1,"top":1,"bot":1,"hs":[]},
{"startdate":"20180907",
"fullstartdate":"201809071600",
"enddate":"20180908",
"url":"/az/hprichbg/rb/TrinityLibrary_ZH-CN10332583093_1920x1080.jpg",
"urlbase":"/az/hprichbg/rb/TrinityLibrary_ZH-CN10332583093",
"copyright":"都柏林三一学院图书馆,爱尔兰 (© Nigel Hicks/Robert Harding/Aurora Photos)",
"copyrightlink":"http://www.bing.com/search?q=%E4%B8%89%E4%B8%80%E5%AD%A6%E9%99%A2%E5%9B%BE%E4%B9%A6%E9%A6%86&form=hpcapt&mkt=zh-cn",
"title":"",
"quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180907_TrinityLibrary%22&FORM=HPQUIZ",
"wp":false,
"hsh":"e5b5bf66170be8116ecd6a6f73fb1e1e",
"drk":1,"top":1,"bot":1,"hs":[]}],
"tooltips":{
"loading":"正在加载...",
"previous":"上一个图像",
"next":"下一个图像",
"walle":"此图片不能下载用作壁纸。",
"walls":"下载今日美图。仅限用作桌面壁纸。"}}

我们看到得到JSON数据中  每个组内都一个url属性,即"url":"/az/hprichbg/rb/BlackBrowed_ZH-CN11903207028_1920x1080.jpg",我们通过这个URL就可以得到当前这个组里的图片,需要注意的事,这个URL缺少网址的前半部分,访问的时候需要加上“http://www.bing.com”,即网址为:http://www.bing.com/az/hprichbg/rb/BlackBrowed_ZH-CN11903207028_1920x1080.jpg。那么需要用到的逻辑代码就清楚了,第一步是获取到这个JSON数据;第二步是解析这个JSON数据;第三步是将得到的图片URL转成bitmap;第四步是将转化的bitmap赋值给背景图片,并将这个bitmap保存在本地,这样可以在再次打开程序的时候直接访问本地图片,不必再重复下载。

第一步:获取JSON数据

这里我使用的是HttpURLConnection进行的链接,代码如下:

    private String getData(String path){String data="";try{URL url = new URL(path);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();urlConn.setConnectTimeout(5000);urlConn.connect();if (urlConn.getResponseCode() == 200) {data = readStream(urlConn.getInputStream());Log.i("TAG", "请求成功");} else {Log.i("TAG", "数据请求失败");}urlConn.disconnect();}catch (Exception e){e.printStackTrace();}return data;}private String readStream(InputStream inputStream) throws IOException {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, len);outputStream.flush();}outputStream.close();inputStream.close();return outputStream.toString();}

第二步:解析JSON数据,得到图片URL

通过观察之前得到的JSON数据,我们可以看出,这组数据里包含了多个URL,也就是说存在多个日期的图片,而我们想得到的是当天日期的图片,因此,观察可以看出,第一个URL是最新的图片,因此在得到第一个URL数据的时候,就将这个URL返回就好了,无需再判断其他的URL,代码如下:

    private String resolveData(String data){String url="";try{JSONArray jsonArray=new JSONObject(data).getJSONArray("images");for (int i=0;i<jsonArray.length();i++){JSONObject jsonObject = (JSONObject)jsonArray.get(i);if (jsonObject.has("url")){url=jsonObject.getString("url");break;}}}catch (JSONException e){e.printStackTrace();}return url;}

第三步:将图片URL转化为bitmap

注意在URL前面加上“http://www.bing.com”,代码如下:(这里有一个问题,目前没有解决,哪位高手给指点一下:就是这个BitmapFactory.decodeStream()获取的图片是变形的,如何获取到适应屏幕,并且不变形的方法呢?)

    private Bitmap getBitmap(String path) throws IOException {URL url = new URL("http://www.bing.com"+path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if (conn.getResponseCode() == 200) {InputStream inputStream = conn.getInputStream();DisplayMetrics dm = getResources().getDisplayMetrics();//获得屏幕的宽度和高度Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(inputStream), dm.widthPixels, dm.heightPixels, true);conn.disconnect();return bitmap;}conn.disconnect();return null;}

第四步:赋值给背景图片,并将bitmap保存在本地

这步就是要获取图片了,因此需要调用前三步中所有的函数,所以特别需要注意的是,在Android4.0以后,所有关于网络方面的操作都不能在主线程了(我们访问bing的时候用到了INTERNET权限),所以这里使用了一个AsyncTask;并且由于在本地没有图片而加载图片的时候,根据网速的不同,会造成界面的等待,因此加入了一个ProgressDialog,具体代码如下:

   class DownImgAsyncTask extends AsyncTask<String,Void,Bitmap> {@Overrideprotected Bitmap doInBackground(String... strings) {try{Bitmap b=getBitmap(resolveData(getData(strings[0])));return b;}catch (IOException e){e.printStackTrace();}return null;}@Overrideprotected void onPreExecute() {super.onPreExecute();progressDialog.show();}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);if (bitmap!=null){iv_background.setImageBitmap(bitmap);//保存到本地CutPictureUtils.saveImageToGallery(SplashActivity.this,bitmap);}progressDialog.dismiss();}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}}

保存到本地的函数代码如下:

    public static void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存图片File appDir = new File(Environment.getExternalStorageDirectory(), "crazystudy");if (!appDir.exists()) {appDir.mkdir();}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");// HH:mm:ss
//获取当前时间Date date = new Date(System.currentTimeMillis());String fileName = simpleDateFormat.format(date) + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//        // 其次把文件插入到系统图库
//        try {
//            MediaStore.Images.Media.insertImage(context.getContentResolver(),
//                    file.getAbsolutePath(), fileName, null);
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }
//        // 最后通知图库更新
//        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath())));}

现在我们可以调用这个DownImgAsyncTask来完成我们欢迎页的制作了,在《每日一记—获取Bing每一日一图实现Android欢迎页(一)》中的“获取bing背景图片”预留位置,加入如下代码:

        if(AnalysisUtils.isFolderExists("/sdcard/crazystudy/")){if (AnalysisUtils.fileIsExists(imgUri.getPath())){// 显示出来CutPictureUtils cutPictureUtils=new CutPictureUtils(SplashActivity.this,"");iv_background.setImageBitmap(cutPictureUtils.decodeUriAsBitmap(imgUri));}else {progressDialog = new ProgressDialog(this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progressDialog.setMessage("加载中");progressDialog.setCancelable(false);//获取背景图片String path = "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=5&mkt=zh-CN";new DownImgAsyncTask().execute(path);}}

这样欢迎页就完美的做好了,下面是效果图:

每日一记—获取Bing每一日一图实现Android欢迎页(二)相关推荐

  1. flask 自动换背景,使用python获取bing每日壁纸当作登陆背景图片

    欢迎关注原创视频教程 Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.c ...

  2. 获取Bing美图制作Api

    获取Bing美图制作Api 看起来很复杂,但换个方法也太简单了吧,不过实际上手还是费了点心思 想法 要调用图的时候就换成bing的每日美图就行 本来是在bing官网研究官方图片地址的 结果万能的网友直 ...

  3. php提取bing背景,php获取Bing美图

    微软的必应搜索的每日图片不得不说,都是经典,美得一塌糊涂. 看到很多把必应壁纸做电脑壁纸的软件,今天闲的蛋疼,就折腾了一下. 接口 我们用到的接口是https://cn.bing.com/HPImag ...

  4. bing超高清壁纸php,如何获取 bing 每日壁纸(超高清版)

    需求描述 必应作为一个在壁纸圈做搜索引擎最优秀的站点,其每日壁纸也是可圈可点的. 那么自然就生出了如何将必应的每日壁纸保存下来,用作电脑桌面壁纸轮播的想法. 实现方式 简单粗暴 如何下载 最简单,不需 ...

  5. github电脑壁纸_GitHub - jadepeng/bing-wallpaper: Bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事...

    Bing每日壁纸 发布一个开源小软件,Bing每日壁纸. 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 欢迎大家下载使用,点star!有问题请留言或者提i ...

  6. github电脑壁纸_GitHub - githubtaotao/bing-wallpaper: Bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事...

    Bing每日壁纸 发布一个开源小软件,Bing每日壁纸. 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 欢迎大家下载使用,点star!有问题请留言或者提i ...

  7. 获取bing壁纸php,php获取bing每日壁纸的示例

    php获取bing每日壁纸的示例 这篇文章主要介绍了使用php获取bing每日壁纸的示例,需要的朋友可以参考下 代码如下: $str=file_get_contents('http://cn.bing ...

  8. 必应(Bing)每日图片获取API

    必应(Bing)每日图片获取API January 11, 2015 API http://lab.dobyi.com/api/bing.php 介绍 Value Description title ...

  9. 获取bing壁纸php,php获取bing每日壁纸示例分享

    php获取bing每日壁纸示例分享 复制代码 代码如下: $str=file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&am ...

最新文章

  1. 【讀書筆記】人人都是产品经理
  2. [置顶] 细说Cache
  3. 基于深度学习的脑电图识别 综述篇(二)数据采样及处理
  4. linux5.4支持中文及中文输入法
  5. c语言程序设计修改题,2006年秋季C语言程序设计》期末考试题A卷答案答案--修改后.doc...
  6. Thumb mode 与 ARM mode比较
  7. 【CF1307F】Cow and Vacation(并查集+lca倍增)
  8. python 追加到字典_使用Python读取,写入和解析JSON
  9. 程式CSCMSV4黑色炫酷DJ音乐门户模板 音乐网源码
  10. nodejs 中es5 模块的几种写法
  11. EnvironmentLocationNotFound: Not a conda environment:
  12. Centos7系统升级
  13. FileUpload文件上传控件
  14. 手机“入殓师”,你之前有听过吗?
  15. 让国外买家秒回复的询盘模板合集
  16. 合理利用计算机虚拟内存,虚拟内存有什么用?虚拟内存怎么设置最好?
  17. SIEBEL配置学习笔记
  18. Windows徽标键(WinKey)的屏蔽和恢复
  19. 几种 FPGA 芯片的工艺结构
  20. android 高德地图动画,使用MotionLayout实现高德地图bottomSheets效果

热门文章

  1. Jetson nano 的语音
  2. 【Py】下划线命名与驼峰命名转换方式汇总
  3. 《2013-I want to talk with the world》
  4. CSMA/CA载波侦听多路访问及冲突避免协议
  5. android 快速开发工具类,android面试知识点
  6. 关于mac地址广播的问题
  7. 软件设计师学习笔记-面向对象设计
  8. Application.HandleMessage与Application.ProcessMessage
  9. 基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发
  10. aspose插入word