更新时间:2025-11-21 GMT+08:00
分享

代码示例

build.gradle.kts

import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
}
android {
    namespace = "com.huawei.clouddevice.ai.sampleapp"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.huawei.clouddevice.ai.sampleapp"
        minSdk = 24
        targetSdk = 34
        buildToolsVersion = "35.0.0"
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }
    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.15"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}
kotlin {
    compilerOptions {
        jvmTarget = JvmTarget.fromTarget("17")     }
}
dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))

    compileOnly(libs.projectlombok.lombok)
    annotationProcessor(libs.projectlombok.lombok)
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.lifecycle.runtime.ktx)
    implementation(libs.androidx.activity.compose)
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.ui)
    implementation(libs.androidx.ui.graphics)
    implementation(libs.androidx.ui.tooling.preview)
    implementation(libs.androidx.material3)
    implementation(libs.androidx.material.icons.extended)
    implementation(libs.androidx.navigation.compose)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.ui.test.junit4)
    debugImplementation(libs.androidx.ui.tooling)
    debugImplementation(libs.androidx.ui.test.manifest)
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <queries>
        <package android:name="com.huawei.clouddevice.ai.core" />
    </queries>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:enableOnBackInvokedCallback="true"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SDKTestApp"
        tools:targetApi="34">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/Theme.SDKTestApp">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.kt

package com.huawei.clouddevice.ai.sampleapp
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.navigation.compose.rememberNavController
import com.huawei.clouddevice.ai.sampleapp.ui.theme.SDKTestAppTheme
class MainActivity : ComponentActivity() {
    private var shared: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            SDKTestAppTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val navController = rememberNavController()
                    AppNavigation(navController = navController, shared = shared)
                    // 如果有分享内容,直接导航到网页库页面
                    if (shared != null) {
                        navController.navigate("html_page_library")
                    }
                }
            }
        }
    }
}

AppNavigation.kt

package com.huawei.clouddevice.ai.sampleapp
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.huawei.clouddevice.ai.nlp.entity.EntityExtraction
import com.huawei.clouddevice.ai.nlp.entity.EntityExtractorOptions
import com.huawei.clouddevice.ai.sampleapp.ui.screens.HomeScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.intents.IntentCallScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.intents.IntentChatScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.intents.IntentOpenAppScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.nlp.NlpEntityExtractorScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.nlp.NlpSceneRecognizerScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.speech.SpeechAudioToTextSpeech
import com.huawei.clouddevice.ai.sampleapp.ui.screens.speech.SpeechVideoToTextScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.vision.VisionImageLabelScreen
import com.huawei.clouddevice.ai.sampleapp.ui.screens.vision.VisionSceneRecognizerScreen
import com.huawei.clouddevice.ai.vision.label.ImageLabelerOptions
import com.huawei.clouddevice.ai.vision.label.ImageLabeling
import com.huawei.clouddevice.ai.sampleapp.ui.screens.library.HtmlPageLibraryScreen
@Composable
fun AppNavigation(navController: NavHostController, shared: String? = null) {
    NavHost(
        navController = navController,
        startDestination = "home"
    ) {
        composable("home") { HomeScreen(navController) }
        // Intents Kit功能页面
        composable("intent_chat") { IntentChatScreen(navController) }
        composable("intent_open_app") { IntentOpenAppScreen(navController) }
        composable("intent_call") { IntentCallScreen(navController) }
        // Nlp Kit功能页面
        composable("nlp_entity_extractor") {
            NlpEntityExtractorScreen(
                navController,
                EntityExtraction.getClient(EntityExtractorOptions.create(LocalContext.current))
            )
        }
        composable("nlp_scene_recognizer") {
            NlpSceneRecognizerScreen(
                navController,
                com.huawei.clouddevice.ai.nlp.scene.SceneRecognition.getClient(
                    com.huawei.clouddevice.ai.nlp.scene.SceneRecognizerOptions.create(LocalContext.current)
                )
            )
        }
        // Speech Kit功能页面
        composable("speech_audio_to_text") { SpeechAudioToTextSpeech(navController) }
        composable("speech_video_to_text") { SpeechVideoToTextScreen(navController) }
        // Vision Kit功能页面
        composable("vision_image_label") {
            VisionImageLabelScreen(
                navController,
                ImageLabeling.getClient(ImageLabelerOptions.create(LocalContext.current))
            )
        }
        composable("vision_scene_recognizer") {
            VisionSceneRecognizerScreen(
                navController,
                com.huawei.clouddevice.ai.vision.scene.SceneRecognition.getClient(
                    com.huawei.clouddevice.ai.vision.scene.SceneRecognizerOptions.create(
                        LocalContext.current
                    )
                )
            )
        }
        // Network Kit功能页面
        composable("html_page_library") { HtmlPageLibraryScreen(navController, shared = shared) }
    }
}

