package org.deviceconnect.android.deviceplugin.hvcc2w.manager; import android.content.Context; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Handler; import android.util.Log; import android.util.SparseArray; import org.deviceconnect.android.deviceplugin.hvcc2w.BuildConfig; import org.deviceconnect.android.deviceplugin.hvcc2w.R; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.FaceRecognitionDataModel; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.FaceRecognitionObject; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.HVCCameraInfo; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.HumanDetectKind; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.UserDataModel; import org.deviceconnect.android.deviceplugin.hvcc2w.manager.data.UserDataObject; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import javax.net.ssl.HttpsURLConnection; import jp.co.omron.hvcw.ErrorCodes; import jp.co.omron.hvcw.FileInfo; import jp.co.omron.hvcw.HvcwApi; import jp.co.omron.hvcw.Int; import jp.co.omron.hvcw.OkaoResult; import jp.co.omron.hvcw.ResultAge; import jp.co.omron.hvcw.ResultDetection; import jp.co.omron.hvcw.ResultDirection; import jp.co.omron.hvcw.ResultFace; import jp.co.omron.hvcw.ResultGender; import jp.co.omron.hvcw.ResultRecognition; /** * HVC Manager. * @author NTT DOCOMO, INC. */ public enum HVCManager { /** * Singleton instance. */ INSTANCE; /** TAG. */ private static final String TAG = "HVCManager"; /** Based request URL of the Web API. */ private static final String HVC_SERVICE_URL = "https://developer.hvc.omron.com/c2w"; /** User Signup URL.*/ private static final String HVC_SIGN_UP_URL = HVC_SERVICE_URL + "/api/v1/signup.php"; /** User Login URL. */ private static final String HVC_LOGIN_URL = HVC_SERVICE_URL + "/api/v1/login.php"; /** User Logout URL. */ private static final String HVC_LOGOUT_URL = HVC_SERVICE_URL + "/api/v1/logout.php"; /** Get CameraList URL.*/ private static final String HVC_GET_CAMERA_URL = HVC_SERVICE_URL + "/api/v1/getCameraList.php"; /** Network Setting file name. */ private static final String HVC_NETWORK_SETTING = "/network_setting.pcm"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_EYE = "eye"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_NOSE = "nose"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_MOUTH = "mouth"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_BLINK = "blink"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_AGE = "age"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_GENDER = "gender"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_FACE_DIRECTION = "faceDirection"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_GAZE = "gaze"; /** Option parameter:{@value}. */ public static final String PARAM_OPTIONS_EXPRESSION = "expression"; /** HVC-C2W body detect threshold initial value. */ private static final int HVC_C2W_BODY_DETECT_THRESHOLD = 500; //1〜1000 /** HVC-C2W hand detect threshold initial value. */ private static final int HVC_C2W_HAND_DETECT_THRESHOLD = 500; //1〜1000 /** HVC-C2W Pet detect threshold initial value. */ private static final int HVC_C2W_PET_DETECT_THRESHOLD = 500; //1〜1000 /** HVC-C2W Face detect threshold initial value. */ private static final int HVC_C2W_FACE_DETECT_THRESHOLD = 500; //1〜1000 /** HVC-C2W Face Recognition threshold initial value. */ private static final int HVC_C2W_RECOGNITION_THRESHOLD = 500; //0〜1000 /** Threshold min. body, hand, pet, face. */ public static final int HVC_C2W_MIN_THRESHOLD = 1; /** Threshold min. recognition.*/ public static final int HVC_C2W_MIN_RECOGNITION_THRESHOLD = 0; /** Threshold max.*/ public static final int HVC_C2W_MAX_THRESHOLD = 1000; /** Confidence max.*/ public static final int HVC_C2W_MAX_CONFIDENCE = 1000; /** Blink max.*/ public static final int HVC_C2W_MAX_BLINK = 1000; /** * Neutral<br> * Expression Estimation result value<br> */ public static final int HVC_EX_NEUTRAL = 0; /** * Happiness<br> * Expression Estimation result value<br> */ public static final int HVC_EX_HAPPINESS = 1; /** * Surprise<br> * Expression Estimation result value<br> */ public static final int HVC_EX_SURPRISE = 2; /** * Anger<br> * Expression Estimation result value<br> */ public static final int HVC_EX_ANGER = 3; /** * Sadness<br> * Expression Estimation result value<br> */ public static final int HVC_EX_SADNESS = 4; /** * HVC-C expression unknown. */ public static final String EXPRESSION_UNKNOWN = "unknown"; /** * HVC-C expression smile. */ public static final String EXPRESSION_SMILE = "smile"; /** * HVC-C expression surprise. */ public static final String EXPRESSION_SURPRISE = "surprise"; /** * HVC-C expression mad. */ public static final String EXPRESSION_MAD = "mad"; /** * HVC-C expression sad. */ public static final String EXPRESSION_SAD = "sad"; /** * HVC-C expression score max. */ public static final int EXPRESSION_SCORE_MAX = 100; /** * HVC-C2W detect camera width[pixels]. */ public static final int HVC_C2W_CAMERA_WIDTH = 1920; /** * HVC-C2W detect camera height[pixels]. */ public static final int HVC_C2W_CAMERA_HEIGHT = 1080; /** HVC-C2W body min size. */ private static final int HVC_C2W_BODY_MIN_SIZE = 30; //20〜8192 /** HVC-C2W body max size. */ private static final int HVC_C2W_BODY_MAX_SIZE = 8192; /** HVC-C2W hand min size. */ private static final int HVC_C2W_HAND_MIN_SIZE = 40; /** HVC-C2W hand max size. */ private static final int HVC_C2W_HAND_MAX_SIZE = 8192; /** HVC-C2W pet min size. */ private static final int HVC_C2W_PET_MIN_SIZE = 40; /** HVC-C2W pet max size. */ private static final int HVC_C2W_PET_MAX_SIZE = 8192; /** HVC-C2W face min size. */ private static final int HVC_C2W_FACE_MIN_SIZE = 64; /** HVC-C2W face max size. */ private static final int HVC_C2W_FACE_MAX_SIZE = 8192; /** HVC-C2W min size. */ public static final int HVC_C2W_MIN_SIZE = 20; /** HVC-C2W max size. */ public static final int HVC_C2W_MAX_SIZE = 8192; /** * HVC interval parameter minimum value. */ public static final long PARAM_INTERVAL_MIN = 3 * 1000; /** * HVC interval parameter maximum value. */ public static final long PARAM_INTERVAL_MAX = 60 * 1000; /** * Male<br> * Gender Estimation result value<br> */ public static final int HVC_GEN_MALE = 1; /** * Female<br> * Gender Estimation result value<br> */ public static final int HVC_GEN_FEMALE = 0; /** * API KEY. */ private String mAPIKey; /** * APP ID. */ private String mAppId; /** * HVC Cameras. */ private ConcurrentHashMap<String, HVCCameraInfo> mServices; /** Event List. */ private List<String> mEventList; /** HVC SDK Handle. */ private HvcwApi mApi; /** Body Timer Handler. */ private Handler mBodyTimer; /** Hand Timer Handler. */ private Handler mHandTimer; /** Face Timer Handler. */ private Handler mFaceTimer; /** * POST Request's or Manager's Listener. */ public interface ResponseListener { /** * Request Receiver. * @param json response json */ void onReceived(final String json); } /** * Load .so libraries. */ static { System.loadLibrary("openh264"); System.loadLibrary("ffmpeg"); System.loadLibrary("ldpc"); System.loadLibrary("IOTCAPIs"); System.loadLibrary("RDTAPIs"); System.loadLibrary("c2w"); System.loadLibrary("HvcOi"); System.loadLibrary("HVCW"); } /** * Constructor. */ private HVCManager() { mServices = new ConcurrentHashMap<String, HVCCameraInfo>(); mEventList = new ArrayList<String>(); mBodyTimer = new Handler(); mHandTimer = new Handler(); mFaceTimer = new Handler(); } /** * Return HVC Cameras. * @return HVC Cameras List */ public ConcurrentHashMap<String, HVCCameraInfo> getHVCDevices() { return mServices; } /** * Initialize. * * @param context Context。 */ public void init(final Context context) { mAPIKey = context.getString(R.string.api_key); mAppId = context.getString(R.string.app_id); if (mApi != null) { mApi.deleteHandle(); } mApi = HvcwApi.createHandle(); } /** * Add Body Detect Event Listener. * @param serviceId ServiceID * @param l Listener */ public void addBodyDetectEventListener(final String serviceId, final HVCCameraInfo.OnBodyEventListener l) { if (!mEventList.contains(serviceId)) { mEventList.add(serviceId); } HVCCameraInfo camera = mServices.get(serviceId); camera.setBodyEvent(l); } /** * Add Hand Detect Event Listener. * @param serviceId Service ID * @param l Listener */ public void addHandDetectEventListener(final String serviceId, final HVCCameraInfo.OnHandEventListener l) { if (!mEventList.contains(serviceId)) { mEventList.add(serviceId); } HVCCameraInfo camera = mServices.get(serviceId); camera.setHandEvent(l); } /** * Add Face Detect Event Listener. * @param serviceId ServiceID * @param l Listener * @param options Options */ public void addFaceDetectEventListener(final String serviceId, final HVCCameraInfo.OnFaceEventListener l, final List<String> options) { if (!mEventList.contains(serviceId)) { mEventList.add(serviceId); } HVCCameraInfo camera = mServices.get(serviceId); camera.setOptions(options); camera.setFaceEvent(l); } /** * Add Face Recognize Event Listener. * @param serviceId ServiceID * @param l Listener * @param options Options */ public void addFaceRecognizeEventListener(final String serviceId, final HVCCameraInfo.OnFaceRecognizeEventListener l, final List<String> options) { if (!mEventList.contains(serviceId)) { mEventList.add(serviceId); } HVCCameraInfo camera = mServices.get(serviceId); camera.setOptions(options); camera.setFaceRecognizeEvent(l); } /** * Check Remove Event list. * @param serviceId ServiceID * @param camera Camera Info * */ private void removeEventList(final String serviceId, final HVCCameraInfo camera) { if (mEventList.contains(serviceId) && camera.getBodyEvent() == null && camera.getHandEvent() == null && camera.getFaceEvent() == null && camera.getFaceRecognizeEvent() == null) { mEventList.remove(camera.getID()); } } /** * Start Face Detection Timer. * @param interval Timer's interval */ private void startFaceTimer(final Long interval) { mFaceTimer.postDelayed(new Runnable() { @Override public void run() { for (String key : mServices.keySet()) { HVCCameraInfo camera = mServices.get(key); if (camera == null) { return; } OkaoResult result = HVCManager.INSTANCE.execute(); if (camera.getFaceEvent() != null) { camera.getFaceEvent().onNotifyForFaceDetectResult(key, result); } } if (mEventList.size() > 0) { mFaceTimer.postDelayed(this, interval); } } }, interval); } /** * Start Hand Detection Timer. * @param interval Timer's interval */ private void startHandTimer(final Long interval) { mHandTimer.postDelayed(new Runnable() { @Override public void run() { for (String key : mServices.keySet()) { HVCCameraInfo camera = mServices.get(key); if (camera == null) { return; } OkaoResult result = HVCManager.INSTANCE.execute(); if (camera.getHandEvent() != null) { camera.getHandEvent().onNotifyForHandDetectResult(key, result); } } if (mEventList.size() > 0) { mHandTimer.postDelayed(this, interval); } } }, interval); } /** * Start Body Detection Timer. * @param interval Timer's interval */ private void startBodyTimer(final Long interval) { mBodyTimer.postDelayed(new Runnable() { @Override public void run() { for (String key : mServices.keySet()) { HVCCameraInfo camera = mServices.get(key); if (camera == null) { return; } OkaoResult result = HVCManager.INSTANCE.execute(); if (camera.getBodyEvent() != null) { camera.getBodyEvent().onNotifyForBodyDetectResult(key, result); } } if (mEventList.size() > 0) { mBodyTimer.postDelayed(this, interval); } } }, interval); } /** * Remove Body Detect Event Listener. * @param serviceId serviceId */ public void removeBodyDetectEventListener(final String serviceId) { HVCCameraInfo camera = mServices.get(serviceId); if (camera != null) { camera.setBodyEvent(null); removeEventList(serviceId, camera); } } /** * Remove Hand Detect Event Listener * @param serviceId Service ID */ public void removeHandDetectEventListener(final String serviceId) { HVCCameraInfo camera = mServices.get(serviceId); if (camera != null) { camera.setHandEvent(null); removeEventList(serviceId, camera); } } /** * Remove Face Detect Event Listener. * @param serviceId Service ID */ public void removeFaceDetectEventListener(final String serviceId) { HVCCameraInfo camera = mServices.get(serviceId); if (camera != null) { camera.setFaceEvent(null); removeEventList(serviceId, camera); } } /** * Remove Face Recognize Event Listener. * @param serviceId ServiceID */ public void removeFaceRecognizeEventListener(final String serviceId) { HVCCameraInfo camera = mServices.get(serviceId); if (camera != null) { camera.setFaceRecognizeEvent(null); removeEventList(serviceId, camera); } } /** * Remove all event listener. */ public void removeAllEventListener() { for (String key : mServices.keySet()) { HVCCameraInfo camera = mServices.get(key); if (camera != null) { camera.setBodyEvent(null); camera.setFaceEvent(null); camera.setFaceRecognizeEvent(null); camera.setHandEvent(null); mEventList.remove(camera.getID()); } } } /** * Start Event Timer. * @param kind HumanDetect kind * @param interval Interval */ public void startEventTimer(final HumanDetectKind kind, final Long interval) { switch (kind) { case BODY: startBodyTimer(interval); break; case HAND: startHandTimer(interval); break; case FACE: startFaceTimer(interval); break; case HUMAN: startBodyTimer(interval); startHandTimer(interval); startFaceTimer(interval); break; default: } } /** * Stop Event Timer. */ public void stopEventTimer(final HumanDetectKind kind) { switch(kind) { case BODY: mBodyTimer.removeCallbacksAndMessages(null); break; case HAND: mHandTimer.removeCallbacksAndMessages(null); break; case FACE: mFaceTimer.removeCallbacksAndMessages(null); break; case HUMAN: mBodyTimer.removeCallbacksAndMessages(null); mHandTimer.removeCallbacksAndMessages(null); mFaceTimer.removeCallbacksAndMessages(null); default: } } /** * Sign Up HVC Service. * @param mailAddress user's mail address * @param l manager's response listener */ public void signup(final String mailAddress, final ResponseListener l) { String apiKey = "apiKey=" + mAPIKey; String email = "email=" + mailAddress; String params = apiKey + "&" + email; if (BuildConfig.DEBUG) { Log.d(TAG, "url:" + HVC_SIGN_UP_URL); Log.d(TAG, "params:" + params); } PostMessageTask task = new PostMessageTask(new ResponseListener() { public void onReceived(String json) { if (BuildConfig.DEBUG) { Log.d(TAG, "result:" + json); } if (l != null) { l.onReceived(json); } } }); task.execute(HVC_SIGN_UP_URL, params); } /** * Login HVC Server. * @param context Context * @param mailAddress Mail Address * @param password Password * @param l Manager's response Listener */ public void login(final Context context, final String mailAddress, final String password, final ResponseListener l) { String apiKey = "apiKey=" + mAPIKey; WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String deviceId = "deviceId=" + wifiInfo.getMacAddress(); String osType = "osType=" + "1"; String email = "email=" + mailAddress; String pass = "password=" + password; String params = apiKey + "&" + deviceId + "&" + osType + "&" + "&" + email + "&" + pass; if (BuildConfig.DEBUG) { Log.d(TAG, "url:" + HVC_LOGIN_URL); Log.d(TAG, "params:" + params); } PostMessageTask task = new PostMessageTask(new ResponseListener() { public void onReceived(String json) { if (l != null) { l.onReceived(json); } if (BuildConfig.DEBUG) { Log.d(TAG, "json:" + json); } if (json != null) { try { JSONObject root = new JSONObject(json); JSONObject result = root.getJSONObject("result"); String code = result.getString("code"); String msg = result.getString("msg"); String accessToken = ""; int expiresIn = -1; if (msg.equals("success")) { JSONObject access = root.getJSONObject("access"); accessToken = access.getString("token"); expiresIn = access.getInt("expiresIn"); } if (BuildConfig.DEBUG) { Log.d(TAG, String.format("response=%s(%s)", code, msg)); Log.d(TAG, String.format("token=\"%s\"", accessToken)); Log.d(TAG, String.format("expiresIn=%d", expiresIn)); } UserDataObject object = new UserDataModel(mailAddress, password, accessToken); HVCStorage.INSTANCE.registerUserData(object); } catch (JSONException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } } } }); task.execute(HVC_LOGIN_URL, params); } /** * Logout HVC Server. * @param l Manager's response Listener */ public void logout(final ResponseListener l) { if (BuildConfig.DEBUG) { Log.d(TAG, "url:" + HVC_LOGOUT_URL); } final List<UserDataObject> lists = HVCStorage.INSTANCE.getUserDatas(null); if (lists.size() == 0) { if (l != null ){ l.onReceived(null); } return; } PostMessageTask task = new PostMessageTask(new ResponseListener() { public void onReceived(String json) { if (BuildConfig.DEBUG) { Log.d(TAG, "json:" + json); } HVCStorage.INSTANCE.removeUserData(lists.get(0).getEmail()); mServices.clear(); mEventList.clear(); if (l != null){ l.onReceived(json); } } }); task.execute(HVC_LOGOUT_URL, "", lists.get(0).getAccessToken()); } /** * Play Connected Sound. * @param context Context * @param ssid SSID * @param password SSID's Password */ public void playConnectSound(final Context context, final String ssid, final String password) { final String fileName = context.getApplicationContext().getFilesDir() + "/network_setting.pcm"; List<UserDataObject> lists = HVCStorage.INSTANCE.getUserDatas(null); if (lists.size() == 0) { return; } int ret = mApi.generateDataSoundFile(fileName, ssid, password, lists.get(0).getAccessToken()); if (ret == ErrorCodes.HVCW_SUCCESS) { new Thread(new Runnable() { @Override public void run() { if (BuildConfig.DEBUG) { Log.d(TAG, "play:" + fileName); } File networkSettingFile = new File(fileName); if (networkSettingFile == null) { return; } byte[] byteData = new byte[(int) networkSettingFile.length()]; FileInputStream fis; try { fis = new FileInputStream(networkSettingFile); fis.read(byteData); fis.close(); } catch (FileNotFoundException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } return; } catch (IOException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } return; } int audioBuffSize = AudioTrack.getMinBufferSize( 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioTrack audio = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, audioBuffSize, AudioTrack.MODE_STREAM); audio.play(); audio.write(byteData, 0, byteData.length); } }).start(); } } /** * Get Camera List. * @param l Manager's response listener */ public void getCameraList(final ResponseListener l) { if (BuildConfig.DEBUG) { Log.d(TAG, "url:" + HVC_GET_CAMERA_URL); } List<UserDataObject> lists = HVCStorage.INSTANCE.getUserDatas(null); if (lists.size() == 0) { if (l != null) { l.onReceived(null); } return; } PostMessageTask task = new PostMessageTask(new ResponseListener() { public void onReceived(String json) { if (BuildConfig.DEBUG) { Log.d(TAG, "json:" + json); } if (json != null) { try { JSONObject root = new JSONObject(json); JSONObject result = root.getJSONObject("result"); String code = result.getString("code"); String msg = result.getString("msg"); if (msg.equals("success")) { mServices.clear(); JSONArray array = root.getJSONArray("cameraList"); for (int i = 0; i < array.length(); ++i) { JSONObject obj =array.getJSONObject(i); String id = obj.getString("cameraId"); String name = obj.getString("cameraName"); String macAddress = obj.getString("cameraMacAddr"); String appId = obj.getString("appId"); int ownerType = obj.getInt("ownerType"); String ownerEmail = obj.getString("ownerEmail"); HVCCameraInfo ci = new HVCCameraInfo(id, name, macAddress, appId, ownerType, ownerEmail); mServices.put(id, ci); if (BuildConfig.DEBUG) { Log.d(TAG, String.format("camera[%d] name=\"%s\",id=\"%s\"", i, name, id)); } } } } catch (JSONException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } } if (l != null) { l.onReceived(json); } } }); task.execute(HVC_GET_CAMERA_URL, "", lists.get(0).getAccessToken()); } /** * Set HVC Camera. * @param cameraId CameraID(ServiceId) * @param l manager's response listener */ public void setCamera(final String cameraId, final ResponseListener l) { final List<UserDataObject> lists = HVCStorage.INSTANCE.getUserDatas(null); if (lists.size() == 0) { if (l != null) { l.onReceived(null); } return; } new Thread(new Runnable() { @Override public void run() { if (BuildConfig.DEBUG) { Log.d(TAG, "connect:" + cameraId); } int ret = mApi.connect(cameraId, lists.get(0).getAccessToken()); Int returnStatus = new Int(); if (ret == ErrorCodes.HVCW_SUCCESS) { int appId = 100; try { appId = Integer.parseInt(mAppId); } catch (NumberFormatException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } ret = mApi.setAppID(appId, returnStatus); } final String msg = String.format("errorCode=%d,returnStatus=%#x", ret, returnStatus.getIntValue()); if (BuildConfig.DEBUG) { Log.d(TAG, msg); } if (l != null) { l.onReceived("{\"result\":" + ret + "}"); } } }).start(); } /** * Register Album. * @param name Face Recognition name * @param userId Face Recognition UserId * @param dataId Face Recognition DataId * @param l Manager's Response Listener */ public void registerAlbum(final String name, final String serviceId, final int userId, final int dataId, final ResponseListener l) { new Thread(new Runnable() { @Override public void run() { ResultDetection rd = new ResultDetection(); FileInfo fi = new FileInfo(); Int returnStatus = new Int(); int ret = mApi.albumRegister(userId, dataId, rd, fi, returnStatus); StringBuilder sb = new StringBuilder(); if (ret == ErrorCodes.HVCW_SUCCESS) { sb.append(String.format("errorCode=%d,returnStatus=%#x\n", ret, returnStatus.getIntValue())); // 顔検出結果 sb.append(String.format("register album x=%d,y=%d,size=%d,confidence=%d", rd.getCenter().getX(), rd.getCenter().getY(), rd.getSize(), rd.getConfidence())); FaceRecognitionObject faceRecognition = new FaceRecognitionDataModel(name, serviceId, userId, dataId); HVCStorage.INSTANCE.registerFaceRecognitionData(faceRecognition); } else { sb.append(String.format("errorCode=%d,returnStatus=%#x", ret, returnStatus.getIntValue())); } final String msg = sb.toString(); if (BuildConfig.DEBUG) { Log.d(TAG, msg); } if (l != null) { l.onReceived("{\"result\":" + ret + "}"); } } }).start(); } /** * Delete Album. * @param name name * @param l Manager's response listener */ public void deleteAlbum(final String name, final ResponseListener l) { final List<FaceRecognitionObject> lists = HVCStorage.INSTANCE.getFaceRecognitionDatas(name); if (lists.size() == 0) { if (l != null) { l.onReceived(null); } return; } new Thread(new Runnable() { @Override public void run() { Int returnStatus = new Int(); // アルバムデータ削除 int ret = mApi.albumDeleteData(lists.get(0).getUserId(), lists.get(0).getDataId(), returnStatus); final String msg = String.format("errorCode=%d,returnStatus=%#x", ret, returnStatus.getIntValue()); if (BuildConfig.DEBUG) { Log.d(TAG, "result:" + msg); } if (l != null) { l.onReceived("{\"result\":" + ret + "}"); } } }).start(); } /** * Face Detect & Face Recognize Execute. * @return Okao Result */ public OkaoResult execute() { int useFunction[] = {1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}; OkaoResult result = new OkaoResult(); Int returnStatus = new Int(); // 実行 int ret = mApi.okaoExecute(useFunction, result, returnStatus); StringBuilder sb = new StringBuilder(); if (ret == ErrorCodes.HVCW_SUCCESS) { sb.append(String.format("errorCode=%d,returnStatus=%#x\n", ret, returnStatus.getIntValue())); // 検出数 int count = result.getResultFaces().getCount(); ResultFace[] rf = result.getResultFaces().getResultFace(); sb.append(String.format("faceCount=%d", count)); for (int i = 0; i < count; ++i) { sb.append(String.format("\nface[%d] x=%d,y=%d,size=%d,confidence=%d", i, rf[i].getCenter().getX(), rf[i].getCenter().getY(), rf[i].getSize(), rf[i].getConfidence())); ResultDirection rd = rf[i].getDirection(); sb.append(String.format("\nface[%d] leftRight=%d,upDown=%d,roll=%d", i, rd.getLR(), rd.getUD(), rd.getRoll())); ResultAge ra = rf[i].getAge(); sb.append(String.format("\nface[%d] age=%d,confidence=%d", i, ra.getAge(), ra.getConfidence())); ResultGender rg = rf[i].getGender(); sb.append(String.format("\nface[%d] gender=%d,confidence=%d", i, rg.getGender(), rg.getConfidence())); ResultRecognition rr = rf[i].getRecognition(); String recg; switch (rr.getUID()) { case -128: recg = "not recognized"; break; case -127: recg = "album is not registered"; break; case -1: recg = String.format("match=×,score=%d", rr.getScore()); break; default: recg = String.format("match=○,score=%d", rr.getScore()); } sb.append(String.format("\nface[%d] %s", i, recg)); } } else { sb.append(String.format("errorCode=%d,returnStatus=%#x", ret, returnStatus.getIntValue())); } final String msg = sb.toString(); if (BuildConfig.DEBUG) { Log.d(TAG, msg); } return result; } /** * Set Okao Execute's Threshold. * @param body body's threshold * @param hand hand's threshold * @param pet pet's threshold * @param face face's threshold * @param recognition recognition's threshold * @return set result */ public int setThreshold(final Double body, final Double hand, final Double pet, final Double face, final Double recognition) { int b = HVC_C2W_BODY_DETECT_THRESHOLD; int h = HVC_C2W_HAND_DETECT_THRESHOLD; int p = HVC_C2W_PET_DETECT_THRESHOLD; int f = HVC_C2W_FACE_DETECT_THRESHOLD; int r = HVC_C2W_RECOGNITION_THRESHOLD; if (body != null) { b = body.intValue() * 1000; } if (hand != null) { h = hand.intValue() * 1000; } if (pet != null) { p = pet.intValue() * 1000; } if (face != null) { f = face.intValue() * 1000; } if (recognition != null) { r = recognition.intValue() * 1000; } Int ret = new Int(); mApi.setThreshold(b, h, p, f, r, ret); return ret.getIntValue(); } /** * Set Okao Execute's Min Max Size. * @param bodyMin body's min size * @param bodyMax body's max size * @param handMin hand's min size * @param handMax hand's max size * @param petMin pet's min size * @param petMax pet's max size * @param faceMin face's min size * @param faceMax face's max size * @return set result */ public int setMinMaxSize(final Double bodyMin, final Double bodyMax, final Double handMin, final Double handMax, final Double petMin, final Double petMax, final Double faceMin, final Double faceMax) { int bMin = HVC_C2W_BODY_MIN_SIZE; int bMax = HVC_C2W_BODY_MAX_SIZE; int hMin = HVC_C2W_HAND_MIN_SIZE; int hMax = HVC_C2W_HAND_MAX_SIZE; int pMin = HVC_C2W_PET_MIN_SIZE; int pMax = HVC_C2W_PET_MAX_SIZE; int fMin = HVC_C2W_FACE_MIN_SIZE; int fMax = HVC_C2W_FACE_MAX_SIZE; if (bodyMin != null) { bMin = bodyMin.intValue() * 8192; } if (bodyMax != null) { bMax = bodyMax.intValue() * 8192; } if (handMin != null) { hMin = handMin.intValue() * 8192; } if (handMax != null) { hMax = handMax.intValue() * 8192; } if (petMin != null) { pMin = petMin.intValue() * 8192; } if (petMax != null) { pMax = petMax.intValue() * 8192; } if (faceMin != null) { fMin = faceMin.intValue() * 8192; } if (faceMax != null) { fMax = faceMax.intValue() * 8192; } Int ret = new Int(); mApi.setSizeRange(bMin, bMax, hMin, hMax, pMin, pMax, fMin, fMax, ret); return ret.getIntValue(); } /** * convert to normalize expression value. * @param hvcExpression expression(HVC value) * @return normalize expression value. */ public static String convertToNormalizeExpression(final int hvcExpression) { String normalizeExpression = EXPRESSION_UNKNOWN; SparseArray<String> map = new SparseArray<>(); map.put(HVC_EX_NEUTRAL, EXPRESSION_UNKNOWN); map.put(HVC_EX_HAPPINESS, EXPRESSION_SMILE); map.put(HVC_EX_SURPRISE, EXPRESSION_SURPRISE); map.put(HVC_EX_ANGER, EXPRESSION_MAD); map.put(HVC_EX_SADNESS, EXPRESSION_SAD); String exp = map.get(hvcExpression); if (exp != null) { normalizeExpression = exp; } else { normalizeExpression = EXPRESSION_UNKNOWN; } return normalizeExpression; } /** * Post Request's Listener Class. */ public class PostMessageTask extends AsyncTask<String, Void, String> { /** Post Request's Listener. */ private ResponseListener listener = null; /** * Constructor. * @param listener Post Request's Listener */ public PostMessageTask(ResponseListener listener) { this.listener = listener; } @Override protected String doInBackground(String... params) { HttpsURLConnection conn = null; String json = null; try { URL url; if (params[1].isEmpty()) { url = new URL(params[0]); } else { url = new URL(params[0] + "?" + params[1]); } conn = (HttpsURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); if (params.length == 3) { // アクセストークンが必要なリクエストの場合 conn.setRequestProperty("Authorization", "Bearer " + params[2]); } conn.setDoInput(true); conn.setDoOutput(true); // POST conn.connect(); // レスポンス受信 if (conn.getResponseCode() == HttpsURLConnection.HTTP_OK) { StringBuilder sb = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = reader.readLine()) != null) { sb.append(line); } json = sb.toString(); } } catch(MalformedURLException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } catch(IOException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } finally { if(conn != null) { conn.disconnect(); } } return json; } @Override protected void onPostExecute(String param) { listener.onReceived(param); } } }