メモ作成は、大画面デバイスでユーザーの生産性を向上させる Android のコア機能です。メモ作成アプリを使用すると、フローティング ウィンドウまたは全画面での文書作成やスケッチ、画面のコンテンツをキャプチャして注釈を付ける、メモを保存して後で確認、修正することができます。
メモ作成アプリには、ロック画面からでも、他のアプリの実行中でもアクセスできます。
メモ作成のタッチペン サポートにより、ユーザー エクスペリエンスが向上します。
メモのロール
RoleManager.ROLE_NOTES
ロールは、メモ作成アプリを識別し、LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE
権限を付与します。
アプリでメモのロールを取得する手順は次のとおりです。
isRoleAvailable()
を呼び出してロールのステータスを確認します。- メモのロールが利用可能な場合は、
createRequestRoleIntent()
を呼び出してメモ固有のインテントを取得します。 - メモのインテントを指定して
startActivityForResult()
を呼び出し、アプリにメモのロールを付与するようユーザーに求めます。
メモのロールを所有できるアプリは 1 つのみです。
アプリは暗黙的な 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
モードをサポートする必要があります。
コンテンツ キャプチャ
コンテンツ キャプチャはメモ作成アプリの重要な機能です。コンテンツ キャプチャにより、ユーザーはメモ作成アプリのフローティング ウィンドウの背後にあるディスプレイのスクリーンショットを撮ることができます。ユーザーはディスプレイのすべてまたは一部をキャプチャし、そのコンテンツをメモに貼り付け、キャプチャしたコンテンツに注釈やハイライトを付けることができます。
メモ作成アプリには、registerForActivityResult()
によって作成された ActivityResultLauncher
を起動する UI アフォーダンスが必要です。ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE
インテントのアクションは、直接または ActivityResultContract
を介してランチャーに提供されます。
システム アクティビティは、コンテンツをキャプチャしてデバイスに保存し、registerForActivityResult()
のコールバック引数でアプリにコンテンツ URI を返します。
次の例では、汎用の 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")}
}
アプリは以下のすべての結果コードを処理する必要があります。
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
コンテンツ キャプチャに成功したら、キャプチャした画像をメモに貼り付けます。次に例を示します。
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.
}
}
コンテンツ キャプチャ機能は、メモ作成アプリがフローティング ウィンドウで実行されている場合にのみ、UI アフォーダンスを通じて公開する必要があります。デバイスのロック画面から起動され、全画面表示で実行されている場合は必要ありません。(ユーザーは、デバイスのスクリーンショット機能を使用して、メモ作成アプリ自体のスクリーンショットを撮ることができます)。
アプリがフローティング ウィンドウ(またはバブル)で実行されているかどうかを判断するには、次のメソッドを呼び出します。
isLaunchedFromBubble()
: メモ作成アプリがデバイスのロック画面から全画面表示で起動されていないことを確認します。isRoleHeld(RoleManager.ROLE_NOTES)
: アプリがデフォルトのメモ作成アプリであることを確認します(アプリにメモのロールがない場合は、会話やその他の種類のバブル内で実行できます)。