记事是 Android 的一项核心功能,可提高用户在 大屏设备。借助记事应用,用户可以书写和画草图 悬浮窗口或全屏时,捕获屏幕内容并为其添加注释, 并保存备注以供日后查看和修改。
用户可以在锁定屏幕上或在运行 。
针对记事功能的触控笔支持可提供卓越的用户体验。
“记事”角色
通过
RoleManager.ROLE_NOTES
角色可识别记事应用,并向其授予
LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE
权限。
如需为您的应用获取“记事”角色,请执行以下操作:
- 调用
isRoleAvailable()
来查看角色的状态 - 如果“记事”角色可用,请调用
createRequestRoleIntent()
以获取特定于备注的 intent。 - 调用
startActivityForResult()
“记事”意图,提示用户向您的账号授予“记事”角色 应用。
只能有一个应用具有“记事”角色。
应用为响应隐式
ACTION_CREATE_NOTE
intent 操作。如果从设备锁定屏幕调用,应用会全屏打开
屏幕;如果在屏幕处于解锁状态时调用,则会在浮动窗口中调用。
应用清单
如需获得使用“记事”角色的资格,您的应用必须包含以下声明 在应用清单中:
<activity
android:name="YourActivityName"
android:exported="true"
android:showWhenLocked="true"
android:turnScreenOn="true">
<intent-filter>
<action android:name="android.intent.action.CREATE_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
通过该声明,用户可以为您的应用分配“记事”角色,使其能够 默认记事应用:
ACTION_CREATE_NOTE
设置应用响应的 intent 操作showWhenLocked
让用户可从设备锁定屏幕访问您的应用turnScreenOn
用于启用 您的应用在运行时开启设备屏幕
应用功能
一款与众不同的大屏记事应用能提供全方位的支持 记事功能
触控笔支持
使用
EXTRA_USE_STYLUS_MODE
intent extra 设置为 true
时,应用应打开一条接受触控笔(或
(例如手指触摸)输入。
如果 intent extra 设置为 false
,您的应用应打开一条接受的记事
键盘输入。
锁屏访问
您的应用必须提供在应用运行时运行的全屏 activity 从设备锁定屏幕打开
您的应用应仅在用户同意后显示历史备注(在 设备状态)以显示过往笔记。否则,当您从 锁定屏幕时,您的应用应始终创建新记事。
您可以使用以下命令查看您的应用是否已从锁定屏幕启动
KeyguardManager#isKeyguardLocked()
。
要要求用户进行身份验证并解锁设备,请调用
KeyguardManager#requestDismissKeyguard()
:
Kotlin
val keyguardManager = getSystemService(KEYGUARD_SERVICE) as KeyguardManager keyguardManager.requestDismissKeyguard( this, object : KeyguardDismissCallback() { override fun onDismissError() { // Unlock failed. Dismissing keyguard is not feasible. } override fun onDismissSucceeded() { // Unlock succeeded. Device is now unlocked. } override fun onDismissCancelled() { // Unlock failed. User cancelled operation or request otherwise cancelled. } } )
Java
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); boolean isLocked = keyguardManager.isKeyguardLocked(); keyguardManager.requestDismissKeyguard( this, new KeyguardManager.KeyguardDismissCallback() { @Override public void onDismissError() { // Unlock failed. Dismissing keyguard is not feasible. } @Override public void onDismissSucceeded() { // Unlock succeeded. Device is now unlocked. } @Override public void onDismissCancelled() { // Unlock failed. User cancelled operation or request otherwise cancelled. } });
浮动窗口
对于上下文记事,您的应用必须提供一个可在 悬浮窗口。
您的应用应支持
multi-instance
这样一来,用户甚至可以在多个浮动窗口中创建多个记事
当记事应用以全屏模式或分屏模式启动时
模式。
内容截取
内容截取是记事应用的一项关键功能。包含内容 截取屏幕截图,用户可以截取记事背后显示内容的屏幕截图 应用的浮动窗口。用户可以截取全部或部分展示内容,粘贴 将内容添加到笔记中,并为拍摄的内容添加注释或突出显示这些内容。
您的记事应用应提供一项界面功能,用于启动
ActivityResultLauncher
创建者
registerForActivityResult()
。
通过
ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE
直接或通过
ActivityResultContract
。
系统 activity 捕获内容,将其保存在设备上,并返回
(在
registerForActivityResult()
。
以下示例使用通用
StartActivityForResult
合同:
Kotlin
private val startForResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Intent.CAPTURE_CONTENT_FOR_NOTE_SUCCESS) { val uri = result.data?.data // Use the URI to paste the captured content into the note. } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { NotesTheme { Surface(color = MaterialTheme.colorScheme.background) { CaptureButton( onClick = { Log.i("ContentCapture", "Launching intent...") startForResult.launch(Intent(ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE)) }) } } } } @Composable fun CaptureButton(onClick: () -> Unit) { Button(onClick = onClick) {Text("Capture Content")} }
Java
private final ActivityResultLauncher<Intent> startForResult = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Intent.CAPTURE_CONTENT_FOR_NOTE_SUCCESS) { Uri uri = result.getData() != null ? result.getData().getData() : null; // Use the URI to paste the captured content into the note. } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button captureButton = findViewById(R.id.capture_button); captureButton.setOnClickListener( view -> { Log.i("ContentCapture", "Launching intent..."); startForResult.launch(new Intent(ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE)); }); }
您的应用应处理所有结果代码:
CAPTURE_CONTENT_FOR_NOTE_SUCCESS
CAPTURE_CONTENT_FOR_NOTE_FAILED
CAPTURE_CONTENT_FOR_NOTE_USER_CANCELED
CAPTURE_CONTENT_FOR_NOTE_WINDOW_MODE_UNSUPPORTED
CAPTURE_CONTENT_FOR_NOTE_BLOCKED_BY_ADMIN
内容截取成功后,将截取的图片粘贴到记事中,以便 示例:
Kotlin
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Intent.CAPTURE_CONTENT_FOR_NOTE_SUCCESS) { val uri = result.data?data // Use the URI to paste the captured content into the note. } }
Java
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Intent.CAPTURE_CONTENT_FOR_NOTE_SUCCESS) { Uri uri = result.getData() != null ? result.getData().getData() : null; // Use the URI to paste the captured content into the note. } });
仅当符合以下条件时,才应通过界面功能提供内容截取功能: 您的记事应用是在浮动窗口中运行,而不是在 全屏运行,从设备锁定屏幕启动。(用户可以 记事应用本身的屏幕截图和设备屏幕截图 功能。)
要确定应用是否在浮动窗口(或气泡)中,请调用 方法:
isLaunchedFromBubble()
检查记录应用是否是从 设备锁定屏幕isRoleHeld(RoleManager.ROLE_NOTES)
验证您的应用是否为默认记事应用(您的应用可以 在对话或其他类型的气泡中运行 “记事”角色)