HomeScreen.kt

主页显示功能菜单,并导航到各个功能模块。

package com.huawei.clouddevice.ai.sampleapp.ui.screens
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.BookOnline
import androidx.compose.material.icons.filled.ChatBubbleOutline
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material.icons.filled.NetworkWifi
import androidx.compose.material.icons.filled.SpatialAudio
import androidx.compose.material.icons.filled.TextFormat
import androidx.compose.material.icons.filled.Videocam
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.huawei.clouddevice.ai.sampleapp.ui.theme.SDKTestAppTheme
data class CategoryItem(
    val title: String,
    val icon: ImageVector,
    val subItems: List<SubItem>
)
data class SubItem(
    val title: String,
    val route: String,
    val description: String
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HomeScreen(navController: NavController) {
    var expandedCategories by remember { mutableStateOf(setOf<String>()) }
    val categories = listOf(
        CategoryItem(
            title = "Intents Kit",
            icon = Icons.Default.ChatBubbleOutline,
            subItems = listOf(
                SubItem("聊天", "intent_chat", "与AI助手进行对话、问答(暂无)"),
                SubItem("打开应用", "intent_open_app", "使用自然语言打开指定APP(暂无)"),
                SubItem("打电话", "intent_call", "使用自然语言给指定联系人/号码打电话(暂无)")
            )
        ),
        CategoryItem(
            title = "Nlp Kit",
            icon = Icons.Default.TextFormat,
            subItems = listOf(
                SubItem("实体提取", "nlp_entity_extractor", "识别文本中的实体,如:地址、时间-日期、电子邮件、电话号码、网址"),
                SubItem("场景识别", "nlp_scene_recognizer", "根据文本识别场景,如:播放视频、查询火车票")
            )
        ),
        CategoryItem(
            title = "Speech Kit",
            icon = Icons.Default.SpatialAudio,
            subItems = listOf(
                SubItem("语音转文本", "speech_audio_to_text", "将音频文件转换成文本(暂无)"),
                SubItem("视频转文本", "speech_video_to_text", "将视频中的音频转换成文本(暂无)")
            )
        ),
        CategoryItem(
            title = "Vision Kit",
            icon = Icons.Default.Videocam,
            subItems = listOf(
                SubItem("图像标签", "vision_image_label", "给图像打上标签,如:人物、动物、风景、游戏"),
                SubItem("场景识别", "vision_scene_recognizer", "根据图像识别场景,如:播放视频、查询火车票")
            )
        ),
        CategoryItem(
            title = "知识库 Kit",
            icon = Icons.Default.BookOnline,
            subItems = listOf(
                SubItem("网页知识库", "html_page_library", "查看分享的网页内容")
            )
        )
    )
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        // 标题栏
        Card(
            modifier = Modifier
                .fillMaxWidth()
                .padding(bottom = 16.dp),
            colors = CardDefaults.cardColors(
                containerColor = MaterialTheme.colorScheme.primaryContainer
            )
        ) {
            Column(
                modifier = Modifier.padding(16.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text(
                    text = "SDK测试",
                    style = MaterialTheme.typography.headlineMedium,
                    color = MaterialTheme.colorScheme.onPrimaryContainer
                )
                Spacer(modifier = Modifier.height(8.dp))
                Text(
                    text = "选择功能分类进行SDK能力测试",
                    style = MaterialTheme.typography.bodyMedium,
                    color = MaterialTheme.colorScheme.onPrimaryContainer
                )
            }
        }
        // 功能分类列表
        LazyColumn(
            verticalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            items(categories) { category ->
                CategoryCard(
                    category = category,
                    isExpanded = expandedCategories.contains(category.title),
                    onExpandClick = { title ->
                        expandedCategories = if (expandedCategories.contains(title)) {
                            expandedCategories - title
                        } else {
                            expandedCategories + title
                        }
                    },
                    onSubItemClick = { route ->
                        navController.navigate(route)
                    }
                )
            }
        }
    }
}
@Composable
fun CategoryCard(
    category: CategoryItem,
    isExpanded: Boolean,
    onExpandClick: (String) -> Unit,
    onSubItemClick: (String) -> Unit
) {
    Card(
        modifier = Modifier.fillMaxWidth(),
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
    ) {
        Column {
            // 分类标题
            Row(
                modifier = Modifier
                    .fillMaxWidth()
                    .clickable { onExpandClick(category.title) }
                    .padding(16.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {
                Icon(
                    imageVector = category.icon,
                    contentDescription = null,
                    tint = MaterialTheme.colorScheme.primary,
                    modifier = Modifier.size(24.dp)
                )
                Spacer(modifier = Modifier.width(12.dp))
                Text(
                    text = category.title,
                    style = MaterialTheme.typography.titleMedium,
                    modifier = Modifier.weight(1f)
                )
                Icon(
                    imageVector = if (isExpanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore,
                    contentDescription = if (isExpanded) "收起" else "展开"
                )
            }
            // 子项列表
            if (isExpanded) {
                Divider()
                category.subItems.forEach { subItem ->
                    Row(
                        modifier = Modifier
                            .fillMaxWidth()
                            .clickable { onSubItemClick(subItem.route) }
                            .padding(horizontal = 16.dp, vertical = 12.dp),
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Spacer(modifier = Modifier.width(36.dp))
                        Column(modifier = Modifier.weight(1f)) {
                            Text(
                                text = subItem.title,
                                style = MaterialTheme.typography.bodyLarge
                            )
                            Text(
                                text = subItem.description,
                                style = MaterialTheme.typography.bodySmall,
                                color = MaterialTheme.colorScheme.onSurfaceVariant
                            )
                        }
                        Icon(
                            imageVector = Icons.Default.ChevronRight,
                            contentDescription = "进入",
                            tint = MaterialTheme.colorScheme.onSurfaceVariant
                        )
                    }
                    if (subItem != category.subItems.last()) {
                        Divider(modifier = Modifier.padding(start = 52.dp))
                    }
                }
            }
        }
    }
}
@Preview(showBackground = true)
@Composable
fun HomeScreenPreview() {
    SDKTestAppTheme {
        HomeScreen(navController = rememberNavController())
    }
}

VisionSceneRecognizerScreen.kt

图像识别:基于用户提供的图片,识别图片内容。

package com.huawei.clouddevice.ai.sampleapp.ui.screens.vision
import android.graphics.Bitmap
import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.huawei.clouddevice.ai.sampleapp.ui.theme.SDKTestAppTheme
import com.huawei.clouddevice.ai.vision.scene.SceneRecognition
import com.huawei.clouddevice.ai.vision.scene.SceneRecognizer
import com.huawei.clouddevice.ai.vision.scene.SceneRecognizerOptions
import java.io.File
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun VisionSceneRecognizerScreen(navController: NavController, sceneRecognizer: SceneRecognizer) {
    val context = LocalContext.current
    var bitmap by remember { mutableStateOf<Bitmap?>(null) }
    var isLoading by remember { mutableStateOf(false) }
    var progress by remember { mutableStateOf(0) }
    var result by remember { mutableStateOf("") }
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        // 顶部应用栏
        TopAppBar(
            title = { Text("场景识别") },
            navigationIcon = {
                IconButton(onClick = { navController.popBackStack() }) {
                    Icon(Icons.Default.ArrowBack, contentDescription = "返回")
                }
            }
        )
        // 图像选择器
        val pickMedia = rememberLauncherForActivityResult(
            contract = ActivityResultContracts.PickVisualMedia(),
            onResult = { uri ->
                uri?.let {
                    // 转换为Bitmap
                    bitmap = uriToBitmap(context, it)
                    val fileSize = File(bitmap.toString()).length()
                    Log.d("VisionImageLabel", "memory size: " + bitmap?.byteCount?.toLong())
                    Log.d("VisionImageLabel", "file size: $fileSize")
                }
            }
        )
        Button(
            onClick = {
                pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
            },
            modifier = Modifier.fillMaxWidth(),
            enabled = !isLoading
        ) {
            Text("选择图片")
        }
        bitmap?.let {
            Image(
                bitmap = it.asImageBitmap(),
                contentDescription = "Selected Image",
                modifier = Modifier.fillMaxWidth(),
            )
        }
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = {
                isLoading = true
                if (bitmap == null) {
                    result = "请先选择图片"
                    isLoading = false
                } else {
                    sceneRecognizer.execute(bitmap)
                        .onProgress { prog ->
                            progress = prog
                        }
                        .onSuccess { response ->
                            result = response.toString()
                            isLoading = false
                        }
                        .onFailure { error ->
                            result = "错误: $error"
                            isLoading = false
                        }
                }
            },
            modifier = Modifier.fillMaxWidth(),
            enabled = !isLoading
        ) {
            Text("执行")
        }
        if (isLoading) {
            Spacer(modifier = Modifier.height(16.dp))
            LinearProgressIndicator(
                progress = progress / 100f,
                modifier = Modifier.fillMaxWidth()
            )
            Text("进度: $progress%")
        }
        Spacer(modifier = Modifier.height(16.dp))
        Card(
            modifier = Modifier.fillMaxWidth()
        ) {
            Text(
                text = result.ifEmpty { "结果:" },
                modifier = Modifier.padding(16.dp)
            )
        }
    }
}
@Preview(showBackground = true)
@Composable
fun VisionSceneRecognizerScreenPreview() {
    SDKTestAppTheme {
        VisionSceneRecognizerScreen(
            navController = rememberNavController(),
            SceneRecognition.getClient(SceneRecognizerOptions.create(LocalContext.current))
        )
    }
}

NlpSceneRecognizerScreen.kt

文本识别:根据用户提供的文本,识别文本的主题。

package com.huawei.clouddevice.ai.sampleapp.ui.screens.nlp
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.huawei.clouddevice.ai.nlp.scene.SceneRecognition
import com.huawei.clouddevice.ai.nlp.scene.SceneRecognizer
import com.huawei.clouddevice.ai.nlp.scene.SceneRecognizerOptions
import com.huawei.clouddevice.ai.sampleapp.ui.theme.SDKTestAppTheme
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NlpSceneRecognizerScreen(navController: NavController, sceneRecognizer: SceneRecognizer) {
    var text by remember { mutableStateOf("") }
    var result by remember { mutableStateOf("") }
    var isLoading by remember { mutableStateOf(false) }
    var progress by remember { mutableStateOf(0) }
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        // 顶部应用栏
        TopAppBar(
            title = { Text("场景识别") },
            navigationIcon = {
                IconButton(onClick = { navController.popBackStack() }) {
                    Icon(Icons.Default.ArrowBack, contentDescription = "返回")
                }
            }
        )
        OutlinedTextField(
            value = text,
            onValueChange = { text = it },
            label = { Text("文本:") },
            modifier = Modifier.fillMaxWidth()
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = {
                isLoading = true
                sceneRecognizer.execute(text)
                    .onProgress { prog ->
                        progress = prog
                    }
                    .onSuccess { response ->
                        result = response.toString()
                        isLoading = false
                    }
                    .onFailure { error ->
                        result = "错误: $error"
                        isLoading = false
                    }
            },
            modifier = Modifier.fillMaxWidth(),
            enabled = !isLoading
        ) {
            Text("执行")
        }
        if (isLoading) {
            Spacer(modifier = Modifier.height(16.dp))
            LinearProgressIndicator(
                progress = progress / 100f,
                modifier = Modifier.fillMaxWidth()
            )
            Text("进度: $progress%")
        }
        Spacer(modifier = Modifier.height(16.dp))
        Card(
            modifier = Modifier.fillMaxWidth()
        ) {
            Text(
                text = result.ifEmpty { "结果:" },
                modifier = Modifier.padding(16.dp)
            )
        }
    }
}
@Preview(showBackground = true)
@Composable
fun NlpSceneRecognizerScreenPreview() {
    SDKTestAppTheme {
        NlpSceneRecognizerScreen(
            navController = rememberNavController(),
            SceneRecognition.getClient(SceneRecognizerOptions.create(LocalContext.current))
        )
    }
}

相关文档