Создайте приложение для заметок

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

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

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

Роль приложения для заметок

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

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

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

Роль заметок может быть только у одного приложения.

Приложение открывается в ответ на неявное действие intent 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 позволяет приложению включать экран устройства во время работы.

Функции приложения

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

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

Когда приложение вызывается с дополнительным параметром intent 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(). Действие intent 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), чтобы проверить, является ли ваше приложение приложением для заметок по умолчанию (если нет, оно может работать в чате или другом типе всплывающего окна).

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

,

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

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

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

Роль приложения для заметок

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

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

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

Роль заметок может быть только у одного приложения.

Приложение открывается в ответ на неявное действие intent 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 позволяет приложению включать экран устройства во время работы.

Функции приложения

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

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

Когда приложение вызывается с дополнительным параметром intent 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(). Действие intent 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), чтобы проверить, является ли ваше приложение приложением для заметок по умолчанию (если нет, оно может работать в чате или другом типе всплывающего окна).

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

,

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

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

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

Роль приложения для заметок

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

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

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

Роль заметок может быть только у одного приложения.

Приложение открывается в ответ на неявное действие intent 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 позволяет приложению включать экран устройства во время работы.

Функции приложения

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

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

Когда приложение вызывается с дополнительным параметром intent 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(). Действие intent 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), чтобы проверить, является ли ваше приложение приложением для заметок по умолчанию (если нет, оно может работать в чате или другом типе всплывающего окна).

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