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. p> # 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. p>
<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. 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) {
}
}
É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