最近对百度的炮轰不断,我却要写一个跟百度相关的应用工具,简直毫无违和感。不过,秉承着技术无罪的崇高理念,我还是说一些我的实现过程。
最近帮一个朋友写一个Android图像处理的应用,我主要实现功能是调用百度识图对图片进行识别,并从网页提取到返回结果。功能其实很简单,可怜百度公司并没有提供百度识图的API,导致智能通过模拟网页请求的方式实现。
当然在实现的过程中参考了很多大神的博客,然而都被我消化道代码中了,在此不一一列出了。实现的功能主要是:给定图片的路径,可以直接上传文件获取;如果是网络图片,需要给定图片链接。话不多说,直接上代码。

package com.example.baidushitutest;import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import android.util.Log;public class ShituUtils {private static final String TAG = "ShituUtils";private static final int TIME_OUT = 10 * 1000; // 超时时间private static final String CHARSET = "utf-8"; // 设置编码public static String resolvePostResponse(String postResponseUrl){String requestUri = "http://image.baidu.com" + postResponseUrl;HttpGet httpRequest = new HttpGet(requestUri);String strResult = null;try {HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);if (httpResponse.getStatusLine().getStatusCode() == 200) {strResult = EntityUtils.toString(httpResponse.getEntity());Document document = Jsoup.parseBodyFragment(strResult);strResult = document.getElementsByClass("guess-info-not-found-title").text();if (strResult == ""){strResult = document.getElementsByClass("guess-info-text").text();if(strResult == ""){strResult = document.getElementsByClass("error-msg").text();}}return strResult;} else {strResult = "Error Response";}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return strResult;}public static String postFile(String filePath, String requestURL) {int res=0;String result = null;String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成String PREFIX = "--", LINE_END = "\r\n";String CONTENT_TYPE = "multipart/form-data"; // 内容类型File file = new File(filePath);try {URL url = new URL(requestURL);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(TIME_OUT);conn.setConnectTimeout(TIME_OUT);conn.setChunkedStreamingMode(1024 * 1024);// 1024K  conn.setDoInput(true); // 允许输入流conn.setDoOutput(true); // 允许输出流conn.setUseCaches(false); // 不允许使用缓存conn.setRequestMethod("POST"); // 请求方式conn.setRequestProperty("Charset", CHARSET); // 设置编码conn.setRequestProperty("Connection", "keep-alive");conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary="+ BOUNDARY);if (file != null) {/*** 当文件不为空时执行上传*/OutputStream outputSteam=conn.getOutputStream();DataOutputStream dos = new DataOutputStream(outputSteam);StringBuffer sb = new StringBuffer();sb.append(PREFIX);sb.append(BOUNDARY);sb.append(LINE_END);/*** 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件* filename是文件的名字,包含后缀名*/sb.append("Content-Disposition: form-data; name=\"filedata\"; filename=\""+ file.getName() + "\"" + LINE_END);sb.append("Content-Type: application/octet-stream; charset="+ CHARSET + LINE_END);sb.append(LINE_END);dos.write(sb.toString().getBytes());InputStream is = new FileInputStream(file);byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {dos.write(bytes, 0, len);}is.close();dos.write(LINE_END.getBytes());byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();dos.write(end_data);dos.flush();/*** 获取响应码 200=成功 当响应成功,获取响应的流*/res = conn.getResponseCode();Log.e(TAG, "response code:" + res);if (res == 200) {Log.e(TAG, "request success");InputStream input = conn.getInputStream();StringBuffer sb1 = new StringBuffer();int ss;while ((ss = input.read()) != -1) {sb1.append((char) ss);}result = sb1.toString();Log.e(TAG, "result : " + result);} else {Log.e(TAG, "request error");}}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}public static String baiduShitu(String imageUrl){String uriAPI = null;try {uriAPI = "http://image.baidu.com/n/pc_search?queryImageUrl="+URLEncoder.encode(imageUrl,"utf-8")+"&fm=result&pos=&uptype=paste";} catch (UnsupportedEncodingException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}HttpGet httpRequest = new HttpGet(uriAPI);String strResult = null;try {HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);if (httpResponse.getStatusLine().getStatusCode() == 200) {strResult = EntityUtils.toString(httpResponse.getEntity());Document document = Jsoup.parseBodyFragment(strResult);strResult = document.getElementsByClass("guess-info-not-found-title").text();if (strResult == ""){strResult = document.getElementsByClass("guess-info-text").text();if(strResult == ""){strResult = document.getElementsByClass("error-msg").text();}}return strResult;} else {strResult = "Error Response";}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return strResult;}
}

提取网页内容用的工具jsoup,可以从网上下载。这里是实现的一个demo。

