[JAVA] Essayez d'utiliser l'API Emotion d'Android

Cet article a été écrit sur le blog avant, mais comme il s'agit d'un blog auquel personne ne vient, j'ai pensé que Qiita serait mieux et l'a posté à nouveau.

J'ai participé au Ishimaki Hackason qui s'est tenu du 28 juillet au 30 juillet.

Par conséquent, j'ai parfois utilisé l'API Emotion de Microsoft Cognitive Services à partir d'Android, donc je l'écrirai sous forme de mémo à ce moment-là.

Je me suis référé au site suivant pour la mise en œuvre. http://qiita.com/kosfuji/items/575408ae17113d7b58e9 http://qiita.com/a_nishimura/items/19cf3f60ad1dd3f66a84

L'exemple d'implémentation officiel avait du code java, mais depuis Android 6.0, le client HTTP Apache n'est plus pris en charge, j'ai donc dû utiliser HttpUrlConnection. # Préparation

Ici car vous avez besoin d'une clé d'abonnement pour utiliser l'API > Connectez-vous avec votre compte Microsoft pour obtenir votre clé d'abonnement.

Puisque la communication HTTP est effectuée, ajoutez l'autorisation INTERNET.

<uses-permission android:name="android.permission.INTERNET" />
# Exemple d'implémentation

Commencez par créer une classe qui hérite d'AsyncTask pour configurer un thread de communication.

public class ConnectToEmotionAPI extends AsyncTask<Void, Void, JSONObject> {
    @Override
    protected void onPreExecute() {
    }
    @Override
    protected JSONObject doInBackground(Void... params) {
    }
    @Override
    protected void onPostExecute(JSONObject result) {
    }
}

Étant donné que le résultat de l'analyse de l'image de l'API Emotion est renvoyé dans JSON, la valeur de retour de doInBackground doit être JSONObject.

Ensuite, nous écrirons le processus de communication dans doInBackground.

HttpURLConnection con = null;
URL url = null;
String urlStr = "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize";
String key = "{Your Key}";                  //Subscription Key
DataOutputStream os = null;
BufferedReader reader;
JSONObject json = null;

try {
            url = new URL(urlStr);
            con = (HttpURLConnection)url.openConnection();
            con.setReadTimeout(10000);
            con.setConnectTimeout(20000);
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            //Demander les paramètres d'en-tête
            con.setRequestProperty("Content-Type", "application/octet-stream");
            con.setRequestProperty("Ocp-Apim-Subscription-Key", key);

            //Créer un corps de requête
            Resources r = main_.getResources();
            Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.face_small);

            //Convertir l'image en données binaires
            byte[] byteArray;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
            byteArray = bos.toByteArray();

            os = new DataOutputStream(con.getOutputStream());
            for(int i =  0 ; i < byteArray.length;i++){
                   os.writeByte(byteArray[i]);
            }

            //Connectez-vous à l'API
            con.connect();
            os.close();
            
            int status = con.getResponseCode();

            switch (status) {
                case HttpURLConnection.HTTP_OK:
                    InputStream in = con.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(in));
                    String line;
                    String readStr = new String();

                    while (null != (line = reader.readLine())){
                        readStr += line;
                    }
                    Log.d("EmotionAPI","read string: " + readStr);

                    in.close();

                    json = new JSONArray(readStr).getJSONObject(0);
                    break;

                case HttpURLConnection.HTTP_UNAUTHORIZED:
                    break;
                default:
                    break;
            }

} catch (MalformedURLException e){
            e.printStackTrace();
} catch (JSONException e){
            e.printStackTrace();
} catch (IOException e){
            e.printStackTrace();
}

return json;

Lors de l'envoi d'une image, nous utilisons ByteArrayOutputStream pour l'envoyer sous forme de données binaires.

Le JSON renvoyé est au format tableau, utilisez donc JSONArray pour analyser le JSON.

