创建记事应用

การจดบันทึกเป็นความสามารถหลักของ Android ที่ช่วยเพิ่มประสิทธิภาพการทำงานของผู้ใช้ใน อุปกรณ์ที่มีหน้าจอขนาดใหญ่ แอปสำหรับจดโน้ตช่วยให้ผู้ใช้เขียนและร่างภาพได้ หน้าต่างแบบลอยหรือในโหมดเต็มหน้าจอ จับภาพและใส่คำอธิบายประกอบเนื้อหาบนหน้าจอ และบันทึกหมายเหตุไว้เพื่อตรวจทานและแก้ไขในภายหลัง

ผู้ใช้จะเข้าถึงแอปจดโน้ตได้จากหน้าจอล็อกหรือขณะเรียกใช้แอปอื่น แอป

การรองรับสไตลัสสำหรับการจดโน้ตช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ยอดเยี่ยม

บทบาท "การจดบันทึก"

RoleManager.ROLE_NOTES จะระบุแอปจดโน้ตและให้สิทธิ์ LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE สิทธิ์

หากต้องการรับบทบาท "โน้ต" สำหรับแอป ให้ทำดังนี้

  1. โทร isRoleAvailable() เพื่อตรวจสอบสถานะของบทบาท
  2. หากบทบาท "โน้ต" พร้อมใช้งาน โปรดโทรหา createRequestRoleIntent() เพื่อดูความตั้งใจที่เฉพาะเจาะจงกับโน้ต
  3. โทร startActivityForResult() พร้อมความตั้งใจที่จะแจ้งให้ผู้ใช้มอบบทบาทโน้ตแก่ แอป

มีบทบาทในโน้ตได้เพียงแอปเดียวเท่านั้น

แอปจะเปิดขึ้นตามการโต้ตอบโดยนัย ACTION_CREATE_NOTE การดำเนินการผ่าน Intent หากเรียกใช้จากหน้าจอล็อกของอุปกรณ์ แอปจะเปิดขึ้นอย่างสมบูรณ์ บนหน้าจอ หากเรียกใช้ขณะที่หน้าจอปลดล็อกอยู่ ในหน้าต่างแบบลอย

ไฟล์ Manifest ของแอป

แอปของคุณต้องมีประกาศต่อไปนี้จึงจะมีสิทธิ์ได้รับบทบาท "โน้ต" ในไฟล์ Manifest ของแอป

<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 ตั้งค่าการดำเนินการของ Intent ที่แอปของคุณตอบสนอง

  • showWhenLocked ทำให้เข้าถึงแอปได้จากหน้าจอล็อกของอุปกรณ์

  • turnScreenOn เปิดใช้ แอปเพื่อเปิดหน้าจออุปกรณ์เมื่อแอปทำงาน

ฟีเจอร์ต่างๆ ของแอป

แอปจดโน้ตที่มีหน้าจอขนาดใหญ่ซึ่งแตกต่างจากฟีเจอร์อื่นจะช่วยเสริมประสิทธิภาพอย่างเต็มรูปแบบ ของความสามารถในการจดโน้ต

รองรับสไตลัส

เมื่อแอปของคุณมีการเรียกใช้ด้วย EXTRA_USE_STYLUS_MODE ตั้งค่า Intent เพิ่มเติมเป็น true แอปควรเปิดโน้ตที่ยอมรับสไตลัส (หรือ ใช้นิ้วสัมผัส)

หากตั้งค่า Intent เพิ่มเติมเป็น false แอปควรเปิดโน้ตที่ยอมรับ การป้อนข้อมูลด้วยแป้นพิมพ์

การเข้าถึงหน้าจอล็อก

แอปของคุณต้องมีกิจกรรมแบบเต็มหน้าจอที่เรียกใช้เมื่อแอป เปิดจากหน้าจอล็อกของอุปกรณ์แล้ว

แอปของคุณควรแสดงเฉพาะบันทึกที่ผ่านมาหากผู้ใช้ให้ความยินยอม (ใน สถานะอุปกรณ์ที่ได้รับการปลดล็อก) เพื่อแสดงโน้ตที่ผ่านมา มิฉะนั้น เมื่อเปิดจาก แอปของคุณควรสร้างโน้ตใหม่เสมอ

