Crea un'app per scrivere note

L'aggiunta di note è una funzionalità fondamentale di Android che migliora la produttività degli utenti sui dispositivi con schermi di grandi dimensioni. Le app per creare note consentono agli utenti di scrivere e disegnare in una finestra mobile o a schermo intero, acquisire e annotare i contenuti dello schermo e salvare le note per rivederle e rivederle in un secondo momento.

Gli utenti possono accedere alle app per creare note dalla schermata di blocco o mentre eseguono altre app.

Il supporto dello stilo per l'aggiunta di note offre un'esperienza utente eccezionale.

Ruolo Note

Il ruolo RoleManager.ROLE_NOTES identifica le app per creare note e concede loro l'autorizzazione LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE.

Per acquisire il ruolo per le note per la tua app:

  1. Chiama isRoleAvailable() per controllare lo stato del ruolo.
  2. Se il ruolo per le note è disponibile, chiama createRequestRoleIntent() per ottenere un intent specifico per le note.
  3. Chiama startActivityForResult() con l'intent per le note per richiedere all'utente di concedere il ruolo per le note alla tua app.

Il ruolo Note può essere associato a un'unica app.

L'app si apre in risposta a un'azione con intent ACTION_CREATE_NOTE implicita. Se la chiamata viene richiamata dalla schermata di blocco del dispositivo, l'app si apre a schermo intero; se viene richiamata quando lo schermo è sbloccato, in una finestra mobile.

File manifest dell'app

Per poter usufruire del ruolo Note, la tua app deve includere la seguente dichiarazione nel file manifest dell'app:

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

La dichiarazione consente agli utenti di assegnare il ruolo per le note alla tua app, rendendola l'applicazione predefinita per l'aggiunta di note:

  • ACTION_CREATE_NOTE imposta l'azione intent a cui risponde la tua app

  • showWhenLocked rende la tua app accessibile dalla schermata di blocco del dispositivo

  • turnScreenOn consente all'app di attivare lo schermo del dispositivo quando è in esecuzione

Funzionalità dell'app

Un'app per prendere appunti differenziata su un grande schermo offre un'ampia gamma di funzionalità per prendere appunti.

Supporto per stilo

Quando la tua app viene richiamata con l'intent aggiuntivo EXTRA_USE_STYLUS_MODE impostato su true, l'app dovrebbe aprire una nota che accetta l'input con lo stilo (o il tocco con le dita).

Se l'intent extra è impostato su false, l'app dovrebbe aprire una nota che accetta l'input da tastiera.

Accesso alla schermata di blocco

L'app deve fornire un'attività a schermo intero che viene eseguita quando viene aperta dalla schermata di blocco del dispositivo.

L'app deve mostrare solo le note storiche se l'utente ha acconsentito (con lo stato del dispositivo sbloccato) a mostrare le note precedenti. Altrimenti, quando la apri dalla schermata di blocco, l'app dovrebbe sempre creare una nuova nota.

Puoi controllare se la tua app è stata avviata dalla schermata di blocco con KeyguardManager#isKeyguardLocked(). Per chiedere all'utente di autenticare e sbloccare il dispositivo, chiama 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.
        }
    }
)

Finestre mobili

Per prendere appunti contestuali, la tua app deve fornire un'attività che si apre in una finestra mobile mentre è in esecuzione un'altra applicazione.

L'app dovrebbe supportare la modalità multi-instance in modo che gli utenti possano creare più note in più finestre mobili anche quando l'app per creare note viene avviata a schermo intero o in modalità schermo diviso.

Acquisizione dei contenuti

L'acquisizione di contenuti è una funzionalità chiave delle app per creare note. Con l'acquisizione di contenuti, gli utenti possono acquisire screenshot del display dietro la finestra mobile dell'app per creare note. Gli utenti possono acquisire tutta o parte dello schermo, incollare i contenuti nella nota e annotare o evidenziare i contenuti acquisiti.

L'app per creare note deve fornire un'invito UI che avvii una ActivityResultLauncher creata da registerForActivityResult(). L'azione di intent ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE viene fornita all'Avvio app direttamente o tramite un ActivityResultContract.

Un'attività di sistema acquisisce i contenuti, li salva sul dispositivo e restituisce l'URI dei contenuti alla tua app nell'argomento di callback di registerForActivityResult().

L'esempio seguente utilizza un contratto StartActivityForResult generico:

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

L'app deve gestire tutti i codici risultato:

Al termine dell'acquisizione dei contenuti, incolla l'immagine acquisita nella nota, ad esempio:

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

La funzionalità di acquisizione dei contenuti deve essere esposta tramite un'invito dell'interfaccia utente solo quando l'app per creare note è in esecuzione in una finestra mobile, non quando è in esecuzione la modalità a schermo intero, avviata dalla schermata di blocco del dispositivo. Gli utenti possono acquisire gli screenshot dell'app per creare note con le funzionalità di screenshot del dispositivo.

Per determinare se la tua app si trova in una finestra mobile (o in una bolla), richiama i seguenti metodi:

  • isLaunchedFromBubble() per controllare che l'app per creare note non sia stata avviata a schermo intero dalla schermata di blocco del dispositivo
  • isRoleHeld(RoleManager.ROLE_NOTES) per verificare che la tua app sia l'app predefinita per la creazione di note (la tua app può essere eseguita in una conversazione o in un altro tipo di fumetto se l'app non ha il ruolo Note)

Risorse aggiuntive