یک برنامه یادداشت برداری ایجاد کنید

یادداشت‌برداری یکی از قابلیت‌های اصلی 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 intent extra set to true فراخوانده می‌شود، برنامه باید یادداشتی را باز کند که ورودی قلم (یا لمس انگشت) را می‌پذیرد.

اگر intent extra روی 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.  }
 } )

جاوا

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

پنجره‌های شناور

برای یادداشت‌برداری زمینه‌ای، برنامه‌تان باید فعالیتی ارائه دهد که وقتی برنامه دیگری درحال اجرا است در پنجره شناور باز شود.

برنامه شما باید از حالت multi-instance پشتیبانی کند تا کاربران بتوانند چندین یادداشت در چندین پنجره شناور ایجاد کنند، حتی وقتی برنامه یادداشت‌برداری شما در حالت تمام‌صفحه یا صفحه‌بندی‌شده راه‌اندازی شده باشد.

ثبت محتوا

ضبط محتوا یکی از قابلیت‌های کلیدی برنامه‌های یادداشت‌برداری است. با ضبط محتوا، کاربران می‌توانند از نمایشگر پشت پنجره شناور برنامه یادداشت‌برداری نماگرفت بگیرند. کاربران می‌توانند همه یا بخشی از نمایشگر را ضبط کنند، محتوا را در یادداشتشان جای‌گذاری کنند، و محتوای ضبط‌شده را حاشیه‌نویسی یا برجسته کنند.

برنامه یادداشت‌برداری شما باید یک امکان واسط کاربر ارائه دهد که ActivityResultLauncher ایجادشده توسط registerForActivityResult() را راه‌اندازی کند. کنش هدف ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE به‌طور مستقیم یا ازطریق ActivityResultContract به راه‌انداز ارائه می‌شود.

فعالیت سیستم محتوا را ضبط می‌کند، آن را در دستگاه ذخیره می‌کند، و شناسه منبع یکسان محتوا را در آرگومان فراخوانی برگشتی 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")} }

جاوا

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

برنامه شما باید همه کدهای نتیجه را مدیریت کند:

وقتی ضبط محتوا موفقیت‌آمیز بود، تصویر ضبط‌شده را در یادداشت جای‌گذاری کنید، برای مثال:

کاتلین

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

جاوا

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

ویژگی ضبط محتوا باید ازطریق یک امکان واسط کاربری فقط زمانی نمایش داده شود که برنامه یادداشت‌برداری شما در پنجره شناور اجرا می‌شود—نه زمانی که در حالت تمام‌صفحه اجرا می‌شود و از صفحه قفل دستگاه راه‌اندازی شده است. (کاربران می‌توانند بااستفاده از قابلیت‌های نماگرفت دستگاه، از خود برنامه یادداشت‌برداری نماگرفت بگیرند.)

برای تعیین اینکه برنامه‌تان در پنجره شناور (یا حباب) است یا نه، روش‌های زیر را فراخوانی کنید:

  • isLaunchedFromBubble() برای بررسی اینکه برنامه یادداشت‌برداری شما به‌صورت تمام‌صفحه از صفحه قفل دستگاه راه‌اندازی نشده باشد
  • isRoleHeld(RoleManager.ROLE_NOTES) برای تأیید اینکه برنامه‌تان برنامه پیش‌فرض یادداشت‌برداری است (اگر برنامه نقش یادداشت‌برداری را نداشته باشد، می‌تواند در مکالمه یا نوع دیگری از حباب اجرا شود)

منابع بیشتر

،

یادداشت‌برداری یکی از قابلیت‌های اصلی 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 intent extra set to true فراخوانده می‌شود، برنامه باید یادداشتی را باز کند که ورودی قلم (یا لمس انگشت) را می‌پذیرد.

اگر intent extra روی 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.  }
 } )

جاوا

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

پنجره‌های شناور

برای یادداشت‌برداری زمینه‌ای، برنامه‌تان باید فعالیتی ارائه دهد که وقتی برنامه دیگری درحال اجرا است در پنجره شناور باز شود.

برنامه شما باید از حالت multi-instance پشتیبانی کند تا کاربران بتوانند چندین یادداشت در چندین پنجره شناور ایجاد کنند، حتی وقتی برنامه یادداشت‌برداری شما در حالت تمام‌صفحه یا صفحه‌بندی‌شده راه‌اندازی شده باشد.

ثبت محتوا

ضبط محتوا یکی از قابلیت‌های کلیدی برنامه‌های یادداشت‌برداری است. با ضبط محتوا، کاربران می‌توانند از نمایشگر پشت پنجره شناور برنامه یادداشت‌برداری نماگرفت بگیرند. کاربران می‌توانند همه یا بخشی از نمایشگر را ضبط کنند، محتوا را در یادداشتشان جای‌گذاری کنند، و محتوای ضبط‌شده را حاشیه‌نویسی یا برجسته کنند.

برنامه یادداشت‌برداری شما باید یک امکان واسط کاربر ارائه دهد که ActivityResultLauncher ایجادشده توسط registerForActivityResult() را راه‌اندازی کند. کنش هدف ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE به‌طور مستقیم یا ازطریق ActivityResultContract به راه‌انداز ارائه می‌شود.

