最近做毕设的时候遇到了这个问题,一直给我报错java.io.notFound啥的啥的,不管怎么修改路径都是报这个错误,今天终于解决了,记录一下解决过程。
首先我们调用系统相册。
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, 2);
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
imageView.setImageURI(uri);
ocrtest.ocrtest(uri);
}
}
如上即可调用相册模块进行选择本机图片,但是这样选出来的路径是URI,也就是资源统一标识符,并不是图片的绝对路径,我们需要做修改,这里把我的FileUtil类上传,直接使用即可FileUtil类下载。
在FileUtil类中,getFileAbsolutePath函数是根据URI获取绝对路径,包含两个参数context,uri。
第一个是上下文,第二个就是文件的uri。函数返回值时String类型的绝对路径RealPath。
Context mContext;
public OcrTest(Context context){
mContext = context;
}
此后就可以转换为绝对路径,之后在调用百度AI的官方文档中的代码即可。
String realpath = FileUtil.getFileAbsolutePath(mContext, uri);
Log.i("realpath", realpath);
byte[] imgData = FileUtil.readFileByBytes(realpath);
String imgStr = Base64Util.encode(imgData);
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
String param = "image=" + imgParam;
// 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
String result = HttpUtil.post(url, accesstoken, param);
System.out.println(result);
return result;
返回结果
需要注意的是,在Android6.0之后,则需要加入动态权限获取,否则会报Permission denied错误。
权限获取代码如下
在AndroidManifest.xml文件中加入
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.INTERNET" />
在java代码中加入此函数
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE };
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to
* grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}