1. 利用 registerForActivityResult 打开相机并且拍照,利用Uri获取图片本地真实路径,并且传到文字识别中解析OCR自带库中解析,使用请求代码示例Java版,并且下载好配套的解析类,里面有些内容要自己修改一下,下面会讲
class CharacterActivity : AppCompatActivity(){
private val TAG = "CharacterActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_character)
characterBack.setOnClickListener { finish() }
characterTake.setOnClickListener {
onTakePicture()
}
}
var imageSaveUri : Uri?= null
fun onTakePicture(){
imageSaveUri = if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.Q){
Log.d(TAG, "onTakePicture: ${"hello"}")
val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME,"图片名称.jpg")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
}else{
FileProvider.getUriForFile(this,
"${packageName}.fileprovider",
File(externalCacheDir!!.absolutePath,"图片名称.jpg")
)
}
myActivityResultLauncher.launch(imageSaveUri)
Log.d(TAG, "onTakePicture1: ${imageSaveUri}")
}
private fun getImagePath():String{
var cursor: Cursor? = null;
try {
val proj = arrayOf(MediaStore.Images.Media.DATA)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
cursor = contentResolver.query(Uri.parse(imageSaveUri.toString()),proj,null,null,null)
val column_index = cursor?.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
cursor?.moveToFirst()
return cursor?.getString(column_index!!)!!
}
}catch (e:Exception){
e.printStackTrace()
}finally {
cursor?.close()
}
return null.toString()
}
private val myActivityResultLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()){ result : Boolean ->
if (result) {
Log.d(TAG, ": ${getImagePath()}")
val data = GeneralBasic.generalBasic(getImagePath())
Log.d(TAG, "${data}: ")
}
}
}
2. 调用 GeneralBasic.generalBasic(String imagePath),我改过,需要传入图片本地路径,和自己的Token,Token的获取官方文档和我的这篇文章中有说明Token的获取
public class GeneralBasic {
public static String generalBasic(String imagePath) {
String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
try {
String filePath = imagePath;
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String accessToken = "输入自己的Token";
String result = HttpUtil.post(url, accessToken, imgStr);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
3. 调用 HttpUtil,避坑避坑,这里面的ConnectionHttp不能用我把他改成Okhttp进行网络请求,亲测有效。
public class HttpUtil {
public static String post(String requestUrl, String accessToken, String params)
throws Exception {
String contentType = "application/x-www-form-urlencoded";
return HttpUtil.post(requestUrl, accessToken, contentType, params);
}
public static String post(String requestUrl, String accessToken, String contentType, String params)
throws Exception {
String encoding = "UTF-8";
if (requestUrl.contains("nlp")) {
encoding = "GBK";
}
return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
}
public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
throws Exception {
String url = requestUrl + "?access_token=" + accessToken;
return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
}
public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
throws Exception {
URL url = new URL(generalUrl);
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder()
.add("image",params)
.build();
Request request = new Request.Builder()
.url(url)
.addHeader("Content-Type",contentType)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("hello", response.body().string());
}
});
return null;
}
}
4. 获取数据成功