تقریباً هر تجربه چند دستگاهی با یافتن دستگاه های موجود آغاز می شود. برای سادهسازی این کار رایج، Device Discovery API را ارائه میکنیم.
گفتگوی انتخاب دستگاه را اجرا کنید
Device Discovery از یک گفتگوی سیستم استفاده می کند تا به کاربر اجازه دهد دستگاه مورد نظر را انتخاب کند. برای شروع گفتگوی انتخاب دستگاه، ابتدا باید یک کلاینت کشف دستگاه دریافت کنید و یک گیرنده نتیجه را ثبت کنید. توجه داشته باشید که مشابه registerForActivityResult
، این گیرنده باید بدون قید و شرط به عنوان بخشی از مسیر اولیه فعالیت یا قطعه ثبت شود.
کاتلین
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices) }
جاوا
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); devicePickerLauncher = Discovery.create(this).registerForResult(this, handleDevices); }
در قطعه کد بالا، یک شی handleDevices
تعریف نشده داریم. پس از اینکه کاربر دستگاههایی را برای اتصال انتخاب کرد و پس از اینکه SDK با موفقیت به دستگاههای دیگر متصل شد، این پاسخ تماس فهرستی از Participants
انتخاب شده را دریافت میکند.
کاتلین
handleDevices = OnDevicePickerResultListener { participants -> participants.forEach { // Use participant info } }
جاوا
handleDevices = participants -> { for (Participant participant : participants) { // Use participant info } }
پس از اینکه انتخابگر دستگاه ثبت شد، آن را با استفاده از نمونه devicePickerLauncher
راه اندازی کنید. DevicePickerLauncher.launchDevicePicker
دو پارامتر را می گیرد - یک لیست از فیلترهای دستگاه (به بخش زیر مراجعه کنید) و یک startComponentRequest
. startComponentRequest
برای نشان دادن اینکه کدام فعالیت باید در دستگاه دریافت کننده شروع شود و دلیل درخواستی که به کاربر نشان داده می شود استفاده می شود.
کاتلین
devicePickerLauncher.launchDevicePicker( listOf(), startComponentRequest { action = "com.example.crossdevice.MAIN" reason = "I want to say hello to you" }, )
جاوا
devicePickerLauncher.launchDevicePickerFuture( Collections.emptyList(), new StartComponentRequest.Builder() .setAction("com.example.crossdevice.MAIN") .setReason("I want to say hello to you") .build());
درخواست های اتصال را بپذیرید
هنگامی که کاربر دستگاهی را در انتخابگر دستگاه انتخاب می کند، یک گفتگو در دستگاه دریافت کننده ظاهر می شود تا از کاربر بخواهد اتصال را بپذیرد. پس از پذیرش، فعالیت هدف راهاندازی میشود که میتوان آن را در onCreate
و onNewIntent
مدیریت کرد.
کاتلین
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) handleIntent(getIntent()) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { val participant = Discovery.create(this).getParticipantFromIntent(intent) // Accept connection from participant (see below) }
جاوا
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); handleIntent(getIntent()); } @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { Participant participant = Discovery.create(this).getParticipantFromIntent(intent); // Accept connection from participant (see below) }
فیلترهای دستگاه
هنگام کشف دستگاهها، معمول است که بخواهید این دستگاهها را فیلتر کنید تا فقط موارد مربوط به مورد استفاده را نشان دهید. به عنوان مثال:
- فیلتر کردن فقط برای دستگاههای دارای دوربین برای کمک به اسکن کد QR
- فیلتر کردن فقط روی تلویزیون ها برای تجربه تماشای صفحه بزرگ
برای این پیشنمایش توسعهدهنده، ما با قابلیت فیلتر کردن به دستگاههای متعلق به یک کاربر شروع میکنیم.
می توانید فیلتر دستگاه را با استفاده از کلاس DeviceFilter
مشخص کنید:
کاتلین
val deviceFilters = listOf(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY))
جاوا
List<DeviceFilter> deviceFilters = Arrays.asList(DeviceFilter.trustRelationshipFilter(MY_DEVICES_ONLY));
هنگامی که فیلترهای دستگاه را تعریف کردید، می توانید کشف دستگاه را آغاز کنید.
کاتلین
devicePickerLauncher.launchDevicePicker(deviceFilters, startComponentRequest)
جاوا
Futures.addCallback( devicePickerLauncher.launchDevicePickerFuture(deviceFilters, startComponentRequest), new FutureCallback<Void>() { @Override public void onSuccess(Void result) { // do nothing, result will be returned to handleDevices callback } @Override public void onFailure(Throwable t) { // handle error } }, mainExecutor);
توجه داشته باشید که launchDevicePicker
یک تابع ناهمزمان است که از کلمه کلیدی suspend
استفاده می کند.