diff --git a/java/android/app/src/main/AndroidManifest.xml b/java/android/app/src/main/AndroidManifest.xml
index 9a809c9a4..51852eca7 100644
--- a/java/android/app/src/main/AndroidManifest.xml
+++ b/java/android/app/src/main/AndroidManifest.xml
@@ -22,8 +22,7 @@
+ android:name=".segmentation.SegmentationMainActivity">
results = new ArrayList<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Fullscreen
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
+ setContentView(R.layout.matting_activity_main);
+
+ // Clear all setting items to avoid app crashing due to the incorrect settings
+ initSettings();
+
+ // Check and request CAMERA and WRITE_EXTERNAL_STORAGE permissions
+ if (!checkAllPermissions()) {
+ requestAllPermissions();
+ }
+
+ // Init the camera preview and UI components
+ initView();
+ }
+
+ @SuppressLint("NonConstantResourceId")
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_switch:
+ svPreview.switchCamera();
+ break;
+ case R.id.btn_shutter:
+ TYPE = BTN_SHUTTER;
+ shutterAndPauseCamera();
+ resultView.setAdapter(null);
+ break;
+ case R.id.btn_settings:
+ startActivity(new Intent(MattingMainActivity.this, MattingSettingsActivity.class));
+ break;
+ case R.id.realtime_toggle_btn:
+ toggleRealtimeStyle();
+ break;
+ case R.id.back_in_preview:
+ finish();
+ break;
+ case R.id.album_select:
+ TYPE = ALBUM_SELECT;
+ // Judge whether authority has been granted.
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+ // If this permission was requested before the application but the user refused the request, this method will return true.
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE_STORAGE);
+ } else {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType("image/*");
+ startActivityForResult(intent, INTENT_CODE_PICK_IMAGE);
+ }
+ resultView.setAdapter(null);
+ break;
+ case R.id.back_in_result:
+ back();
+ break;
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ super.onBackPressed();
+ back();
+ }
+
+ private void back() {
+ resultPageView.setVisibility(View.GONE);
+ cameraPageView.setVisibility(View.VISIBLE);
+ TYPE = REALTIME_DETECT;
+ isShutterBitmapCopied = false;
+ svPreview.onResume();
+ results.clear();
+ }
+
+ private void shutterAndPauseCamera() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // Sleep some times to ensure picture has been correctly shut.
+ Thread.sleep(TIME_SLEEP_INTERVAL * 10); // 500ms
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ runOnUiThread(new Runnable() {
+ @SuppressLint("SetTextI18n")
+ public void run() {
+ // These codes will run in main thread.
+ svPreview.onPause();
+ cameraPageView.setVisibility(View.GONE);
+ resultPageView.setVisibility(View.VISIBLE);
+ if (shutterBitmap != null && !shutterBitmap.isRecycled()) {
+ detail(shutterBitmap);
+ } else {
+ new AlertDialog.Builder(MattingMainActivity.this)
+ .setTitle("Empty Result!")
+ .setMessage("Current picture is empty, please shutting it again!")
+ .setCancelable(true)
+ .show();
+ }
+ }
+ });
+ }
+ }).start();
+ }
+
+ private void copyBitmapFromCamera(Bitmap ARGB8888ImageBitmap) {
+ if (isShutterBitmapCopied || ARGB8888ImageBitmap == null) {
+ return;
+ }
+ if (!ARGB8888ImageBitmap.isRecycled()) {
+ synchronized (this) {
+ shutterBitmap = ARGB8888ImageBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ }
+ SystemClock.sleep(TIME_SLEEP_INTERVAL);
+ isShutterBitmapCopied = true;
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == INTENT_CODE_PICK_IMAGE) {
+ if (resultCode == Activity.RESULT_OK) {
+ cameraPageView.setVisibility(View.GONE);
+ resultPageView.setVisibility(View.VISIBLE);
+ Uri uri = data.getData();
+ String path = getRealPathFromURI(this, uri);
+ Bitmap bitmap = decodeBitmap(path, 720, 1280);
+ picBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
+ SystemClock.sleep(TIME_SLEEP_INTERVAL * 10); // 500ms
+ detail(picBitmap);
+ }
+ }
+ }
+
+ private void toggleRealtimeStyle() {
+ if (isRealtimeStatusRunning) {
+ isRealtimeStatusRunning = false;
+ realtimeToggleButton.setImageResource(R.drawable.realtime_stop_btn);
+ svPreview.setOnTextureChangedListener(this);
+ tvStatus.setVisibility(View.VISIBLE);
+ } else {
+ isRealtimeStatusRunning = true;
+ realtimeToggleButton.setImageResource(R.drawable.realtime_start_btn);
+ tvStatus.setVisibility(View.GONE);
+ isShutterBitmapCopied = false;
+ // Camera is still working but detecting loop is on pause.
+ svPreview.setOnTextureChangedListener(new CameraSurfaceView.OnTextureChangedListener() {
+ @Override
+ public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
+ if (TYPE == BTN_SHUTTER) {
+ copyBitmapFromCamera(ARGB8888ImageBitmap);
+ }
+ return false;
+ }
+ });
+ }
+ }
+
+ @Override
+ public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
+ if (TYPE == BTN_SHUTTER) {
+ copyBitmapFromCamera(ARGB8888ImageBitmap);
+ return false;
+ }
+
+ boolean modified = false;
+ // TODO: 2022/12/20
+// SegmentationResult result = new SegmentationResult();
+// result.setCxxBufferFlag(true);
+//
+ //long tc = System.currentTimeMillis();
+// predictor.predict(ARGB8888ImageBitmap, result);
+ //timeElapsed += (System.currentTimeMillis() - tc);
+//
+// Visualize.visSegmentation(ARGB8888ImageBitmap, result);
+// modified = result.initialized();
+//
+// result.releaseCxxBuffer();
+
+// frameCounter++;
+// if (frameCounter >= 30) {
+// final int fps = (int) (1000 / (timeElapsed / 30));
+// runOnUiThread(new Runnable() {
+// @SuppressLint("SetTextI18n")
+// public void run() {
+// tvStatus.setText(Integer.toString(fps) + "fps");
+// }
+// });
+// frameCounter = 0;
+// timeElapsed = 0;
+// }
+ return modified;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ // Reload settings and re-initialize the predictor
+ checkAndUpdateSettings();
+ // Open camera until the permissions have been granted
+ if (!checkAllPermissions()) {
+ svPreview.disableCamera();
+ } else {
+ svPreview.enableCamera();
+ }
+ svPreview.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ svPreview.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ // TODO: 2022/12/20
+// if (predictor != null) {
+// predictor.release();
+// }
+ super.onDestroy();
+ }
+
+ public void initView() {
+ TYPE = REALTIME_DETECT;
+ CameraSurfaceView.EXPECTED_PREVIEW_WIDTH = 480;
+ CameraSurfaceView.EXPECTED_PREVIEW_HEIGHT = 480;
+ svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview);
+ svPreview.setOnTextureChangedListener(this);
+ svPreview.switchCamera();
+
+ tvStatus = (TextView) findViewById(R.id.tv_status);
+ btnSwitch = (ImageButton) findViewById(R.id.btn_switch);
+ btnSwitch.setOnClickListener(this);
+ btnShutter = (ImageButton) findViewById(R.id.btn_shutter);
+ btnShutter.setOnClickListener(this);
+ btnSettings = (ImageButton) findViewById(R.id.btn_settings);
+ btnSettings.setOnClickListener(this);
+ realtimeToggleButton = findViewById(R.id.realtime_toggle_btn);
+ realtimeToggleButton.setOnClickListener(this);
+ backInPreview = findViewById(R.id.back_in_preview);
+ backInPreview.setOnClickListener(this);
+ albumSelectButton = findViewById(R.id.album_select);
+ albumSelectButton.setOnClickListener(this);
+ cameraPageView = findViewById(R.id.camera_page);
+ resultPageView = findViewById(R.id.result_page);
+ resultImage = findViewById(R.id.result_image);
+ backInResult = findViewById(R.id.back_in_result);
+ backInResult.setOnClickListener(this);
+ resultView = findViewById(R.id.result_list_view);
+ }
+
+ private void detail(Bitmap bitmap) {
+ // TODO: 2022/12/20
+ //predictor.predict(bitmap, true, 0.7f);
+ resultImage.setImageBitmap(bitmap);
+ }
+
+ @SuppressLint("ApplySharedPref")
+ public void initSettings() {
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.clear();
+ editor.commit();
+ MattingSettingsActivity.resetSettings();
+ }
+
+ public void checkAndUpdateSettings() {
+ if (MattingSettingsActivity.checkAndUpdateSettings(this)) {
+ String realModelDir = getCacheDir() + "/" + MattingSettingsActivity.modelDir;
+ Utils.copyDirectoryFromAssets(this, MattingSettingsActivity.modelDir, realModelDir);
+
+ String modelFile = realModelDir + "/" + "model.pdmodel";
+ String paramsFile = realModelDir + "/" + "model.pdiparams";
+ String configFile = realModelDir + "/" + "deploy.yaml";
+ RuntimeOption option = new RuntimeOption();
+ option.setCpuThreadNum(MattingSettingsActivity.cpuThreadNum);
+ option.setLitePowerMode(MattingSettingsActivity.cpuPowerMode);
+ if (Boolean.parseBoolean(MattingSettingsActivity.enableLiteFp16)) {
+ option.enableLiteFp16();
+ }
+ // TODO: 2022/12/20
+ //predictor.setIsVerticalScreen(true);
+ //predictor.init(modelFile, paramsFile, configFile, option);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+ @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
+ new AlertDialog.Builder(MattingMainActivity.this)
+ .setTitle("Permission denied")
+ .setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " +
+ "App->Permissions to grant all of the permissions.")
+ .setCancelable(false)
+ .setPositiveButton("Exit", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ MattingMainActivity.this.finish();
+ }
+ }).show();
+ }
+ }
+
+ private void requestAllPermissions() {
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA}, 0);
+ }
+
+ private boolean checkAllPermissions() {
+ return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
+ && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
+ }
+
+}
\ No newline at end of file
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingSettingsActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingSettingsActivity.java
new file mode 100644
index 000000000..91be07da1
--- /dev/null
+++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingSettingsActivity.java
@@ -0,0 +1,164 @@
+package com.baidu.paddle.fastdeploy.app.examples.matting;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.PreferenceManager;
+import android.support.v7.app.ActionBar;
+
+import com.baidu.paddle.fastdeploy.app.examples.R;
+import com.baidu.paddle.fastdeploy.ui.Utils;
+import com.baidu.paddle.fastdeploy.ui.view.AppCompatPreferenceActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MattingSettingsActivity extends AppCompatPreferenceActivity implements
+ SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = MattingSettingsActivity.class.getSimpleName();
+
+ static public int selectedModelIdx = -1;
+ static public String modelDir = "";
+ static public int cpuThreadNum = 2;
+ static public String cpuPowerMode = "";
+ static public String enableLiteFp16 = "true";
+
+ ListPreference lpChoosePreInstalledModel = null;
+ EditTextPreference etModelDir = null;
+ ListPreference lpCPUThreadNum = null;
+ ListPreference lpCPUPowerMode = null;
+ ListPreference lpEnableLiteFp16 = null;
+
+ List preInstalledModelDirs = null;
+ List preInstalledCPUThreadNums = null;
+ List preInstalledCPUPowerModes = null;
+ List preInstalledEnableLiteFp16s = null;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.matting_settings);
+ ActionBar supportActionBar = getSupportActionBar();
+ if (supportActionBar != null) {
+ supportActionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ // Initialize pre-installed models
+ preInstalledModelDirs = new ArrayList();
+ preInstalledCPUThreadNums = new ArrayList();
+ preInstalledCPUPowerModes = new ArrayList();
+ preInstalledEnableLiteFp16s = new ArrayList();
+ preInstalledModelDirs.add(getString(R.string.MATTING_MODEL_DIR_DEFAULT));
+ preInstalledCPUThreadNums.add(getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ preInstalledCPUPowerModes.add(getString(R.string.CPU_POWER_MODE_DEFAULT));
+ preInstalledEnableLiteFp16s.add(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+
+ // Setup UI components
+ lpChoosePreInstalledModel =
+ (ListPreference) findPreference(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY));
+ String[] preInstalledModelNames = new String[preInstalledModelDirs.size()];
+ for (int i = 0; i < preInstalledModelDirs.size(); i++) {
+ preInstalledModelNames[i] = preInstalledModelDirs.get(i).substring(preInstalledModelDirs.get(i).lastIndexOf("/") + 1);
+ }
+ lpChoosePreInstalledModel.setEntries(preInstalledModelNames);
+ lpChoosePreInstalledModel.setEntryValues(preInstalledModelDirs.toArray(new String[preInstalledModelDirs.size()]));
+ lpCPUThreadNum = (ListPreference) findPreference(getString(R.string.CPU_THREAD_NUM_KEY));
+ lpCPUPowerMode = (ListPreference) findPreference(getString(R.string.CPU_POWER_MODE_KEY));
+ etModelDir = (EditTextPreference) findPreference(getString(R.string.MODEL_DIR_KEY));
+ etModelDir.setTitle("Model dir (SDCard: " + Utils.getSDCardDirectory() + ")");
+ lpEnableLiteFp16 = (ListPreference) findPreference(getString(R.string.ENABLE_LITE_FP16_MODE_KEY));
+ }
+
+ @SuppressLint("ApplySharedPref")
+ private void reloadSettingsAndUpdateUI() {
+ SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
+
+ String selected_model_dir = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
+ getString(R.string.MATTING_MODEL_DIR_DEFAULT));
+ int selected_model_idx = lpChoosePreInstalledModel.findIndexOfValue(selected_model_dir);
+ if (selected_model_idx >= 0 && selected_model_idx < preInstalledModelDirs.size() && selected_model_idx != selectedModelIdx) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putString(getString(R.string.MODEL_DIR_KEY), preInstalledModelDirs.get(selected_model_idx));
+ editor.putString(getString(R.string.CPU_THREAD_NUM_KEY), preInstalledCPUThreadNums.get(selected_model_idx));
+ editor.putString(getString(R.string.CPU_POWER_MODE_KEY), preInstalledCPUPowerModes.get(selected_model_idx));
+ editor.putString(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT), preInstalledEnableLiteFp16s.get(selected_model_idx));
+ editor.commit();
+ lpChoosePreInstalledModel.setSummary(selected_model_dir);
+ selectedModelIdx = selected_model_idx;
+ }
+
+ String model_dir = sharedPreferences.getString(getString(R.string.MODEL_DIR_KEY),
+ getString(R.string.MATTING_MODEL_DIR_DEFAULT));
+ String cpu_thread_num = sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY),
+ getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ String cpu_power_mode = sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY),
+ getString(R.string.CPU_POWER_MODE_DEFAULT));
+ String enable_lite_fp16 = sharedPreferences.getString(getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
+ getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+
+ etModelDir.setSummary(model_dir);
+ lpCPUThreadNum.setValue(cpu_thread_num);
+ lpCPUThreadNum.setSummary(cpu_thread_num);
+ lpCPUPowerMode.setValue(cpu_power_mode);
+ lpCPUPowerMode.setSummary(cpu_power_mode);
+ lpEnableLiteFp16.setValue(enable_lite_fp16);
+ lpEnableLiteFp16.setSummary(enable_lite_fp16);
+
+ }
+
+ static boolean checkAndUpdateSettings(Context ctx) {
+ boolean settingsChanged = false;
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
+
+ String model_dir = sharedPreferences.getString(ctx.getString(R.string.MODEL_DIR_KEY),
+ ctx.getString(R.string.MATTING_MODEL_DIR_DEFAULT));
+ settingsChanged |= !modelDir.equalsIgnoreCase(model_dir);
+ modelDir = model_dir;
+
+ String cpu_thread_num = sharedPreferences.getString(ctx.getString(R.string.CPU_THREAD_NUM_KEY),
+ ctx.getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ settingsChanged |= cpuThreadNum != Integer.parseInt(cpu_thread_num);
+ cpuThreadNum = Integer.parseInt(cpu_thread_num);
+
+ String cpu_power_mode = sharedPreferences.getString(ctx.getString(R.string.CPU_POWER_MODE_KEY),
+ ctx.getString(R.string.CPU_POWER_MODE_DEFAULT));
+ settingsChanged |= !cpuPowerMode.equalsIgnoreCase(cpu_power_mode);
+ cpuPowerMode = cpu_power_mode;
+
+ String enable_lite_fp16 = sharedPreferences.getString(ctx.getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
+ ctx.getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+ settingsChanged |= !enableLiteFp16.equalsIgnoreCase(enable_lite_fp16);
+ enableLiteFp16 = enable_lite_fp16;
+
+ return settingsChanged;
+ }
+
+ static void resetSettings() {
+ selectedModelIdx = -1;
+ modelDir = "";
+ cpuThreadNum = 2;
+ cpuPowerMode = "";
+ enableLiteFp16 = "true";
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ reloadSettingsAndUpdateUI();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ reloadSettingsAndUpdateUI();
+ }
+}
\ No newline at end of file
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingWelcomeActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingWelcomeActivity.java
new file mode 100644
index 000000000..c47ed9b3e
--- /dev/null
+++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/matting/MattingWelcomeActivity.java
@@ -0,0 +1,30 @@
+package com.baidu.paddle.fastdeploy.app.examples.matting;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import com.baidu.paddle.fastdeploy.app.examples.R;
+
+public class MattingWelcomeActivity extends Activity {
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ );
+ getWindow().setStatusBarColor(Color.TRANSPARENT);
+ }
+ setContentView(R.layout.matting_welcome);
+ }
+
+ public void startActivity(View view) {
+ Intent intent = new Intent(MattingWelcomeActivity.this, MattingMainActivity.class);
+ startActivity(intent);
+ }
+}
\ No newline at end of file
diff --git a/java/android/app/src/main/res/layout/matting_activity_main.xml b/java/android/app/src/main/res/layout/matting_activity_main.xml
new file mode 100644
index 000000000..f07f0faea
--- /dev/null
+++ b/java/android/app/src/main/res/layout/matting_activity_main.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/android/app/src/main/res/layout/matting_camera_page.xml b/java/android/app/src/main/res/layout/matting_camera_page.xml
new file mode 100644
index 000000000..de2788179
--- /dev/null
+++ b/java/android/app/src/main/res/layout/matting_camera_page.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/android/app/src/main/res/layout/matting_result_page.xml b/java/android/app/src/main/res/layout/matting_result_page.xml
new file mode 100644
index 000000000..f1e4cbd92
--- /dev/null
+++ b/java/android/app/src/main/res/layout/matting_result_page.xml
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/android/app/src/main/res/layout/matting_welcome.xml b/java/android/app/src/main/res/layout/matting_welcome.xml
new file mode 100644
index 000000000..cd85572fb
--- /dev/null
+++ b/java/android/app/src/main/res/layout/matting_welcome.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/android/app/src/main/res/values/strings.xml b/java/android/app/src/main/res/values/strings.xml
index 28d034e99..49fe3642b 100644
--- a/java/android/app/src/main/res/values/strings.xml
+++ b/java/android/app/src/main/res/values/strings.xml
@@ -46,6 +46,8 @@
models
models
models/uie-nano
+
+ models
拍照识别
实时识别
diff --git a/java/android/app/src/main/res/xml/matting_settings.xml b/java/android/app/src/main/res/xml/matting_settings.xml
new file mode 100644
index 000000000..a4feba11d
--- /dev/null
+++ b/java/android/app/src/main/res/xml/matting_settings.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file