Membuat aplikasi pencatat

记事是 Android 的一项核心功能,可提高用户在 大屏设备。借助记事应用,用户可以书写和画草图 悬浮窗口或全屏时,捕获屏幕内容并为其添加注释, 并保存备注以供日后查看和修改。

用户可以在锁定屏幕上或在运行 。

针对记事功能的触控笔支持可提供卓越的用户体验。

“记事”角色

通过 RoleManager.ROLE_NOTES 角色可识别记事应用,并向其授予 LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE 权限。

如需为您的应用获取“记事”角色,请执行以下操作:

  1. 调用 isRoleAvailable() 来查看角色的状态
  2. 如果“记事”角色可用,请调用 createRequestRoleIntent() 以获取特定于备注的 intent。
  3. 调用 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>

通过该声明,用户可以为您的应用分配“记事”角色,使其能够 默认记事应用:

应用功能

一款与众不同的大屏记事应用能提供全方位的支持 记事功能

触控笔支持

使用 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));
        });
}

您的应用应处理所有结果代码:

内容截取成功后,将截取的图片粘贴到记事中,以便 示例:

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.
        }
    });

仅当符合以下条件时,才应通过界面功能提供内容截取功能: 您的记事应用是在浮动窗口中运行,而不是在 全屏运行,从设备锁定屏幕启动。(用户可以 记事应用本身的屏幕截图和设备屏幕截图 功能。)

要确定应用是否在浮动窗口(或气泡)中,请调用 方法:

其他资源