人脸检测app

修改为调用摄像机后的代码
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Looper;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Handler;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import androidx.annotation.Nullable;

public class MainActivity extends AppCompatActivity {

private static final int CAMERA_REQUEST = 1;
private ImageView imageView;
private TextView textView;

private String accessToken;
private Bitmap selectedImageBitmap;

private static final String BAIDU_API_KEY = "YnFw5LSDvq76bzSdjWuGWlXL";
private static final String BAIDU_SECRET_KEY = "lOa0jDMgcQT0baNlzjIR7GMwCFoFEUUy";
private static final String FACE_DETECT_URL = "https://aip.baidubce.com/rest/2.0/face/v3/detect";

private final OkHttpClient client = new OkHttpClient();
private final Handler handler = new Handler(Looper.getMainLooper());
private final ExecutorService executorService = Executors.newSingleThreadExecutor();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button buttonRecordMood = findViewById(R.id.button_record_mood);
buttonRecordMood.setOnClickListener(view -> openCamera());

Button buttonViewRecords = findViewById(R.id.button_view_records);
buttonViewRecords.setOnClickListener(view -> viewRecords());

getAccessTokenAsync();
}

private void openCamera() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK && data != null && requestCode == CAMERA_REQUEST) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
selectedImageBitmap = bitmap;
String imageBase64 = bitmapToBase64(bitmap);
sendFaceDetectRequest(imageBase64);
}
}

private String bitmapToBase64(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

private void getAccessTokenAsync() {
executorService.execute(() -> {
this.accessToken = getAccessToken();
handler.post(() -> {
if (this.accessToken == null) {
Log.e("MainActivity", "Failed to get access token");
}
});
});
}

private void sendFaceDetectRequest(String imageBase64) {
if (accessToken == null) {
Log.e("MainActivity", "Access token is null, cannot send face detect request.");
return;
}
executorService.execute(() -> {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("image", imageBase64);
jsonObject.addProperty("image_type", "BASE64");
jsonObject.addProperty("face_field", "age,beauty,expression");
String jsonStr = new Gson().toJson(jsonObject);

MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(jsonStr, mediaType);

Request request = new Request.Builder()
.url(FACE_DETECT_URL + "?access_token=" + this.accessToken)
.post(body)
.build();

try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String responseStr = response.body().string();
handler.post(() -> {
try {
JSONObject jsonResponse = new JSONObject(responseStr);
JSONObject result = jsonResponse.optJSONObject("result");
if (result != null) {
int age = result.getJSONArray("face_list").getJSONObject(0).getInt("age");
String beauty = result.getJSONArray("face_list").getJSONObject(0).getString("beauty");
String expression = result.getJSONArray("face_list").getJSONObject(0).getString("expression");

String resultText = "Age: " + age + "\nBeauty: " + beauty + "\nExpression: " + expression;

Intent intent = new Intent(MainActivity.this, MoodRecordActivity.class);
intent.putExtra("age", String.valueOf(age)); // 确保年龄是字符串类型
intent.putExtra("beauty", beauty);
intent.putExtra("expression", expression);
intent.putExtra("image", imageBase64);
startActivity(intent);
} else {
Log.e("MainActivity", "Face detect request failed: result is null");
}
} catch (JSONException e) {
e.printStackTrace();
}
});
} else {
Log.e("MainActivity", "Face detect request failed");
}
} catch (IOException e) {
e.printStackTrace();
}
});
}

private String getAccessToken() {
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
RequestBody body = new FormBody.Builder()
.add("grant_type", "client_credentials")
.add("client_id", BAIDU_API_KEY)
.add("client_secret", BAIDU_SECRET_KEY)
.build();

Request request = new Request.Builder()
.url(authHost)
.post(body)
.build();

try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String responseBody = response.body().string();
JsonObject jsonObject = new Gson().fromJson(responseBody, JsonObject.class);
return jsonObject.get("access_token").getAsString();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

private void viewRecords() {
Intent intent = new Intent(this, ViewRecordsActivity.class);
startActivity(intent);
}

@Override
protected void onDestroy() {
super.onDestroy();
executorService.shutdown();
}
}
posted @   涨涨涨张  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-05-11 C++
点击右上角即可分享
微信分享提示