Enfin, le JSON acquis par onPostExecute est analysé pour chaque nom d'objet.

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);

        JSONObject jsonData;
        String[] str = new String[2];
        try {
            jsonData = result.getJSONObject("scores");
            str[0] = jsonData.getString("happiness");
            str[1] = jsonData.getString("anger");
        } catch (Exception e){
            e.printStackTrace();
        }

        if (isSmile(str[0])) {
            Log.d("EmotionAPI","C'est un joli sourire!");
        } else if (isAnger(str[1])) {
            Log.d("EmotionAPI","Ne sois pas si en colère~");
        } else {
            Log.d("EmotionAPI","C'est ennuyant. Veuillez réagir quelque chose");
        }
    }

    public boolean isSmile(String strValue){

        double value = Double.parseDouble(strValue);
        if (value > 0.5) return true;
        else return false;
    }

    public boolean isAnger(String strValue){

        double value = Double.parseDouble(strValue);
        if (value > 0.5) return true;
        else return false;
    }

Le code implémenté dans Hackason est publié sur GitHub, veuillez donc le voir pour l'ensemble de l'implémentation. Github EmotionAPI Sample

Recommended Posts

Essayez d'utiliser l'API Emotion d'Android
Essayez d'utiliser le service sur Android Oreo
Essayez d'utiliser l'API Stream en Java
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Essayez d'utiliser Cocoa de Ruby
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
[Parse] Hit l'API en utilisant callFunctionInBackground
Essayez d'utiliser le système de messagerie Pulsar
Essayez d'utiliser la fonction de mesure en deux points de Firebase Performance Monitoring. [Android]
Essayez d'utiliser || au lieu de l'opérateur ternaire
Traitement des données à l'aide de l'API de flux de Java 8
Accédez à l'API REST Salesforce depuis Java
Essayez d'utiliser l'API au format JSON en Java
Essayez d'utiliser la télécommande Wii en Java
Essayez d'émettre ou d'obtenir une carte de Jave à Trello à l'aide de l'API
[Java] Générez une liste restreinte à partir de plusieurs listes à l'aide de l'API Stream
Appelez l'API Microsoft Emotion en envoyant des données d'image directement depuis Java.
Essayez d'utiliser Firebase Cloud Functions sur Android (Java)
Essayez d'utiliser libGDX
POST des images d'Android vers PHP en utilisant Retrofit
Utilisation de JUnit à partir de la ligne de commande sur Ubuntu
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Essayez d'utiliser Maven
Essayez d'utiliser powermock-mockito2-2.0.2
Essayez d'utiliser GraalVM
Essayez d'utiliser jmockit 1.48
[Java] Obtenez et affichez la date 10 jours plus tard à l'aide de l'API Time ajoutée à partir de Java 8.
Les débutants essaient d'utiliser Android Studio Partie 2 (traitement des événements)
Essayez d'appeler le service CORBA depuis Spring (Java)
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Les débutants essaient d'utiliser Android Studio Partie 1 (Hello World)
[API] J'ai essayé d'utiliser l'API de recherche par code postal
Essayez d'utiliser SwiftLint
Essayez d'utiliser Log4j 2.0
Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~
Essayez la communication en utilisant gRPC sur un serveur Android + Java
Essayez d'implémenter le tamis Eratostenes en utilisant la bibliothèque standard de Java
Faire vibrer le bracelet avec Bluetooth à partir de l'application Android
Appelons IBM Watson Assistant 2018-07-10 à partir du SDK Java.
Essayez de mettre en œuvre à l'aide de l'API de recherche de produits Rakuten (facile)
Essayez la classification d'image à l'aide de TensorFlow Lite sur Android (JAVA)
[Android] Téléchargement d'images du terminal vers le serveur
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook
Commande pour essayer d'utiliser Docker pour le moment
Essayez d'utiliser l'attribut de requête Ruby on Rails
Essayez d'utiliser le Framework Axon
Compatible avec Android 10 (API 29)
Essayez d'utiliser l'API REST de JobScheduler
Essayez d'utiliser la WhiteBox de PowerMock
Essayez d'utiliser Talend Part 2
Essayez d'utiliser Talend Part 1
Essayez d'utiliser la liste F #
Essayez d'utiliser la méthode each_with_index
Essayez d'utiliser Spring JDBC