这次安卓课程设计选择的题目是人脸识别考勤系统,这个题目要求调用人脸识别api来完成用户的注册和签到功能,写这篇博客的时候已经完成了大部分功能,现在记录一下在这次课程设计中所踩的坑和解决方法。
(一)android中调用api的坑
这次设计中用的是百度人脸识别api,而服务端的SDK中有各种常用语言的接口,但是安卓端需要验证,所以决定用Java的SDK,百度也提供了实例代码,在文档中心有下载,但在安卓中使用这些接口不仅仅是new class这么简单:
1.调用相关权限
在安卓API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安(keng)全(die)。
首先要在AndroidManifest.xml文件中申明所需权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
注意要在<application 前申明
然后一定要在onCreate()函数中申明所需要申请的权限(这里封装成了一个requestAllPower函数,并申请两个权限,如要申请多个可以在ActivityCompat.requestPermissions()函数里增加):
public void requestAllPower() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
}
这样在app运行时会自动弹出请求权限窗口
(二)获取文件真实路径
在获取了相关权限后,想要顺利调用百度AI接口还需要上传照片,而百度提供的示例代码需要传入文件的url,这就需要获取照片的路径,但是在实际使用中获取的路径有两种情况,一种就是获取了可以直接使用的,而当用户自己创建了临时读写的储存空间时(例如调用相机拍照存在特定的位置)获取的路径是不能直接使用的,在搜索后发现了解决方法,调用后可直接获取真实路径:
private String getRealPathFromURI(Uri contentUri) {
Uri uri = contentUri;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor actualimagecursor = managedQuery(uri,proj,null,null,null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
String img_path = actualimagecursor.getString(actual_image_column_index);
return img_path;
}
然后通过将图片转为BASE64编码,通过POST请求将图片和相关参数传递给百度提供的地址,即可完成调用。
(三)解析JSON数据
在解析百度传回来的JSON数据时遇到了问题,只能解析一层不能解析多层,在网上搜索到了一个比较简单的解决方法:
JSONObject jsonObj =new JSONObject(result);
JSONObject result1 = (JSONObject)jsonObj.getJSONObject("result");
JSONArray Jarray = result1.getJSONArray("user_list");
JSONObject result2 =null;
for (int i =0; i < Jarray.length(); i++)
{
result2 = Jarray.getJSONObject(i);
}
error_msg = jsonObj.optString("error_msg");
user_id = result2.optString("user_id");
score = result2.optString("score");
总结
这次课设历时三天完成,基本实现了功能,代码已经上传到Github,调用百度AI接口需要更改为自己的access_token。
网友评论