创建记事应用

Ведение заметок — это основная функция Android, которая повышает производительность пользователей на устройствах с большим экраном. Приложения для ведения заметок позволяют пользователям писать и рисовать в плавающем окне или в полноэкранном режиме, захватывать и комментировать содержимое экрана, а также сохранять заметки для последующего просмотра и редактирования.

Пользователи могут получить доступ к приложениям для создания заметок с экрана блокировки или во время запуска других приложений.

Поддержка стилуса для создания заметок обеспечивает исключительный пользовательский опыт.

Роль заметок

Роль RoleManager.ROLE_NOTES определяет приложения для создания заметок и предоставляет им разрешение LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE .

Чтобы получить роль заметок для вашего приложения, выполните следующие действия:

  1. Вызовите isRoleAvailable() , чтобы проверить статус роли.
  2. Если роль примечаний доступна, вызовите createRequestRoleIntent() , чтобы получить намерение, специфичное для примечаний.
  3. Вызовите startActivityForResult() с намерением примечаний, чтобы предложить пользователю предоставить роль примечаний вашему приложению.

Только одно приложение может выполнять роль заметок.

Приложение открывается в ответ на неявное действие намерения ACTION_CREATE_NOTE . При вызове с экрана блокировки устройства приложение открывается в полноэкранном режиме; если он вызывается, когда экран разблокирован, в плавающем окне.

Манифест приложения

Чтобы претендовать на роль заметок, ваше приложение должно включить в манифест приложения следующее объявление:

<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 устанавливает намеренное действие, на которое реагирует ваше приложение.

  • showWhenLocked делает ваше приложение доступным с экрана блокировки устройства.

  • turnScreenOn позволяет вашему приложению включать экран устройства при запуске приложения.

Возможности приложения

Приложение для создания заметок с большим экраном предоставляет полный набор возможностей для создания заметок.

Поддержка стилуса

Когда ваше приложение вызывается с дополнительным намерением EXTRA_USE_STYLUS_MODE , для которого установлено значение true , приложение должно открыть заметку, которая принимает ввод стилусом (или касанием пальца).

Если для дополнительного намерения установлено значение false , ваше приложение должно открыть заметку, которая принимает ввод с клавиатуры.

Доступ к экрану блокировки

Ваше приложение должно обеспечивать полноэкранное действие, которое запускается при открытии приложения с экрана блокировки устройства.

Ваше приложение должно отображать только исторические заметки, если пользователь дал согласие (в состоянии разблокированного устройства) на показ прошлых заметок. В противном случае при открытии с экрана блокировки ваше приложение всегда должно создавать новую заметку.

Вы можете проверить, было ли запущено ваше приложение с экрана блокировки, с помощью KeyguardManager#isKeyguardLocked() . Чтобы попросить пользователя аутентифицировать и разблокировать устройство, вызовите KeyguardManager#requestDismissKeyguard() :

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

Плавающие окна

Для контекстного ведения заметок ваше приложение должно предоставить действие, которое открывается в плавающем окне при запуске другого приложения.

Ваше приложение должно поддерживать режим multi-instance , чтобы пользователи могли создавать несколько заметок в нескольких плавающих окнах, даже если ваше приложение для создания заметок запущено в полноэкранном режиме или в режиме разделенного экрана.

Захват контента

Захват контента — ключевая возможность приложений для создания заметок. Благодаря захвату контента пользователи могут делать снимки экрана за плавающим окном приложения для создания заметок. Пользователи могут захватывать все или часть отображения, вставлять содержимое в свою заметку, а также комментировать или выделять захваченное содержимое.

Ваше приложение для заметок должно предоставлять возможность пользовательского интерфейса, который запускает ActivityResultLauncher , созданный с помощью registerForActivityResult() . Действие намерения ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE предоставляется средству запуска либо напрямую, либо через ActivityResultContract .

Системное действие захватывает контент, сохраняет его на устройстве и возвращает URI контента вашему приложению в аргументе обратного вызова registerForActivityResult() .

В следующем примере используется универсальный контракт StartActivityForResult :

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")} }

Ваше приложение должно обрабатывать все коды результатов:

После успешного захвата контента вставьте захваченное изображение в заметку, например:

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

Функция захвата контента должна быть доступна через возможности пользовательского интерфейса только тогда, когда ваше приложение для создания заметок работает в плавающем окне, а не при работе в полноэкранном режиме, запускаемом с экрана блокировки устройства. (Пользователи могут делать снимки экрана самого приложения для создания заметок с помощью функций создания снимков экрана устройства.)

Чтобы определить, находится ли ваше приложение в плавающем окне (или пузырьке), вызовите следующие методы:

  • isLaunchedFromBubble() чтобы убедиться, что приложение для создания заметок не запускалось в полноэкранном режиме с экрана блокировки устройства.
  • isRoleHeld(RoleManager.ROLE_NOTES) чтобы убедиться, что ваше приложение является приложением для создания заметок по умолчанию (ваше приложение может работать в диалоге или другом типе пузырька, если приложение не выполняет роль заметок).

Дополнительные ресурсы