首先注册账户获取sdk备用。
1:获取token
/**
* 获取token类
*/
public class AuthService {
/**
* 获取权限token
* @return 返回示例:
* {
* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
* "expires_in": 2592000
* }
*/
public static String getAuth() {
// 官网获取的 API Key 更新为你注册的
String clientId = "cK150qIiv4z9QXUsOpeH847w";
// 官网获取的 Secret Key 更新为你注册的
String clientSecret = "cgshxLlL8fgTy5d8i3T78GZr7jtUHBur";
return getAuth(clientId, clientSecret);
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token 示例:
* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
*/
public static String getAuth(String ak, String sk) {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果示例
*/
System.err.println("result:" + result);
JSONObject jsonObject = new JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
2:普通识别
可以分为两种,1:根据image的url传参,2:根据base64传参
bitmap与base64互转:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Base64BitmapUtil {
/**
* bitmap转为base64
* @param bitmap
* @return
*/
public static String bitmapToBase64(Bitmap bitmap) {
String result = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
byte[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* base64转为bitmap
*
* @param base64Data
* @return
*/
public static Bitmap base64ToBitmap(String base64Data) {
byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
}
接口定义:
/**
* create by zj on 2018/12/3
*
* 百度ai接口
*/
public class AiApi {
//文字识别(基础根据图片string)
public static RequestHandle getGeneralBasic(String image,ResponseHandler responseHandler){
RequestParams requestParams=new RequestParams();
requestParams.put("image",image);
requestParams.put("access_token", ShareUtil.getInstance().getString("token",""));
return HttpClient.doPost("general_basic",requestParams,responseHandler);
}
//文字识别(基础根据图片URL)
public static RequestHandle getGeneralBasicurl(String url,ResponseHandler responseHandler){
RequestParams requestParams=new RequestParams();
requestParams.put("url",url);
requestParams.put("access_token",ShareUtil.getInstance().getString("token",""));
return HttpClient.doPost("general_basic",requestParams,responseHandler);
}
//文字识别(高精度根据图片string)
public static RequestHandle getAccurateBasic(String image,ResponseHandler responseHandler){
RequestParams requestParams=new RequestParams();
requestParams.put("image",image);
requestParams.put("access_token", ShareUtil.getInstance().getString("token",""));
return HttpClient.doPost("accurate_basic",requestParams,responseHandler);
}
}
拍照部分代码:
清单注册:
<provider
android:authorities="com.zj.orc.FileProvider"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
其中exported代表该服务是否能够被其他应用程序组件调用或跟它交互,这里设置为false。
xml文件 file_paths:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_path" path="photo"/>
<cache-path
name="cache_path"
path="photo"/>
</paths>
权限判断:
public void onTakePhotoClick(){
if (Build.VERSION.SDK_INT>23){
getPermissionPhoto();
}else{
takePhoto();
}
}
public void getPermissionPhoto(){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(TextDiscernActivity.this,new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_PERMISSION);
}else{
takePhoto();
}
}
File tempFile;
public void takePhoto(){
tempFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/photo/"+System.currentTimeMillis() + ".jpg");
//生成文件夹
tempFile.getParentFile().mkdirs();
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//对包管理器进行查询以确定是否有Activity能够启动该Intent
if (intent.resolveActivity(getPackageManager())!=null){
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
if (Build.VERSION.SDK_INT>=24){
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(this, "com.zj.orc.FileProvider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
} else {
//否则使用Uri.fromFile(file)方法获取Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
}
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
}
}
以上是根据百度Ai -文字识别的简单接入,以及应用。