Android 调用百度识图工具相关推荐

  1. python 百度识图_python如何调用百度识图api

    一.先去百度识别官网注册开通服务且获得ak和sk 二.代码模板 import cv2 import base64 import requests import numpy as np import t ...

  2. python识图 web_python如何调用百度识图api

    一.先去百度识别官网注册开通服务且获得ak和sk 链接:https://cloud.baidu.com/doc/Reference/s/9jwvz2egb 二.代码模板 import cv2 impo ...

  3. python调用百度api判断两张图片是否相同_python如何调用百度识图api

    一.先去百度识别官网注册开通服务且获得ak和sk 二.代码模板 import cv2 import base64 import requests import numpy as np import t ...

  4. Android 调用百度地图sdk 实现路线规划导航

    Android 调用百度地图sdk 实现路线规划导航 功能: 实现实时/需求定位 卫星地图查看 路况 周边poi检索 地点输入提示检索 驾驶 步行 公交 骑行路线规划 注:以上为实现的大概功能 ,接下 ...

  5. 百度识图原理分析 推测其发展方向…

    百度识图原理分析 推测其发展方向 2010年12月13日,百度推出相似图片搜索功能-百度识图(shitu.baidu.com),常规的图片搜索,是通过输入关键词的形式搜索到互联网上相关的图片资源,而百 ...

  6. 从百度识图效果对智能识图的一些思考

    我尝试让百度识图识别一张图片,它是一种芯片的图片来自于忆阻器,但得到了如下的结果: 它将我的图片联想到二维码. 这已经不错,但是还说不上"好".让我们想想看,它尝试找出它的线条分布 ...

  7. 百度识图上线,体验以图搜图

    之前听说是在内测,这会儿正式上线了,百度识图测试版,地址:stu.baidu.com.你可以自己上传图片,也可以用网络图片,我试了一下,一些原创性相对比较高的图片,基本上是搜不到啥结果(譬如本人的照片 ...

  8. 以图搜图新体验:图片谷歌和百度识图

    记得还是年初的时候,在公园里玩,看到路边有很漂亮的花儿,就拿手机拍下来.可是,我不知道这花儿叫什么名字,所以就算上网我也没办法了解这花儿的更多信息,或者可以发到论坛,看能不能遇到刚好打酱油的生物学家. ...

  9. java用gson转换百度识图api的json

    参考文章1 [转]用GSON 五招之内搞定任何JSON数组 参考文章2 JAVA使用Gson解析json数据,实例 百度识图api返回的值如下 result:{"log_id": ...

  10. android 调用百度地图规划,Android 调用百度地图API

    一.到 百度地图开发平台下载SDK 1.点击自定义下载 2.下载自己想要的功能包我这里选了三个 3.获取密钥 获取密钥之前我们要新建一个应用 填写好相关的信息 二. 新建一个项目工程 1. 把下载好的 ...

最新文章

  1. Linux内核网络数据发送(五)——排队规则
  2. simulink显示多个数据_Stateflow数据介绍(一)
  3. Effective C++条款01: 视C++为一个语言联邦
  4. jquery官网打不开难以下载,不妨试试webjars
  5. Spring集成基础知识
  6. 基于matlab的数字下变频器的设计与仿真应用,基于MATLAB的数字下变频器的设计与仿真应用.pdf...
  7. java web 开发之写在前面(0)
  8. 分布式系统的面试题1
  9. 图书管理系统c++_校园一卡通学生如何使用,图书馆分系统演示步骤,系统间资源共享...
  10. Ceph分布式存储学习指南1.12 Lustre
  11. Ubiquant LGBM Baseline 九坤量化大赛 版本44
  12. 关于java前端的相关讲解
  13. 网工学习笔记——reboot
  14. biopython安装_Ubuntu中安装Biopython
  15. php查重,知网查重时检测php之类的源码吗?【干货分享】
  16. 苹果手机桌面找不到计算机,苹果手机在我的电脑显示不出来怎么办
  17. 01 - Kali笔记_Linux_Kali环境熟悉
  18. Python性能分析,Python可是无所不能的!
  19. React Native 手势触摸事件机制详解(基础篇)
  20. JAVA 蓝桥杯 算法提高 阮小二买彩票

热门文章

  1. matlab lte rsrp,为什么选择 FieldFox 手持式分析仪?- 更宽带宽,更高精度
  2. python傅里叶逆变换_Python傅里叶逆变换
  3. html鼠标悬停边框颜色,CSS实现鼠标悬停图片时的边框变色效果
  4. vscode安装旧版本插件_vscode 常用插件安装
  5. ubuntu 好用的桌面小工具
  6. 前端微信小程序面试题总结
  7. VS之sonar插件安装
  8. 分享一个通过项目管理师证书成功办理北京户口的励志经验
  9. 小型迷宫实现---迷宫算法(递归回溯法)
  10. AIDL解析(一):AIDL原理解析