[JAVA] Versuchen Sie es mit der Emotion API von Android

Dieser Artikel wurde bereits im Blog geschrieben, aber da es sich um ein Blog handelt, zu dem niemand kommt, dachte ich, dass Qiita besser wäre, und veröffentlichte es erneut.

Ich habe am Ishimaki Hackason vom 28. bis 30. Juli teilgenommen.

Daher habe ich manchmal die Emotion-API von Microsoft Cognitive Services von Android verwendet, sodass ich sie zu diesem Zeitpunkt als Memo schreibe.

Ich habe zur Implementierung auf die folgende Site verwiesen. http://qiita.com/kosfuji/items/575408ae17113d7b58e9 http://qiita.com/a_nishimura/items/19cf3f60ad1dd3f66a84

Das offizielle Implementierungsbeispiel enthielt Java-Code, aber seit Android 6.0 wird der Apache HTTP-Client nicht mehr unterstützt, sodass ich HttpUrlConnection verwenden musste. # Vorbereitung

Hier </ a > Melden Sie sich mit Ihrem Microsoft-Konto an, um Ihren Abonnementschlüssel zu erhalten.

Da eine HTTP-Kommunikation durchgeführt wird, fügen Sie die INTERNET-Berechtigung hinzu.

<uses-permission android:name="android.permission.INTERNET" />
# Implementierungsbeispiel

Erstellen Sie zunächst eine Klasse, die AsyncTask erbt, um einen Thread für die Kommunikation einzurichten.

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

Da das Ergebnis der Analyse des Bildes von der Emotion-API in JSON zurückgegeben wird, sollte der Rückgabewert von doInBackground JSONObject sein.

Als nächstes schreiben wir den Kommunikationsprozess in 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);
            //Header-Einstellungen anfordern
            con.setRequestProperty("Content-Type", "application/octet-stream");
            con.setRequestProperty("Ocp-Apim-Subscription-Key", key);

            //Anforderungshauptteil erstellen
            Resources r = main_.getResources();
            Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.face_small);

            //Bild in Binärdaten konvertieren
            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]);
            }

            //Stellen Sie eine Verbindung zur API her
            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;

Beim Senden eines Bildes verwenden wir ByteArrayOutputStream, um es als Binärdaten zu senden.

Der zurückgegebene JSON liegt im Array-Format vor. Verwenden Sie daher JSONArray, um den JSON zu analysieren.

Schließlich wird der von onPostExecute erfasste JSON für jeden Objektnamen analysiert.

    @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","Es ist ein schönes Lächeln!");
        } else if (isAnger(str[1])) {
            Log.d("EmotionAPI","Sei nicht so wütend~");
        } else {
            Log.d("EmotionAPI","Es ist langweilig. Bitte reagieren Sie etwas");
        }
    }

    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;
    }

Der in Hackason implementierte Code wird auf GitHub veröffentlicht. Bitte beachten Sie dies für die gesamte Implementierung. Github EmotionAPI Sample

Recommended Posts

Versuchen Sie es mit der Emotion API von Android
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Versuchen Sie es mit der Stream-API in Java
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Versuchen Sie es mit Cocoa von Ruby
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an
[Parse] Drücken Sie die API mit callFunctionInBackground
Versuchen Sie es mit dem Nachrichtensystem Pulsar
Versuchen Sie es mit der Zweipunktmessfunktion von Firebase Performance Monitoring. [Android]
Versuchen Sie, || anstelle des ternären Operators zu verwenden
Datenverarbeitung mit der Stream-API von Java 8
Rufen Sie die Salesforce REST-API von Java aus auf
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie es mit der Wii-Fernbedienung in Java
Versuchen Sie, mithilfe der API eine Karte von Jave an Trello auszustellen oder zu erhalten
[Java] Generieren Sie mithilfe der Stream-API eine verengte Liste aus mehreren Listen
Rufen Sie die Microsoft Emotion API auf, indem Sie Bilddaten direkt von Java senden.
Versuchen Sie, Firebase Cloud-Funktionen unter Android (Java) zu verwenden.
Versuchen Sie es mit libGDX
POST-Bilder von Android auf PHP mit Retrofit
Verwenden von JUnit über die Befehlszeile unter Ubuntu
ChatWork4j für die Verwendung der ChatWork-API in Java
Versuchen Sie es mit Maven
Versuchen Sie es mit powermock-mockito2-2.0.2
Versuchen Sie es mit GraalVM
Versuchen Sie es mit jmockit 1.48
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Anfänger versuchen Android Studio Teil 2 (Ereignisverarbeitung)
Versuchen Sie, den CORBA-Dienst von Spring (Java) aus aufzurufen.
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Anfänger versuchen Android Studio Teil 1 (Hello World)
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Versuchen Sie es mit SwiftLint
Versuchen Sie es mit Log4j 2.0
Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
Versuchen Sie, das Eratostenes-Sieb mithilfe der Java-Standardbibliothek zu implementieren
Lassen Sie das Armbandgerät mit Bluetooth über die Android-App vibrieren
Rufen wir IBM Watson Assistant 2018-07-10 aus dem Java SDK auf.
Versuchen Sie die Bildklassifizierung mit TensorFlow Lite unter Android (JAVA).
[Android] Hochladen von Bildern vom Terminal auf den Server
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek
Befehl, um Docker vorerst zu verwenden
Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut
Versuchen Sie es mit dem Axon Framework
Kompatibel mit Android 10 (API 29)
Versuchen Sie es mit der REST-API von JobScheduler
Versuchen Sie es mit der WhiteBox von PowerMock
Versuchen Sie es mit Talend Teil 2
Versuchen Sie es mit Talend Teil 1
Versuchen Sie es mit der F # -Liste
Versuchen Sie es mit der Methode each_with_index
Versuchen Sie es mit Spring JDBC