人脸识别考勤app

2018-12-29  本文已影响0人  苏星_

        这次安卓课程设计选择的题目是人脸识别考勤系统,这个题目要求调用人脸识别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。

上一篇下一篇

猜你喜欢

热点阅读