فعالیت سیستم محتوا را ضبط می‌کند، آن را در دستگاه ذخیره می‌کند، و شناسه منبع یکسان محتوا را در آرگومان فراخوانی برگشتی 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")} }

جاوا

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

برنامه شما باید همه کدهای نتیجه را مدیریت کند:

وقتی ضبط محتوا موفقیت‌آمیز بود، تصویر ضبط‌شده را در یادداشت جای‌گذاری کنید، برای مثال:

کاتلین

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

جاوا

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

ویژگی ضبط محتوا باید ازطریق یک امکان واسط کاربری فقط زمانی نمایش داده شود که برنامه یادداشت‌برداری شما در پنجره شناور اجرا می‌شود—نه زمانی که در حالت تمام‌صفحه اجرا می‌شود و از صفحه قفل دستگاه راه‌اندازی شده است. (کاربران می‌توانند بااستفاده از قابلیت‌های نماگرفت دستگاه، از خود برنامه یادداشت‌برداری نماگرفت بگیرند.)

برای تعیین اینکه برنامه‌تان در پنجره شناور (یا حباب) است یا نه، روش‌های زیر را فراخوانی کنید:

  • isLaunchedFromBubble() برای بررسی اینکه برنامه یادداشت‌برداری شما به‌صورت تمام‌صفحه از صفحه قفل دستگاه راه‌اندازی نشده باشد
  • isRoleHeld(RoleManager.ROLE_NOTES) برای تأیید اینکه برنامه‌تان برنامه پیش‌فرض یادداشت‌برداری است (اگر برنامه نقش یادداشت‌برداری را نداشته باشد، می‌تواند در مکالمه یا نوع دیگری از حباب اجرا شود)

منابع بیشتر

،

یادداشت‌برداری یکی از قابلیت‌های اصلی 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 intent extra set to true فراخوانده می‌شود، برنامه باید یادداشتی را باز کند که ورودی قلم (یا لمس انگشت) را می‌پذیرد.

اگر intent extra روی 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.  }
 } )

جاوا

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

پنجره‌های شناور

برای یادداشت‌برداری زمینه‌ای، برنامه‌تان باید فعالیتی ارائه دهد که وقتی برنامه دیگری درحال اجرا است در پنجره شناور باز شود.

برنامه شما باید از حالت multi-instance پشتیبانی کند تا کاربران بتوانند چندین یادداشت در چندین پنجره شناور ایجاد کنند، حتی وقتی برنامه یادداشت‌برداری شما در حالت تمام‌صفحه یا صفحه‌بندی‌شده راه‌اندازی شده باشد.

ثبت محتوا

ضبط محتوا یکی از قابلیت‌های کلیدی برنامه‌های یادداشت‌برداری است. با ضبط محتوا، کاربران می‌توانند از نمایشگر پشت پنجره شناور برنامه یادداشت‌برداری نماگرفت بگیرند. کاربران می‌توانند همه یا بخشی از نمایشگر را ضبط کنند، محتوا را در یادداشتشان جای‌گذاری کنند، و محتوای ضبط‌شده را حاشیه‌نویسی یا برجسته کنند.

برنامه یادداشت‌برداری شما باید یک امکان واسط کاربر ارائه دهد که ActivityResultLauncher ایجادشده توسط registerForActivityResult() را راه‌اندازی کند. کنش هدف ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE به‌طور مستقیم یا ازطریق ActivityResultContract به راه‌انداز ارائه می‌شود.

فعالیت سیستم محتوا را ضبط می‌کند، آن را در دستگاه ذخیره می‌کند، و شناسه منبع یکسان محتوا را در آرگومان فراخوانی برگشتی 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")} }

جاوا

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

برنامه شما باید همه کدهای نتیجه را مدیریت کند:

وقتی ضبط محتوا موفقیت‌آمیز بود، تصویر ضبط‌شده را در یادداشت جای‌گذاری کنید، برای مثال:

کاتلین

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

جاوا

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

ویژگی ضبط محتوا باید ازطریق یک امکان واسط کاربری فقط زمانی نمایش داده شود که برنامه یادداشت‌برداری شما در پنجره شناور اجرا می‌شود—نه زمانی که در حالت تمام‌صفحه اجرا می‌شود و از صفحه قفل دستگاه راه‌اندازی شده است. (کاربران می‌توانند بااستفاده از قابلیت‌های نماگرفت دستگاه، از خود برنامه یادداشت‌برداری نماگرفت بگیرند.)

برای تعیین اینکه برنامه‌تان در پنجره شناور (یا حباب) است یا نه، روش‌های زیر را فراخوانی کنید:

  • isLaunchedFromBubble() برای بررسی اینکه برنامه یادداشت‌برداری شما به‌صورت تمام‌صفحه از صفحه قفل دستگاه راه‌اندازی نشده باشد
  • isRoleHeld(RoleManager.ROLE_NOTES) برای تأیید اینکه برنامه‌تان برنامه پیش‌فرض یادداشت‌برداری است (اگر برنامه نقش یادداشت‌برداری را نداشته باشد، می‌تواند در مکالمه یا نوع دیگری از حباب اجرا شود)

منابع بیشتر