Crea un'app per scrivere note

L'aggiunta di note è una funzionalità di base 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 note per la revisione e la revisione successive.

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

Il supporto dello stilo per la creazione di note offre un'esperienza utente eccezionale.

Ruolo Note

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

Per acquisire il ruolo Note per la tua app:

  1. Chiama isRoleAvailable() per verificare 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'intento di richiedere all'utente di concedere il ruolo per le note alla tua app.

Solo un'app può avere il ruolo Note.

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

File manifest dell'app

Per essere idonea al 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 Note alla tua app, rendendola l'applicazione predefinita per le note:

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

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

  • turnScreenOn consente alla tua app di attivare lo schermo del dispositivo quando è in esecuzione

Funzionalità dell'app

Un'app per la creazione di note differenziata offre un'ampia gamma di funzionalità per la creazione di note.

Supporto per stilo

Quando la tua app viene richiamata con l'extra per l'intent EXTRA_USE_STYLUS_MODE impostato su true, l'app dovrebbe aprire una nota che accetta l'inserimento di stilo (o tocco con il dito).

Se l'elemento aggiuntivo per intent è impostato su false, la tua app dovrebbe aprire una nota che accetta l'inserimento da tastiera.

Accesso alla schermata di blocco

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

L'app dovrebbe mostrare solo le note della cronologia se l'utente ha acconsentito (nello stato del dispositivo sbloccato) a mostrare le note precedenti. In caso contrario, quando viene aperta 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 il numero 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.
  }
});

Finestre mobili

Per l'inserimento di note contestuali, la tua app deve fornire un'attività che si apre in una finestra mobile quando è in esecuzione un'altra applicazione.

La tua 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 è stata avviata a schermo intero o in modalità schermo diviso.

Acquisizione dei contenuti

L'acquisizione di contenuti è una funzionalità fondamentale per le app per prendere appunti. Con l'acquisizione dei contenuti, gli utenti possono acquisire screenshot del display dietro la finestra mobile dell'app per scrivere note. Gli utenti possono acquisire interamente o parzialmente la visualizzazione, incollare i contenuti nella nota e annotare o evidenziare i contenuti acquisiti.

L'app per scrivere note dovrebbe fornire un'offerta UI che avvii un elemento ActivityResultLauncher creato da registerForActivityResult(). L'azione intent ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE viene fornita ad 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 generico 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));
        });
}

L'app deve gestire tutti i codici risultato:

Quando l'acquisizione dei contenuti ha esito positivo, incolla l'immagine acquisita nella nota, ad esempio:

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

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

Per determinare se l'app si trova in una finestra mobile (o in un fumetto), chiama i seguenti metodi:

  • isLaunchedFromBubble() per verificare 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 scrivere note (la tua app può essere eseguita in una conversazione o in un altro tipo di fumetto se l'app non ha il ruolo per le note)

Risorse aggiuntive