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. p> # 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. p>
<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. p>
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