在 Android 14(API level 34)及以上版本中,android.speech.SpeechRecognizer
提供了標準的語音識別能力,允許應用透過底層系統或指定的識別服務,將音訊輸入轉換為文字輸出。其主要功能包括:建立識別器實例、偵測系統是否支援識別、啟動/停止識別會話、取消或銷毀識別器,以及透過回呼介面接收識別結果和錯誤訊息。同時,Android 14 針對主執行緒呼叫、前台服務類型聲明等方面強化了行為約束,需要開發者註意避免 ANR 並正確配置服務類型。此外,API 在內網/雲端辨識、持續辨識及電量消耗等方面有侷限,需要根據應用場景選擇適當的實作方式。以下文件將從功能概覽、核心方法、回呼機制、權限與配置、Android 14 特性與限制五個部分進行介紹。
About 6 min
# Flutter build failed on andorid platform
Build log
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================
2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':path_provider_android:compileDebugJavaWithJavac'.
> Could not resolve all files for configuration ':path_provider_android:androidJdkImage'.
> Failed to transform core-for-system-modules.jar to match attributes {artifactType=_internal_android_jdk_image, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
> Execution failed for JdkImageTransform: D:\Android_SDK\Sdk\platforms\android-35\core-for-system-modules.jar.
> Error while executing process C:\Program Files\Android\Android Studio\jbr\bin\jlink.exe with arguments {--module-path C:\Users\XXXXXXXXX\.gradle\caches\transforms-3\cc12c5242eac95612f50f56c
5a36d784\transformed\output\temp\jmod --add-modules java.base --output C:\Users\XXXXXXXXX\.gradle\caches\transforms-3\cc12c5242eac95612f50f56c5a36d784\transformed\output\jdkImage --disable-plugin syst
em-modules}
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================
BUILD FAILED in 6s
Running Gradle task 'assembleDebug'... 7.6s
┌─ Flutter Fix ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [!] This is likely due to a known bug in Android Gradle Plugin (AGP) versions less than 8.2.1, when │
│ D:\XXXXXXXXXXXXXXXXX\android\settings.gradle, │
│ in the 'plugins' closure (by the number following "com.android.application"). │
│ Alternatively, if your project was created with an older version of the templates, it is likely │
│ in the buildscript.dependencies closure of the top-level build.gradle: │
│ D:\XXXXXXXXXXXXXXXXX\android\build.gradle, │
│ as the number following "com.android.tools.build:gradle:". │
│ │
│ For more information, see: │
│ https://issuetracker.google.com/issues/294137077 │
│ https://github.com/flutter/flutter/issues/156304 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Error: Gradle task assembleDebug failed with exit code 1
About 1 min
log:
Solutions
1. 確保 std::string
是有效的 UTF-8
env->NewStringUTF()
只能處理有效的 UTF-8 字符串。如果 transcribeMelBuffer
返回的 std::string
不是 UTF-8,則應該先進行轉換。例如:
std::string result = engine->transcribeMelBuffer(sampleVector);
// 確保 result 是 UTF-8
if (!isValidUTF8(result)) {
return env->NewStringUTF("Error: Invalid UTF-8 output");
}
return env->NewStringUTF(result.c_str());
About 2 min
Spinner
sample code
@Composable
fun SampleSpinner(
list: List<Pair<String, String>>,
preselected: Pair<String, String>,
onSelectionChanged: (selection: Pair<String, String>) -> Unit
) {
var selected by remember { mutableStateOf(preselected) }
var expanded by remember { mutableStateOf(false) } // initial value
Box {
Column {
OutlinedTextField(
value = (selected.second),
onValueChange = { },
label = { Text(text = "My List") },
modifier = Modifier.fillMaxWidth(),
trailingIcon = { Icon(Icons.Outlined.ArrowDropDown, null) },
readOnly = true
)
DropdownMenu(
modifier = Modifier.fillMaxWidth(),
expanded = expanded,
onDismissRequest = { expanded = false },
) {
list.forEach { entry ->
DropdownMenuItem(
modifier = Modifier.fillMaxWidth(),
onClick = {
selected = entry
expanded = false
},
text = {
Text(
text = (entry.second),
modifier = Modifier
.wrapContentWidth()
.align(Alignment.Start)
)
}
)
}
}
}
Spacer(
modifier = Modifier
.matchParentSize()
.background(Color.Transparent)
.padding(10.dp)
.clickable(
onClick = { expanded = !expanded }
)
)
}
}
@Preview(showBackground = true)
@Composable
fun SampleSpinner_Preview() {
MaterialTheme {
val entry1 = Pair("Key1", "Entry1")
val entry2 = Pair("Key2", "Entry2")
val entry3 = Pair("Key3", "Entry3")
SampleSpinner(
listOf(entry1, entry2, entry3),
preselected = entry2,
onSelectionChanged = { selected -> /* do something with selected */ }
)
}
}
Less than 1 minute
1. 簡介
在 Android 開發的世界中,UI 元件的設計歷來是開發者最重要的工作之一。傳統上,Android 使用 XML 布局來定義界面,然而,這種方法相對繁瑣,且缺乏靈活性。為了解決這些問題,Google 推出了 Jetpack Compose,一個基於 Kotlin 語言的 UI 架構,旨在使 UI 開發更加簡單、直觀、和靈活。
Jetpack Compose 的核心概念是“聲明式 UI”,這意味著開發者只需要描述界面應該是什麼樣的,框架會自動處理 UI 的更新和渲染。這種方式使得代碼更加簡潔且易於維護。
About 5 min
Android API 12+ App Launch Issue from Another App
To address the issue of launching an app from another app in Android API level 12 and above, follow these steps:
Update Manifest
Add the following to your AndroidManifest.xml
:
<manifest>
<queries>
<package android:name="package.of.app.you.wanna.open"/>
</queries>
</manifest>
Less than 1 minute
Tools
-
Apktool
- Installation: Apktool Installation Guide
- Note: Add Apktool to your environment variables.
-
dex2jar
- Download: dex2jar on SourceForge
-
JD-GUI
- Download: JD-GUI Website
Less than 1 minute