คุณสามารถตรวจสอบว่าได้เปิดแอปของคุณจากหน้าจอล็อกหรือไม่ด้วย KeyguardManager#isKeyguardLocked() หากต้องการขอให้ผู้ใช้ตรวจสอบสิทธิ์และปลดล็อกอุปกรณ์ โปรดโทร 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.
  }
});

หน้าต่างแบบลอย

สำหรับการจดโน้ตตามบริบท แอปของคุณต้องมีกิจกรรมที่เปิดขึ้นใน หน้าต่างแบบลอยเมื่อแอปพลิเคชันอื่นกำลังทำงาน

แอปของคุณควรรองรับ multi-instance เพื่อให้ผู้ใช้สามารถสร้างบันทึกหลายรายการในหน้าต่างแบบลอยได้หลายหน้าต่าง เมื่อเปิดแอปจดโน้ตแบบเต็มหน้าจอหรือแบบแยกหน้าจอ

การบันทึกเนื้อหา

การบันทึกเนื้อหาเป็นความสามารถที่สำคัญของแอปการจดบันทึก มีเนื้อหา ในการจับภาพ ผู้ใช้จึงถ่ายภาพหน้าจอของจอแสดงผลที่อยู่หลังการจดโน้ตได้ หน้าต่างแบบลอยของแอป ผู้ใช้จับภาพจอแสดงผลทั้งหมดหรือบางส่วน แล้ววาง ลงในบันทึก และใส่คำอธิบายประกอบหรือไฮไลต์เนื้อหาที่จับได้

แอปจดโน้ตของคุณควรมีราคา UI ที่สามารถเปิดตัว ActivityResultLauncher สร้างโดย registerForActivityResult() ACTION_LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE จะดำเนินการผ่าน Intent ให้ตัวเรียกใช้งานโดยตรงหรือผ่าน ActivityResultContract

กิจกรรมของระบบจะบันทึกเนื้อหา บันทึกไว้ในอุปกรณ์ และส่งคืนค่า URI เนื้อหาไปยังแอปของคุณในอาร์กิวเมนต์ Callback ของ registerForActivityResult()

ตัวอย่างต่อไปนี้ใช้แท็กทั่วไป 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));
        });
}

แอปของคุณควรจัดการรหัสผลลัพธ์ทั้งหมดดังนี้

เมื่อจับภาพเนื้อหาเรียบร้อยแล้ว ให้วางรูปภาพที่จับภาพไว้ลงในโน้ตสำหรับ ตัวอย่าง:

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

ควรเปิดเผยฟีเจอร์การจับภาพเนื้อหาผ่านการชำระเงิน UI เฉพาะเมื่อ แอปจดโน้ตกำลังทำงานในหน้าต่างแบบลอย ไม่ใช่เมื่อ แสดงแบบเต็มหน้าจอ เปิดจากหน้าจอล็อกของอุปกรณ์ (ผู้ใช้สามารถใช้เวลา ภาพหน้าจอของแอปสำหรับจดโน้ตด้วยภาพหน้าจอของอุปกรณ์ อื่นๆ)

หากต้องการทราบว่าแอปอยู่ในหน้าต่างแบบลอย (หรือลูกโป่ง) หรือไม่ ให้เรียกใช้ วิธีการต่อไปนี้

  • isLaunchedFromBubble() เพื่อตรวจสอบว่าแอปจดโน้ตไม่ได้เปิดแอปแบบเต็มหน้าจอจาก หน้าจอล็อกของอุปกรณ์
  • isRoleHeld(RoleManager.ROLE_NOTES) เพื่อยืนยันว่าแอปของคุณเป็นแอปจดโน้ตเริ่มต้น (แอปสามารถ ในการสนทนาหรือบับเบิลประเภทอื่นๆ หากแอปไม่คง บทบาทโน้ต)

แหล่งข้อมูลเพิ่มเติม