热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为安卓应用开发场景设计,能够根据具体功能模块和使用情境,生成专业、精准的应用内反馈提示。通过系统化的需求分析和多维度设计考量,确保反馈提示具备清晰的用户引导性、恰当的技术实现性和良好的用户体验。适用于新功能上线、用户行为引导、问题反馈收集等多种应用场景,帮助开发者提升用户参与度和产品改进效率。
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OfflineTtsOnboardingSheet(
show: Boolean,
autoSwitchEnabled: Boolean,
onAutoSwitchChange: (Boolean) -> Unit,
onPrimaryClick: () -> Unit,
onLearnMore: () -> Unit,
onDismiss: () -> Unit
) {
if (!show) return
ModalBottomSheet(onDismissRequest = onDismiss) {
Column(Modifier.padding(24.dp)) {
Text("离线朗读,弱网也流畅", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(8.dp))
Text("一键下载文章,用系统朗读。支持蓝牙、倍速与句子高亮。",
style = MaterialTheme.typography.bodyMedium)
Spacer(Modifier.height(16.dp))
Row(verticalAlignment = Alignment.CenterVertically) {
Switch(checked = autoSwitchEnabled, onCheckedChange = onAutoSwitchChange)
Spacer(Modifier.width(8.dp))
Text("弱网或锁屏时自动切离线")
}
Spacer(Modifier.height(24.dp))
Button(onClick = onPrimaryClick, modifier = Modifier.fillMaxWidth()) {
Text("一键下载并朗读")
}
TextButton(onClick = onLearnMore, modifier = Modifier.fillMaxWidth()) {
Text("了解功能")
}
TextButton(onClick = onDismiss, modifier = Modifier.fillMaxWidth()) {
Text("以后再说")
}
}
}
}
@Composable
fun PlaybackFeedbackSnackbar(
show: Boolean,
onPositive: () -> Unit,
onNeutral: () -> Unit,
onNegative: () -> Unit
) {
if (!show) return
Snackbar {
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text("这次朗读体验如何?")
AssistChip(onClick = onPositive, label = { Text("👍 喜欢") })
AssistChip(onClick = onNeutral, label = { Text("🙂 一般") })
AssistChip(onClick = onNegative, label = { Text("👎 有问题") })
}
}
}
data class IssueState(
val selected: Set<String> = emptySet(),
val followUps: Map<String, String> = emptyMap(), // e.g. "pause" -> "often"
val note: String = "",
val attachDiag: Boolean = false
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IssueFormSheet(
visible: Boolean,
state: IssueState,
onToggleIssue: (String) -> Unit,
onFollowUpChange: (String, String) -> Unit,
onNoteChange: (String) -> Unit,
onAttachChange: (Boolean) -> Unit,
onSubmit: () -> Unit,
onDismiss: () -> Unit
) {
if (!visible) return
ModalBottomSheet(onDismissRequest = onDismiss) {
Column(Modifier.padding(24.dp)) {
Text("帮我们定位问题", style = MaterialTheme.typography.titleMedium)
Text("选择遇到的情况(最多选3项)", style = MaterialTheme.typography.bodyMedium)
Spacer(Modifier.height(12.dp))
val options = listOf(
"pause" to "朗读有停顿/卡顿",
"pronunciation" to "发音不自然",
"battery" to "耗电有点快",
"interrupt" to "被通知或其他音频打断",
"desync" to "倍速或进度不同步",
"highlight" to "句子高亮错位",
"bluetooth" to "蓝牙耳机控制不灵",
"offlineSwitch" to "离线切换不稳定",
"other" to "其他"
)
FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
options.forEach { (key, label) ->
FilterChip(
selected = state.selected.contains(key),
onClick = { onToggleIssue(key) },
label = { Text(label) }
)
}
}
// 示例:动态追问(以“被打断”为例)
if ("interrupt" in state.selected) {
Spacer(Modifier.height(12.dp))
Text("可能来源", style = MaterialTheme.typography.labelLarge)
val items = listOf("call" to "来电", "otherApp" to "其他App音频", "notif" to "通知提示音", "unknown" to "不确定")
FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
items.forEach { (k, v) ->
AssistChip(
onClick = { onFollowUpChange("interrupt", k) },
label = { Text(v) },
leadingIcon = null,
enabled = true
)
}
}
}
Spacer(Modifier.height(12.dp))
OutlinedTextField(
value = state.note,
onValueChange = onNoteChange,
placeholder = { Text("补充说明(可选,最多120字)") },
singleLine = false,
maxLines = 3,
modifier = Modifier.fillMaxWidth()
)
Row(verticalAlignment = Alignment.CenterVertically) {
Switch(checked = state.attachDiag, onCheckedChange = onAttachChange)
Spacer(Modifier.width(8.dp))
Text("同意附带匿名诊断(不含个人内容)")
}
Spacer(Modifier.height(16.dp))
Button(onClick = onSubmit, modifier = Modifier.fillMaxWidth()) {
Text("提交反馈")
}
}
}
}
fun showOfflineSwitchSnackbar(
scaffoldState: SnackbarHostState,
onFeedback: () -> Unit
) {
CoroutineScope(Dispatchers.Main).launch {
val result = scaffoldState.showSnackbar(
message = "已切换为离线朗读(弱网/锁屏)。网络恢复后自动同步。",
actionLabel = "反馈",
duration = SnackbarDuration.Short
)
if (result == SnackbarResult.ActionPerformed) onFeedback()
}
}
统一要求:不收集PII;含会话ID(UUID)、时间戳、App版本、OS版本、机型、动态色/主题、屏幕方向。
说明:
本方案围绕“首次引导—轻量反馈—问题定位—常驻入口—异常标注”的闭环设计,既保证了普通用户的低认知负担,又为研发提供了足够可落地的定位信息与可量化的指标,符合安卓Material 3规范与隐私合规要求。
反馈条(轻量、持久提示)
底部浮层(反馈收集)
以下示例以Jetpack Compose为主,附View系方案点到为止。
@Composable
fun FeedbackBanner(
visible: Boolean,
onFeedbackClick: () -> Unit,
onVoiceClick: () -> Unit,
onClose: () -> Unit
) {
AnimatedVisibility(visible = visible) {
Surface(
tonalElevation = 3.dp,
color = MaterialTheme.colorScheme.surface,
shadowElevation = 6.dp
) {
Row(
modifier = Modifier
.fillMaxWidth()
.navigationBarsPadding()
.padding(horizontal = 16.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(Icons.Default.Info, contentDescription = null, tint = MaterialTheme.colorScheme.primary)
Spacer(Modifier.width(12.dp))
Text(
text = "如果文字看不全、按钮被遮挡,可一键反馈,帮您尽快修复。",
style = MaterialTheme.typography.bodyLarge, // 遵循大字号
modifier = Modifier.weight(1f)
)
Spacer(Modifier.width(8.dp))
TextButton(onClick = onVoiceClick) {
Icon(Icons.Default.Mic, contentDescription = null)
Spacer(Modifier.width(4.dp))
Text("语音")
}
FilledTonalButton(onClick = onFeedbackClick) {
Text("立即反馈")
}
IconButton(onClick = onClose) {
Icon(Icons.Default.Close, contentDescription = "稍后再说")
}
}
}
}
}
触发条件示意:
val cfg = LocalConfiguration.current
val fontScale = cfg.fontScale
val highContrast = isHighTextContrastEnabled(context) || appHighContrastEnabled()
val shouldShowBanner = remember { mutableStateOf(false) }
LaunchedEffect(fontScale, highContrast) {
shouldShowBanner.value = (fontScale >= 1.3f || highContrast) && notShownInThisSession()
}
高对比检测(示例):
fun isHighTextContrastEnabled(context: Context): Boolean =
Settings.Secure.getInt(
context.contentResolver,
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0
) == 1
// build.gradle: implementation "androidx.core:core-ktx:<latest>"
fun captureCurrentScreen(activity: Activity): Bitmap {
val view = activity.window.decorView.rootView
return view.drawToBitmap() // 仅应用窗口内容
}
截图预览与遮挡:使用BottomSheet内简单涂抹工具(Canvas绘制半透明矩形并导出),或采用开源涂抹控件;导出时将遮挡层合成到bitmap后再压缩上传。
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FeedbackSheet(
screenshot: Bitmap,
defaultOptions: FeedbackOptions,
onSubmit: (FeedbackPayload) -> Unit,
onRetake: () -> Unit,
onVoiceClick: () -> Unit
) {
ModalBottomSheet(onDismissRequest = { /* handle */ }) {
Text("请帮我们看看这个显示问题", style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp))
// 问题类型
val options = listOf("文字被截断", "按钮被遮挡", "弹窗显示异常", "其他")
var selectedIndex by remember { mutableStateOf(0) }
options.forEachIndexed { i, label ->
Row(Modifier.fillMaxWidth().clickable { selectedIndex = i }.padding(16.dp)) {
RadioButton(selected = selectedIndex == i, onClick = { selectedIndex = i })
Spacer(Modifier.width(8.dp)); Text(label, style = MaterialTheme.typography.bodyLarge)
}
}
// 截图预览
Image(
bitmap = screenshot.asImageBitmap(),
contentDescription = "截图预览",
modifier = Modifier
.fillMaxWidth().heightIn(max = 260.dp)
.padding(horizontal = 16.dp)
.clip(RoundedCornerShape(8.dp))
)
Row(Modifier.padding(horizontal = 16.dp, vertical = 8.dp)) {
OutlinedButton(onClick = onRetake) { Text("重新截取") }
Spacer(Modifier.width(8.dp))
OutlinedButton(onClick = { /* 进入遮挡敏感信息工具 */ }) { Text("遮挡敏感信息") }
}
// 异常排查问答(简化)
val q1 = listOf("就在当前页面", "应用的设置页", "其他页面")
var q1Sel by remember { mutableStateOf(0) }
LabeledSingleChoice("问题发生位置", q1, q1Sel) { q1Sel = it }
val q2 = listOf("影响点击/看不清", "不影响,只是不好看")
var q2Sel by remember { mutableStateOf(0) }
LabeledSingleChoice("是否影响操作", q2, q2Sel) { q2Sel = it }
val q3 = listOf("每次都出现", "偶尔出现")
var q3Sel by remember { mutableStateOf(0) }
LabeledSingleChoice("出现频率", q3, q3Sel) { q3Sel = it }
// 描述 + 语音
var desc by remember { mutableStateOf("") }
OutlinedTextField(
value = desc, onValueChange = { desc = it },
placeholder = { Text("请简单说说哪里看不清/被挡住(可语音)") },
modifier = Modifier
.fillMaxWidth().padding(16.dp),
minLines = 2, maxLines = 4
)
TextButton(
onClick = onVoiceClick,
modifier = Modifier.padding(horizontal = 16.dp)
) {
Icon(Icons.Default.Mic, contentDescription = null); Spacer(Modifier.width(4.dp)); Text("语音")
}
// 提交
Button(
onClick = {
onSubmit(
FeedbackPayload(
type = options[selectedIndex],
desc = desc,
q1 = q1[q1Sel], q2 = q2[q2Sel], q3 = q3[q3Sel],
// 其他自动采集字段在onSubmit中封装
)
)
},
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.heightIn(min = 48.dp)
) {
Text("发送问题")
}
Spacer(Modifier.height(12.dp))
}
}
辅助控件:
@Composable
fun LabeledSingleChoice(label: String, items: List<String>, selected: Int, onSelect: (Int) -> Unit) {
Text(label, style = MaterialTheme.typography.titleMedium, modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp))
items.forEachIndexed { i, txt ->
Row(Modifier.fillMaxWidth().clickable { onSelect(i) }.padding(horizontal = 16.dp, vertical = 8.dp)) {
RadioButton(selected = selected == i, onClick = { onSelect(i) })
Spacer(Modifier.width(8.dp)); Text(txt, style = MaterialTheme.typography.bodyLarge)
}
}
}
fun startVoiceInput(activity: Activity, requestCode: Int = 1001) {
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_PROMPT, "请说出问题位置或现象,例如“设置页文字被截断”")
}
try {
activity.startActivityForResult(intent, requestCode)
} catch (e: ActivityNotFoundException) {
Toast.makeText(activity, "当前设备不支持语音输入", Toast.LENGTH_SHORT).show()
}
}
// onActivityResult中接收结果,填入描述框
如需更自然地长语音,可使用SpeechRecognizer并申请RECORD_AUDIO权限;优先使用系统识别对话框以降低心智负担。
AndroidManifest(仅在自建识别需要时):
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
数据结构(示例):
{
"type": "文字被截断",
"desc": "设置-显示-字体大小页面,列表第2项看不全",
"qa": {
"where": "就在当前页面",
"impact": "影响点击/看不清",
"frequency": "每次都出现"
},
"app": {"versionName": "3.2.1", "versionCode": 30201},
"device": {
"brand": "Xiaomi", "model": "M2012K11AC", "android": "14",
"density": 3.0, "widthPx": 1080, "heightPx": 2400,
"fontScale": 1.6, "displaySize": "large",
"highTextContrast": true, "boldText": false,
"talkback": false, "nightMode": "light", "rtl": false, "locale": "zh-CN"
},
"ui": {"route": "Settings/Display/FontSize", "dialog": {"visible": false}},
"screenshotId": "upload://abc123"
}
上传流程:
文案截断
按钮遮挡
弹窗尺寸异常
主题与对比
预防性检测与测试
此方案遵循Android/Material Design规范,面向老年用户提供清晰、低门槛的反馈体验;在不额外增加用户负担的前提下,最大化收集定位所需信息,便于快速复现与修复。
目标用户与状态
反馈目标与范围
约束与策略
流程(主入口:顶部横幅)
流程(次入口:“查看设置”后卡片)
题目设计(3题,均为单选Chip,随选即存)
行动与状态
横幅(标题+副文案+行动)
卡片·题1:总体满意度
卡片·题2:通知频率
卡片·题3:打扰感受
卡片·题4:个性化相关性
完成感谢态
微文案规范
顶部横幅(Prominent Banner)
内嵌卡片(ElevatedCard)
无障碍与青少年可用性
@Composable
fun SurveyBanner(
onStart: () -> Unit,
onSnooze: () -> Unit,
onSkip: () -> Unit,
) {
ElevatedCard(shape = MaterialTheme.shapes.medium) {
Row(
Modifier.fillMaxWidth().padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(Icons.Outlined.NotificationsActive, contentDescription = null)
Spacer(Modifier.width(12.dp))
Column(Modifier.weight(1f)) {
Text("帮我们把消息推送变得更合你", style = MaterialTheme.typography.titleMedium)
Text("30秒小问卷,不打断你看消息", style = MaterialTheme.typography.bodyMedium)
}
AssistChip(onClick = onStart, label = { Text("去填写") })
TextButton(onClick = onSnooze) { Text("稍后") }
TextButton(onClick = onSkip) { Text("跳过") }
}
}
}
@Composable
fun SurveyCard(
step: Int,
onAnswer: (questionId: String, answerId: String) -> Unit,
onSkip: () -> Unit,
onDone: () -> Unit
) {
ElevatedCard(Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp)) {
Column(Modifier.padding(16.dp)) {
when (step) {
1 -> {
Text("最近的消息通知,你整体感觉如何?", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(12.dp))
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
val options = listOf("很不满意","不太满意","一般","满意","很满意")
options.forEachIndexed { idx, label ->
FilledIconButton(
onClick = { onAnswer("overall_satisfaction", (idx+1).toString()) }
) { Text(label) } // 可替换为表情Icon
}
}
}
2 -> {
Text("通知出现的频率对你来说?", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(12.dp))
val opts = listOf(
"too_many" to "太多了",
"just_right" to "刚刚好",
"too_few" to "有点少"
)
FlowRow(mainAxisSpacing = 8.dp, crossAxisSpacing = 8.dp) {
opts.forEach { (id, label) ->
FilterChip(
selected = false,
onClick = { onAnswer("frequency", id) },
label = { Text(label) }
)
}
}
}
3 -> {
Text("它们会打扰到你吗?", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(12.dp))
val opts = listOf(
"often" to "经常打扰我",
"sometimes" to "偶尔打扰",
"rarely" to "几乎不打扰"
)
FlowRow(mainAxisSpacing = 8.dp, crossAxisSpacing = 8.dp) {
opts.forEach { (id, label) ->
FilterChip(
selected = false,
onClick = { onAnswer("disturbance", id) },
label = { Text(label) }
)
}
}
}
4 -> {
Text("这些通知和你兴趣相关吗?", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(12.dp))
val opts = listOf(
"high" to "很合我口味",
"medium" to "一般般",
"low" to "不太相关"
)
FlowRow(mainAxisSpacing = 8.dp, crossAxisSpacing = 8.dp) {
opts.forEach { (id, label) ->
FilterChip(
selected = false,
onClick = { onAnswer("personalization", id) },
label = { Text(label) }
)
}
}
}
5 -> {
Text("收到!我们会努力做得更好", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(8.dp))
Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) {
OutlinedButton(onClick = { /* open notification settings */ }) {
Text("调整通知设置")
}
OutlinedButton(onClick = { /* open personalization */ }) {
Text("管理推荐偏好")
}
}
}
}
Spacer(Modifier.height(12.dp))
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
TextButton(onClick = onSkip) { Text("跳过") }
if (step in 1..4) {
FilledTonalButton(onClick = onDone) { Text("完成") }
}
}
}
}
}
事件与上报(建议)
统计与转化口径(定义与公式)
“稍后提醒”调度
合规与隐私
体验细节
频控与干扰
可测试项(建议A/B)
QA清单
该方案遵循Material 3规范、满足非打断式与青少年友好要求,覆盖通知频率、打扰感与个性化相关性三大评价维度,并提供可落地的触发、组件、上报与转化口径定义,便于快速实现与迭代优化。
为产品、设计、研发与运营团队提供一键生成的安卓应用内反馈提示方案,覆盖“新功能上线、关键操作完成、异常排查、用户召回与满意度调研”等核心场景;交付内容包括场景诊断、界面与交互节奏、组件与样式建议、文案候选与数据统计要点以及优先级与优化思路,帮助团队快速上线可用方案;以业务指标为导向,提升反馈参与率与有效率,降低跨部门沟通与反复返工成本,确保品牌一致与合规可控;支持按人群与情境定制,引导“在对的时机,用对的话术,向对的人提问”,加速产品持续改进与闭环。
为新功能上线定制反馈弹窗与问卷,明确触发时机与用户分群;快速拿到可执行洞察,指导迭代优先级。
将反馈流程与界面统一到品牌风格,一键生成文案与交互草图,减少返工;确保提示不打断核心路径。
直接获得实现建议与界面结构说明,明确事件触发与数据采集范围,降低沟通成本,快速落地。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期