تقریباً هر تجربه چنددستگاهی با پیدا کردن دستگاههای دردسترس شروع میشود. برای ساده کردن این تکلیف رایج، Device Discovery API را ارائه میدهیم.
راهاندازی کادر گفتگوی انتخاب دستگاه
«یافتن دستگاه» از کادر گفتگوی سیستم استفاده میکند تا به کاربر اجازه دهد دستگاه هدف را انتخاب کند. برای
راهاندازی کادر گفتگوی انتخاب دستگاه، ابتدا باید یک کارخواه اکتشاف دستگاه
دریافت کنید و یک گیرنده نتیجه ثبت کنید. توجه داشته باشید که مشابه
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 تعریفنشدهای داریم. پساز اینکه کاربر دستگاهها را برای اتصال انتخاب کرد و وقتی کیت توسعه نرمافزار باموفقیت به دستگاههای دیگر متصل شد، این فراخوانی برگشتی فهرست 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) }
فیلترهای دستگاه
هنگام کشف دستگاهها، معمولاً میخواهید این دستگاهها را فیلتر کنید تا فقط دستگاههای مرتبط با مورد استفاده فعلی نشان داده شوند. برای مثال:
- فیلتر کردن فقط برای دستگاههای دارای دوربین برای کمک به اسکن کردن رمزینه پاسخسریع
- درحال فیلتر کردن فقط برای تلویزیونها برای تجربه تماشا در صفحهنمایش بزرگ
برای این پیشنمایش توسعهدهندگان نرمافزار، با توانایی فیلتر کردن دستگاههای متعلق به یک کاربر شروع میکنیم.
میتوانید فیلتر دستگاه را بااستفاده از کلاس 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 استفاده میکند.