Dasar-dasar aplikasi

Memungkinkan interaksi lintas perangkat yang lancar

Speaker

Tentang

Tentang konferensi

Saat pengguna berpindah antara ponsel, perangkat wearable, dan periferal audio, memberikan pengalaman lintas perangkat yang lancar menjadi sangat penting untuk engagement. Namun, mengandalkan pendekatan jaringan standar sering kali menyebabkan baterai terkuras, lonjakan latensi, dan sesi pengguna yang terfragmentasi.

Pembahasan mendalam ini memperkenalkan API Android khusus yang dibuat untuk komunikasi multiperangkat, yang menawarkan pola hemat memori dan daya untuk menjaga transisi antarperangkat tetap instan, andal, dan intuitif.

Ringkasan

  • Pengelola Perangkat Pendamping menggantikan layanan latar depan untuk periferal Bluetooth dengan mengaktifkan aplikasi berdasarkan kehadiran dan mengelola koneksi tanpa menguras baterai. Android 17 menambahkan profil baru khusus untuk perangkat medis dan pelacak kebugaran.
  • Jetpack Telecom bertindak sebagai koordinator panggilan sistem untuk aplikasi VoIP di seluruh perangkat terhubung seperti smartwatch dan mobil, yang berfungsi kembali ke Android 8. Fitur ini juga menyinkronkan tindakan bisukan dan tutup telepon melalui CallControlScope.
  • Fitur Jetpack Telecom 1.1.0 mendatang mencakup histori panggilan terpadu di telepon sistem (SDK 36.1+) dan pemisahan jaringan 5G otomatis di jaringan operator yang didukung.
  • Quick Share SDK akan diluncurkan tahun depan sehingga developer dapat menyematkan fitur berbagi file lokal yang dienkripsi end-to-end langsung ke aplikasi Android dan iOS. Tempel untuk berbagi (diluncurkan dengan Pixel 11) bahkan dapat otomatis mengaktifkan aplikasi penerima yang ditutup.

Resource

Gemini Notebook

Topik

  • lintas perangkat
  • companion-device-manager
  • jetpack-telecom
  • quick-share
  • bluetooth
  • voip
  • peer-to-peer

Transkrip

Pengantar interaksi lintas perangkat

  • Halo, semuanya.

  • Selamat datang di Memungkinkan Interaksi Lintas Perangkat yang Lancar.

  • Saya Hanrui, dan hari ini saya ditemani oleh rekan saya, Yacine dan Nataraj.

  • Saat kita membahas konektivitas, yang sering terpikirkan adalah link jaringan dasar atau headset Bluetooth.

  • Di Android, konektivitas jauh lebih luas dari itu.

  • Tujuannya adalah membuat perangkat berfungsi lebih baik jika digunakan bersama.

  • Hari ini, kami akan membahas skenario lintas perangkat yang umum dan menunjukkan API yang tepat untuk setiap skenario.

  • Selama beberapa waktu, kita biasa membuat aplikasi untuk satu perangkat, yaitu ponsel saja.

  • Kemudian, perangkat wearable mulai populer.

  • Tak lama kemudian, smartwatch yang disambungkan dengan ponsel, menyinkronkan data di latar belakang, atau menerima panggilan langsung menjadi hal yang sangat umum.

  • Tambahkan ear-- tambahkan earbud nirkabel.

  • Sekarang, pengguna dapat beralih perangkat audio di tengah panggilan, dari smartwatch ke ponsel, ke earbud, atau ke mobil.

  • Baru-baru ini, banyak pengguna juga membawa perangkat layar besar kedua, seperti perangkat foldable atau tablet.

  • Mereka mengharapkan aplikasi berfungsi dengan lancar di berbagai perangkat ini.

  • Hal ini juga berlaku untuk laptop dan Chromebook, tempat pengguna dapat menjalankan aplikasi Android dan tetap terhubung langsung dari meja mereka.

  • Bahkan pada tahun 2023, rata-rata pengguna memiliki antara tiga hingga empat perangkat.

  • Pengguna mengharapkan lebih dari sekadar fungsi mandiri di perangkat ini.

  • Mereka mencari pengalaman yang luar biasa saat menggunakan perangkat bersama-sama.

  • Pengalaman yang lebih baik saat digunakan bersama ini sangat jelas terlihat saat orang-orang berada di ruangan yang sama seperti kita saat ini dan menginginkan cara mudah untuk berbagi foto, link, atau aplikasi kepada orang di sebelah mereka.

  • Melihat angkanya, ekosistem ini sangat besar dan berkembang pesat.

  • Pada tahun ini, ada sekitar 22 miliar perangkat IoT di seluruh dunia, yang tumbuh 14% dari tahun ke tahun.

  • Dan di antara semua endpoint ini, Wi-Fi mencakup sepertiga dan Bluetooth mencakup seperempat.

  • Konektivitas lintas perangkat bukan lagi kasus ekstrem.

  • AI adalah bagian dari kehidupan kita sehari-hari.

  • Namun saat ini, sebagian besar aplikasi masih membangun fitur lintas perangkatnya di API Bluetooth dan jaringan level rendah, yang menimbulkan tiga tantangan.

  • Pertama, baterai dan memori.

  • Membiarkan pemindaian dan layanan latar belakang tetap berjalan akan menguras baterai dan memori.

  • Kedua, latensi.

  • Penundaan yang tidak dapat diprediksi mengganggu panggilan dan sinkronisasi data real-time.

  • Ketiga, hambatan koneksi.

  • Mengelola penemuan, penyambungan, dan penyambungan ulang di semua perangkat itu rumit dan dapat dengan mudah menyebabkan pengalaman pengguna yang buruk.

  • Untuk mengatasi masalah tersebut, kami telah membangun API yang dibuat khusus di tiga area utama untuk membuat fitur lintas perangkat menjadi sangat sederhana.

  • Saya akan mulai dengan aplikasi pendamping, lalu Nataraj akan membahas aplikasi VoIP, dan kemudian Yacine akan membahas berbagi P2P.

Ringkasan aplikasi pendamping

  • Mari kita lihat aplikasi pendamping terlebih dahulu.

  • Aplikasi pendamping adalah aplikasi yang Anda instal di ponsel agar perangkat pendamping, seperti smartwatch atau sensor glukosa, dapat berfungsi dengan baik.

  • Di bagian ini, kita akan berfokus pada perangkat yang terhubung melalui Bluetooth.

  • Biasanya ada empat kategori perangkat pendamping.

  • Pertama, perangkat medis, seperti sensor glukosa dan monitor tanda vital.

  • Dan perangkat wearable, seperti smartwatch dan gelang kebugaran.

  • Headset, dengan Sambungan Cepat dan kontrol cerdas.

  • Dan kit mobil, untuk hal-hal seperti kunci mobil digital dan panggilan handsfree.

  • Setiap kategori memiliki perjalanan pengguna utama masing-masing, tetapi semuanya bergantung pada koneksi yang andal antara perangkat dan ponsel.

  • Untuk perangkat medis, koneksi tersebut bahkan dapat menjadi sangat penting bagi kehidupan.

  • Mari kita bahas empat kebutuhan umum yang kami lihat di berbagai kategori ini.

  • Pertama, pengelolaan perangkat.

  • Aplikasi perlu menemukan perangkat yang tepat di antara semua perangkat di sekitar, seperti smartwatch di sini, bukan earbud atau speaker, lalu memulai alur penyambungan untuk menghubungkan.

  • Kedua, pemeriksaan kehadiran.

  • Aplikasi perlu mengetahui kapan perangkat berada di sekitar dan kapan perangkat tidak ada.

  • Dan saat perangkat muncul, aplikasi memerlukan cara untuk diaktifkan sehingga dapat melakukan tugasnya meskipun pengguna belum membukanya.

  • Ketiga, pemeliharaan koneksi.

  • Setelah terhubung, aplikasi ingin koneksi tersebut andal dan persisten.

  • Jika koneksi terputus, misalnya pengguna keluar dari jangkauan lalu kembali, aplikasi harus otomatis terhubung kembali, meskipun tidak berjalan pada saat itu.

  • Keempat, sinkronisasi dan transfer data.

  • Di sinilah nilai sebenarnya.

  • Menyinkronkan pembacaan sensor, mengirim update firmware, atau mengirim setelan ke perangkat.

  • Untuk perangkat medis, hal ini bisa sangat penting.

  • Pembacaan yang terlewat dapat berarti peringatan yang terlewat.

  • Semua ini memerlukan proses aplikasi untuk tetap aktif dan terhubung pada waktu yang tepat.

  • Jadi, bagaimana aplikasi memenuhi semua kebutuhan ini?

  • Biasanya, aplikasi sangat bergantung pada layanan latar depan.

  • Berikut adalah contoh penerapan umum.

  • Jika Anda pernah membuat aplikasi pendamping sebelumnya, hal ini mungkin terlihat familier.

  • Anda menyatakan izin pemindaian dan koneksi Bluetooth, izin layanan latar depan, dan jenis layanan latar depan perangkat terhubung, lalu izin notifikasi karena layanan latar depan harus menampilkan notifikasi persisten.

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
  • Kemudian, Anda menjalankan layanan sticky untuk menjaga proses aplikasi tetap aktif.

    class BleForegroundService : Service() {
       override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
          …
          return START_STICKY
       }
    }
  • Cara ini memang berhasil, tetapi menghabiskan baterai dan memori karena layanan berjalan terus-menerus, bahkan saat perangkat tidak berada di dekatnya.

  • Itulah sebabnya kami membuat Pengelola Perangkat Pendamping, atau disingkat CDM.

  • Pertama, sistem dapat mengaktifkan aplikasi Anda berdasarkan kehadiran perangkat, dan selama perangkat tetap berada dalam jangkauan, sistem akan terus menjalankan proses aplikasi Anda.

  • Tidak memerlukan layanan latar depan.

  • Kedua, CDM mendukung profil perangkat.

  • Dengan profil perangkat, pengguna memberikan semua izin yang diperlukan aplikasi Anda dengan sekali ketuk, bukan serangkaian dialog izin.

  • Hal ini sangat meningkatkan pengalaman pengguna dan rasio konversi.

  • Profil smartwatch telah tersedia sejak Android 12, kacamata sejak Android 14.

  • Di Android 17, kami telah menambahkan dua profil baru khusus untuk perangkat medis dan pelacak kebugaran.

  • Saat ini, ada juga beberapa profil dengan hak istimewa yang hanya ditujukan untuk aplikasi sistem.

  • Jika kami mendengar kebutuhan yang lebih luas dari ekosistem, kami dapat mempertimbangkan untuk membukanya bagi lebih banyak developer.

Implementasi menggunakan Pengelola Perangkat Pendamping

  • Menggunakan CDM sangat mudah.

  • Mari kita gunakan perangkat medis sebagai contoh.

  • Pertama, deklarasikan izin yang diperlukan: satu untuk perangkat medis, satu untuk dijalankan di latar belakang, dan satu untuk mengamati kehadiran perangkat.

    <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
    <uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
    <uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
  • Satu hal yang perlu diperhatikan, tidak seperti izin yang baru saja kita lihat dengan penerapan layanan latar depan, semua izin yang tercantum di sini adalah izin normal, yang berarti izin tersebut akan diberikan saat penginstalan, tanpa dialog perintah.

  • Satu-satunya hal yang harus disetujui pengguna adalah pengaitan.

  • Mari kita lihat cara membuat pengaitan tersebut.

  • Di sini, kita membuat permintaan pengaitan dengan filter perangkat sehingga hanya perangkat yang tepat yang muncul.

    val paringRequest = AssociationRequest.Builder()
       .addDeviceFilter(deviceFilter)
       .setSingleDevice(true)
       .setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
       .build()
    
    companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
       object : CompanionDeviceManager.Callback() {
           override fun onAssociationPending(intentSender: IntentSender) {
               intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
           }
    
           override fun onAssociationCreated(associationInfo: AssociationInfo) { … }
    
           override fun onFailure(error: CharSequence?) { … }
       }
    )
  • setSingleDevice ke true karena kita hanya menginginkan satu kecocokan, dan menetapkan profil ke medical.

  • Kemudian, panggil associate.

  • CDM menangani pemindaian.

  • Di onAssociationPending, kita akan mendapatkan IntentSender.

  • Luncurkan, sistem akan menampilkan dialog pengaitan.

  • Dengan profil medis, satu ketukan di sini tidak hanya menyetujui pengaitan itu sendiri, tetapi juga memberikan semua izin yang diperlukan profil, bahkan mengabaikan mode Jangan Ganggu, yang sangat penting untuk pemberitahuan penting.

  • Setelah pengguna mengetuk Izinkan, kita akan mendapatkan onAssociationCreated dengan AssociationInfo, yang menyertakan ID pengaitan.

  • Kemudian, kita dapat mengamati kehadiran perangkat dengan memanggil startObservingDevicePresence menggunakan ID pengaitan tersebut.

  • Anda juga perlu mengimplementasikan layanan yang memperluas CompanionDeviceService.

    class BleCompanionDeviceService : CompanionDeviceService() {
    
       override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
           when (event.event) {
               DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
               DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
           }
       }
    
       private fun onDeviceAppeared(associationId: Int) { … }
    
       private fun onDeviceDisappeared(associationId: Int) { … }
    }
  • Saat perangkat berada dalam jangkauan, sistem akan mengikat ke layanan Anda meskipun aplikasi tidak berjalan.

  • Sistem akan memanggil onDevicePresenceEvent dengan EVENT_BLE_APPEARED.

  • Kemudian, Anda dapat menghubungkan dan menyinkronkan.

  • Saat perangkat keluar, Anda akan mendapatkan EVENT_BLE_DISAPPEARED.

  • Kemudian, Anda dapat melakukan pembersihan.

  • Tidak ada layanan yang selalu aktif dan tidak ada notifikasi hanya untuk tetap aktif.

  • Sekarang, kita harus mengakui bahwa CDM memiliki beberapa batasan yang harus diingat oleh developer.

  • Pertama, versi OS.

  • Sebagian besar fitur CDM hadir di Android 12 dan 13.

  • Namun, beberapa peningkatan keren hadir di Android 16 dan profil baru di Android 17.

  • Jadi, periksa versi OS saat runtime dan pertahankan penggantian untuk versi yang lebih lama.

  • Meskipun demikian, SDK Target meningkat setiap tahun dan SDK minimum cenderung mengikuti.

  • Untuk mengatasi tekanan memori yang dihadapi aplikasi saat ini dan yang akan dihadapi, sebaiknya aplikasi segera bermigrasi dari layanan latar depan ke CDM.

  • Jika Anda memiliki kasus penggunaan yang saat ini tidak dapat didukung oleh CDM, beri tahu kami.

  • Kedua, saat ini CDM mendukung pemindaian latar belakang, tetapi tidak mendukung pemberitahuan latar belakang.

  • Kami jarang mendengar kebutuhan akan hal ini.

  • Namun, jika aplikasi Anda memerlukan ponsel untuk bertindak sebagai periferal dan terus memberitahukan di latar belakang, kami ingin mempelajari lebih lanjut hal ini.

  • Ketiga, CDM menggunakan mode pemindaian daya rendah.

  • Hal ini mengorbankan sedikit responsivitas real-time demi menghemat baterai dan memori.

  • Jadi, jangan berharap perangkat akan langsung aktif.

  • Terakhir, tidak ada pengintipan payload.

  • Anda tidak dapat mendaftar untuk karakteristik atau data iklan tertentu.

  • Namun, setelah perangkat berada dalam jangkauan, aplikasi Anda akan diaktifkan.

  • Jadi, proxy dapat terhubung dan memeriksa payload sesuai kebutuhan.

  • Demikian penjelasan tentang aplikasi pendamping dan CDM.

  • Saya akan menyerahkan penjelasan tentang aplikasi VoIP kepada Nataraj.

Tantangan terkait panggilan VoIP lintas perangkat

  • CompanionDeviceManager adalah alat yang tepat jika aplikasi Anda memiliki periferal khusus dan terus berkomunikasi melalui periferal tersebut.

  • Halo semuanya.

  • Saya Nataraj K R.

  • Sekarang, saya akan membahas skenario lintas perangkat berikutnya, yaitu panggilan real-time.

  • Saat ini, cara orang menangani panggilan berubah.

  • Lebih dari 40% panggilan dilakukan melalui jaringan VoIP.

  • Dan Android memainkan peran utama dalam hal itu.

  • Bahkan, 71% panggilan tersebut dilakukan di perangkat Android, yang berarti hampir setiap panggilan.

  • Bukan hanya panggilan telepon.

  • Ekosistem perangkat yang dimiliki orang juga berkembang pesat.

  • Ada lebih dari 250 juta mobil yang menjalankan Android Auto di jalan, dan kami juga mengirimkan lebih dari satu miliar perangkat Bluetooth kepada pengguna.

  • Earbud, smartwatch Wear OS, Android-- mobil dengan Android Auto, speaker Bluetooth adalah semua perangkat yang dimiliki pengguna di sekitar ponsel, dan mereka ingin panggilan mereka mengalir di semua perangkat ini dengan lancar.

  • Misalnya, pengguna akan menerima panggilan, mereka akan melihat sekilas jam tangan mereka untuk mengetahui informasi penelepon.

  • Dia akan menjawab panggilan di smartwatch-nya.

  • Mereka akan membisukan atau membunyikan audio seperlunya, dan mereka akan memasang earbud, lalu melanjutkan panggilan.

  • Jika ingin keluar, mereka akan masuk ke panggilan-- mereka akan masuk ke mobil, dan mereka akan mengharapkan panggilan mereka beralih dengan lancar ke kabin mobil.

  • Jadi, hal ini telah menjadi rutinitas normal bagi pengguna, dan ini bukan pengalaman premium.

  • Bagi pengguna, ini adalah persyaratan dasar, dan developer Android harus memberikan pengalaman yang lancar tersebut di aplikasi VoIP kepada pengguna.

  • Namun, jika Anda mencoba membangun semuanya sendiri dari awal, Anda akan menghadapi tiga masalah besar.

  • Pertama, fragmentasi dengan soket Bluetooth.

  • Karena sistem tidak mengetahui bahwa panggilan Anda menangani panggilan, Anda akan membuat soket Bluetooth kustom dan sesi media kustom sehingga panggilan Anda dapat diproyeksikan ke smartwatch atau Android Auto.

  • Masalah kedua adalah fokus audio.

  • Karena Anda harus menangani AudioManager API dan Bluetooth API level rendah, kebocoran audio terjadi, dan ini bukan prioritas sistem, bukan?

  • Aplikasi Anda melakukan panggilan VoIP, sehingga setiap kali ada panggilan operator masuk, panggilan tersebut akan mengganggu, dan modem akan mengambil alih audio, sehingga aplikasi Anda tidak memiliki audio.

  • Yang terburuk, meskipun panggilan seluler berakhir, fokus audio tidak akan dikembalikan ke aplikasi Anda.

  • Masalah ketiga adalah sinkronisasi.

  • Pengguna akan mengetuk bisukan di smartwatch, tetapi UI ponsel akan tetap menampilkan panggilan sebagai tidak dibisukan.

  • Hal ini menimbulkan kebingungan yang besar.

  • Pengguna akan memutuskan panggilan dari kolom kemudi mobil, tetapi ponsel akan tetap menampilkan notifikasi panggilan yang sedang berlangsung.

  • Hal ini sangat menjengkelkan bagi pengguna, bukan, saat hal itu terjadi.

Memperkenalkan Jetpack Telecom

  • Jadi, untuk mengatasi semua masalah ini, kami telah membuat Jetpack Telecom.

  • Jadi, Anda mendaftarkan panggilan sekali dengan Jetpack Telecom menggunakan CallsManager, dan Jetpack Telecom bertindak sebagai koordinator panggilan sistem pusat.

  • API ini bertanggung jawab untuk memproyeksikan panggilan Anda ke smartwatch dan Android Auto serta platform jarak jauh lainnya yang dimiliki pengguna.

  • Framework ini juga menangani fokus audio.

  • Dan yang terpenting, semua ini berfungsi dengan lancar, bahkan di Android 8.

  • Memproyeksikan panggilan ke layar smartwatch atau mobil hanyalah sebagian dari prosesnya, karena pengguna tentu ingin mengontrol status panggilan dari perangkat ini.

  • Mereka ingin membisukan panggilan dari smartwatch atau membunyikan audio sesuai kebutuhan.

  • Dia ingin menutup panggilan dari kolom kemudi mobil atau dengan mengetuk dua kali earbud-nya.

  • Jadi, Jetpack Telecom memproses peristiwa hardware ini dan menyajikannya sebagai callback di satu tempat, yaitu CallControlScope.

  • Anda hanya perlu memproses callback ini, menangani mesin panggilan, dan memperbarui status panggilan.

  • Dan Jetpack Telecom bertanggung jawab untuk menyinkronkan status panggilan ini antar-perangkat.

  • Jadi, di balik layar, library ini memberikan manfaat dalam dua kategori.

  • Pertama, tentu saja, hal ini menyelesaikan semua masalah yang telah kita bahas.

  • Jadi, alih-alih Anda menangani API AudioManager tingkat rendah, library memberikan endpoint panggilan deklaratif, mengelola fokus audio, dan menyinkronkan antarperangkat.

  • Protokol ini bertanggung jawab untuk mengalihkan panggilan antar-perangkat.

  • Fitur ini juga akan menangani setiap panggilan seluler yang masuk.

  • Namun, manfaat lain yang disertakan dengan library ini adalah karena library ini dibuat di atas Kotlin, setiap kali Anda menambahkan panggilan dengan Jetpack Telecom, cakupan coroutine Kotlin akan terbuka.

  • Jadi, hal ini memanfaatkan coroutine Kotlin, dan coroutine Kotlin tersebut tetap aktif tepat hingga durasi panggilan.

  • Jadi, tugas apa pun yang Anda jalankan sehubungan dengan panggilan akan otomatis dihapus segera setelah panggilan terputus.

  • Jadi, Anda tidak akan memiliki tugas yang tidak diinginkan, dan siklus proses panggilan juga ditangani oleh library.

  • Sekarang, Anda mungkin bertanya-tanya apakah library yang luar biasa ini bagus dan Anda ingin mengimplementasikannya, bukan?

  • Dan prosesnya sangat mudah.

  • Langkah 1, Anda harus mendeklarasikan dependensi.

  • Setelah itu, deklarasikan izin yang diperlukan, yaitu MANAGE_OWN_CALLS, lalu buat instance objek CallsManager.

    <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
  • Setelah membuat instance objek CallsManager, daftarkan aplikasi Anda dengan kemampuan yang ingin Anda sediakan dengan aplikasi, seperti panggilan video atau streaming panggilan.

    // Initialize CallsManager & register supported capabilities once
    val callsManager = CallsManager(context)
    
    callsManager.registerAppWithTelecom(
        capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
                       CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
    )
  • Setelah itu, langkah nomor 2.

  • Setelah mendaftarkan aplikasi ke Jetpack Telecom, sekarang saatnya menangani panggilan masuk dan panggilan keluar.

  • Untuk itu, Anda perlu membuat objek CallAttributesCompat, yang menyimpan metadata panggilan, seperti displayName penelepon atau penerima panggilan, alamat, yang merupakan endpoint penelepon, arah, yang menentukan apakah panggilan tersebut adalah panggilan masuk atau panggilan keluar sehingga Jetpack Telecom dapat menampilkan UI masing-masing ke platform jarak jauh ini, lalu, callType, apakah itu panggilan audio atau panggilan video sehingga Anda akan mendapatkan resource yang diperlukan.

    val attributes = CallAttributesCompat(
        displayName = "Kukk Nat",
        address = Uri.parse("tel:+16505550199"),
        direction = CallAttributesCompat.DIRECTION_INCOMING,
        callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
    )
    
    callsManager.addCall(
        attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
    ) {
        // Coroutine CallControlScope active for the duration of the call
    }
  • Setelah objek metadata siap, tambahkan objek tersebut menggunakan metode callsManager.addCall.

  • Tindakan ini akan membuka cakupan coroutine kontrol panggilan.

  • Jadi, setelah Anda selesai menambahkan panggilan, sekarang, langkah 3.

  • Langkah 3 adalah memproses tindakan yang akan dilakukan pengguna dari platform jarak jauh tersebut.

  • Jadi, karena Anda memiliki CallControlScope, Anda hanya perlu mengumpulkan flow Kotlin.

    callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
        // 1. React to hardware mute toggles from Watch, Car, or Headset
        launch {
            isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
        }
    
        // 2. Observe available endpoints & request declarative switches
        launch {
            currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
        }
        requestEndpointChange(preferredBluetoothEndpoint)
    }
  • Anda mengumpulkan isMuted untuk bereaksi setiap kali pengguna membisukan panggilan dari platform jarak jauh tersebut, dan Anda dapat memperbarui status panggilan sesuai dengan tindakan tersebut.

  • Kumpulkan currentCallEndpoint untuk mengetahui endpoint tempat panggilan saat ini terjadi sehingga Anda dapat mengupdate UI yang sesuai.

  • Anda dapat menampilkan perangkat tertentu tersebut di UI ponsel Anda.

  • Dan setiap kali pengguna ingin beralih dari satu perangkat ke perangkat lain, cukup panggil metode requestEndpointChange dengan endpoint pilihan pengguna.

  • Semudah itu.

  • Dengan tiga langkah ini, aplikasi Anda siap digunakan dan telah mengintegrasikan Jetpack Telecom.

  • Tapi bukan itu saja.

  • Dengan Jetpack Telecom 1.1.0, kami menghadirkan lebih banyak fitur seperti histori panggilan terpadu, yang berarti semua panggilan VoIP Anda kini akan muncul secara native di telepon sistem.

  • Jadi, keuntungannya adalah pengguna Anda akan dapat memulai panggilan balik sekali ketuk langsung dari telepon sistem ke aplikasi Anda.

  • Jadi, Anda tidak perlu membuka dan menelusuri aplikasi tertentu di antara semua aplikasi.

  • Mereka dapat langsung melakukan panggilan balik dari dialer sistem yang biasa mereka gunakan.

  • Namun, kami juga menyediakan kontrol terperinci.

  • Jika Anda tidak ingin panggilan tertentu dicatat ke dalam sistem, Anda hanya perlu menetapkan flag isLogExcluded sebagai benar di dalam objek CallAttributesCompat.

  • Objek metadata yang saya bicarakan sebelumnya, Anda cukup menjadikannya benar dan panggilan Anda tidak akan dicatat oleh sistem dan tidak akan muncul di dialer sistem.

  • Fitur keren kedua yang akan hadir di versi 1.1.0 adalah network slicing 5G.

  • Jadi, di jaringan operator yang didukung, jaringan akan memberi Anda slice jaringan premium, yang berarti untuk kasus penggunaan tertentu, operator akan memberi Anda slice jaringan yang memiliki latensi rendah dan tanpa gangguan lain, sehingga Anda akan mendapatkan kualitas dan pengalaman yang lebih baik.

  • Jadi, di jaringan operator yang didukung, Anda akan mendapatkan fitur ini secara langsung, sehingga tidak diperlukan upaya ekstra dari pihak Anda, bahkan satu baris kode pun.

  • Setelah mengintegrasikan library, panggilan Anda akan memanfaatkan slice jaringan tersebut dan Anda akan mendapatkan latensi serta performa yang lebih baik.

  • Namun, jika karena alasan tertentu Anda tidak menginginkan fitur ini, Anda juga dapat memilih untuk tidak menggunakannya menggunakan flag CAPABILITY_OPT_OUT_OF_PREMIUM_NETWORK.

  • Jetpack Telecom telah diimplementasikan oleh aplikasi komunikasi global teratas seperti Google Meet, WhatsApp, KakaoTalk, dan Zoho Arattai.

  • Jadi, sekarang terserah Anda, Jadi, sekarang terserah Anda untuk mengintegrasikan library ini di aplikasi Anda dan memberikan pengalaman yang lebih baik dan lancar bagi pengguna.

  • Setelah membahas panggilan real-time, saya ingin menyerahkan mikrofon kepada rekan saya yang luar biasa, Yacine, untuk membahas fitur tempel untuk berbagi.

  • Terima kasih.

Tantangan berbagi peer-to-peer

  • Baiklah, saya tahu Anda agak lelah, jadi jangan khawatir, ini adalah bagian terakhir.

  • Jadi, saya akan membahas berbagi file peer-to-peer, tetapi kasus penggunaan lain juga dapat kita lakukan dengan berbagi peer-to-peer.

  • Yang kami lihat di seluruh ekosistem seluler adalah ada lebih dari 14 miliar foto dan video yang dibagikan di media sosial dan aplikasi pesan setiap harinya, jadi jumlahnya sangat besar.

  • Dan semua file tersebut sering kali dibagikan melalui cloud, jadi Anda mengambil foto, menguploadnya melalui layanan favorit Anda, lalu orang tersebut harus mendownloadnya dengan cara yang sama melalui sisi lain.

  • Hal yang sama juga terjadi saat Anda mencoba mengundang seseorang atau teman ke jaringan sosial untuk mengundang seseorang berkolaborasi dalam playlist atau dokumen. Anda biasanya harus mengetik nama pengguna atau email mereka, yang memerlukan waktu cukup lama di keyboard.

  • Anda mungkin membuat kesalahan dan itu sebenarnya bukan pengalaman yang menyenangkan, terutama saat Anda berdua benar-benar duduk bersebelahan, jadi seperti, oh, saya harus mengirim melalui cloud, saya harus menunggu.

  • Pokoknya tidak bagus.

  • Saat ini, kita semua memiliki ponsel, perangkat, tablet, dan perangkat foldable yang canggih, dan kita dapat mengambil foto yang luar biasa dengan perangkat tersebut.

  • Namun, saat Anda membagikannya melalui beberapa media sosial atau beberapa aplikasi pesan, video tersebut akan dikompresi karena masalah performa dan penyimpanan. Akibatnya, video tersebut akan terlihat pecah-pecah atau kualitasnya tidak optimal di layar Anda yang luar biasa.

  • Hal ini bukanlah pengalaman terbaik yang ingin Anda dapatkan di perangkat premium Anda.

  • Hal kedua, ukuran file sekarang sebenarnya cukup besar.

  • Satu gambar bisa berukuran 10 MB, video berdurasi 5 menit bisa berukuran 500 MB, jadi semua itu memerlukan waktu yang cukup lama untuk diupload dan didownload.

  • Terakhir, di sisi lain, Anda harus menunggu latensi tersebut.

  • Jadi, terkadang Anda mungkin naik bus, busnya penuh sesak dan saat bus bergerak, Anda tidak memiliki latensi terbaik, cakupan jaringan terbaik, dan terkadang transfer file terhenti, terkadang karena latensi yang sangat lama, Anda mungkin mengalami waktu tunggu habis dan transfer file dibatalkan, yang sangat, sangat menjengkelkan bagi pengguna.

  • Jadi, daripada mengandalkan cloud untuk dapat membagikan semua file tersebut dan harus menunggu semua itu, mengapa tidak menggunakan jaringan lokal, seperti Bluetooth atau Wi-Fi?

  • Namun, jika Anda mencoba melakukannya sendiri, tentu saja, Anda harus berurusan dengan pengelola Bluetooth, pengelola Wi-Fi, harus menulis protokol Anda sendiri, maksud saya, tidak semua orang ingin meluangkan waktu untuk melakukannya.

  • Namun sebenarnya, sudah ada fitur yang tersedia di Android.

  • Fitur ini sudah tersedia dan Anda mungkin pernah mendengarnya, Quick Share.

Ringkasan Quick Share

  • Quick Share di Android memungkinkan Anda memiliki abstraksi ini di sistem dan Anda dapat berbagi file dengan perangkat lain tanpa harus mengelola semua itu.

  • Fitur ini sudah tersedia di sheet berbagi dan beralih di antara protokol yang terbaik untuk perangkat Anda di antara kedua perangkat, dan tersedia di Marshmallow dan yang lebih tinggi, yang saat ini merupakan audiens yang cukup besar, bukan?

  • Terakhir, UI dan UX yang sudah dikenal yang Anda lihat di samping, sangat membantu pengguna Anda sendiri.

  • Jadi, mereka tahu apa itu UI, mereka tidak perlu mempelajari cara menggunakannya, mereka sudah pernah melihatnya sebelumnya.

  • Namun, kami tahu bahwa developer juga ingin memiliki pengalaman tersebut.

  • Anda tahu aplikasi Anda, Anda mungkin tahu pengguna Anda lebih baik daripada kami.

  • Jadi, mengapa tidak menyediakan Quick Share langsung di aplikasi Anda?

  • Jadi, kami mulai berbicara dengan developer dan kami melihat bahwa Quick Share sudah cukup tersebar luas.

  • Google Play Game tersedia di Android, Chromebook, Google Buku, dan juga di Windows, yang berarti lebih dari 3 miliar perangkat, sangat besar.

  • Kami juga menghadirkan kemampuan tempel untuk berbagi di Pixel 11.

  • Jadi, daripada harus memilih perangkat yang ingin Anda ajak berbagi, Anda cukup mengetuk dan dengan NFC, kami akan langsung melakukan penemuan tersebut untuk Anda.

  • Jadi, Anda dapat memilih foto, tetapi Anda juga dapat memilih file, Anda cukup mengetuk dua perangkat dan file tersebut akan langsung dibagikan dengan sentuhan.

  • Sekali lagi, kami tahu developer yang ingin memiliki pengalaman tersebut.

  • Kami tahu bahwa ini adalah cara terbaik bagi pengguna Anda untuk dapat menggunakan fitur tertentu, dalam hal ini, berbagi file.

  • Jadi, mengapa tidak menyematkan Quick Share di aplikasi Anda?

  • Jadi, itulah alasan tahun depan, kami akan menghadirkan Quick Share SDK langsung untuk Anda.

  • Anda akan dapat menggunakannya langsung di aplikasi Anda dan fitur ini dilengkapi dengan keamanan yang sudah terintegrasi, sebagai enkripsi end-to-end antara kedua perangkat.

  • Karena transfer terjadi di antara jaringan lokal tersebut, Anda akan mendapatkan kecepatan penuh, tentu saja di Wi-Fi rumah Anda, tetapi juga di antara Anda berdua, hotspot dapat dibuat secara otomatis, Anda tidak perlu repot-repot melakukannya.

  • Dan untuk perangkat yang mendukung Wi-Fi Langsung, fitur ini sudah disertakan.

  • Dan file yang Anda ambil dengan kamera luar biasa, akan mempertahankan resolusi dan detail terbaiknya, sehingga Anda dapat melihatnya dengan baik di layar besar.

  • Dan karena mengandalkan jaringan lokal, Anda dapat menggunakannya di kereta bawah tanah, bahkan di bagian terdalamnya, Anda akan tetap memiliki jaringan untuk dapat berbagi dengan teman Anda.

  • Di pesawat juga, Anda akan berada, entah berapa ribu kaki di atas, di langit, dan Anda masih dapat berbagi file tersebut.

  • Terakhir, bagi Anda sebagai developer, ini adalah penghematan biaya yang besar dalam hal data, karena pertama, pengguna Anda tidak perlu menggunakan paket data tersebut dan ini adalah hal yang penting saat mereka bepergian sebagai turis.

  • Namun, Anda juga tidak perlu mengelola server Anda sendiri.

  • Tahun lalu, kami mengumumkan kepada developer dan pengguna bahwa dengan Quick Share, mereka akan dapat berbagi file ke perangkat iPhone melalui AirDrop.

  • Dengan Quick Share, kami menghadirkan hal yang sama untuk developer.

  • Kami akan menyediakan Quick Share iOS SDK bagi developer yang memiliki aplikasi iOS agar dapat berbagi file antar-kedua platform, apa pun perangkatnya.

  • Jadi, semua itu adalah presentasi yang menarik, sekarang, mari kita lihat kodenya sekilas.

  • Kami mencoba membuatnya sesederhana mungkin.

  • Anda memulai QuickShareClient, melampirkan file yang ingin dibagikan, dan setelah memulai sesi, Anda akan melihat jendela modal yang menarik di samping, panel bawah tempat pengguna dapat melihat file yang dikirim sebagai pratinjau, dan jika kontennya sensitif, Anda juga dapat mengaktifkannya dengan opsi yang terlihat di layar.

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val attachment = FileAttachment(
      fileName = "report.pdf",
      size = 1_048_576L,
      uri = fileUri,
      mimeType = "application/pdf",
      // Sensitive content will be masked in preview
      isSensitiveContent = false,
    )
    
    val content = ShareableContent.withFiles(listOf(attachment))
    val request = SharingRequest.withContent(content)
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
  • Saat Anda ingin menerima file, sekali lagi, dalam aplikasi Anda, hal yang sama, tentu saja, dalam hal ini, Anda tidak menambahkan lampiran, dan kemudian segera setelah sesi dimulai, Anda tidak perlu berurusan dengan hal itu.

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val request = SharingRequest.withoutContent()
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
    
    // Open the Quick Share overlay in receive mode
    session.launchWindow(activity, contentSelectionIntent = null)
  • Sejauh ini, Anda telah melihat bahwa kodenya benar-benar hanya 20 baris di kedua sisi.

  • Kami tahu, dengan Quick Share dan tempel untuk berbagi, kemampuan untuk berbagi file hanya dengan menyentuhkan perangkat juga memungkinkan kasus penggunaan baru.

  • Aplikasi Anda dapat ditutup di perangkat lain, dan dengan mengetuk, segera setelah file ditransfer, aplikasi Anda akan otomatis dibuka dan Anda akan menerima URI untuk dapat melakukan beberapa pemrosesan di perangkat, misalnya, atau menampilkan sesuatu kepada pengguna langsung dalam aplikasi Anda.

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val urlAttachment = TextAttachment(
      text = groupAddUrl,
      type = TextAttachment.Type.URL,
    )
    
    val content = ShareableContent.withText(urlAttachment)
    val appLink = AppLink("https://myapp.com/group/invite")
    val request = SharingRequest.withContent(content, appLink)
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
  • Jadi, sekali lagi, Anda tidak perlu membuka aplikasi di perangkat penerima.

  • Dengan fitur tempel untuk berbagi, aplikasi tersebut akan otomatis terbuka.

  • Dan tentu saja, jika Anda ingin UI bereaksi terhadap transfer file tersebut, Anda hanya perlu menggunakan Kotlin Flow, dan Anda akan memiliki semua peristiwa untuk dapat memprosesnya.

    // Final API may undergo further updates
    scope.launch {
      for (event in session.sharingEvents) {
        when (event) {
          is SharingEvent.SendComplete ->
            println("Send finished")
          is SharingEvent.ReceiveComplete ->
            println("Received, files=${event.content?.files?.size}")
          else -> println("other event")
        }
      }
    }

Ringkasan dan kesimpulan

  • Jadi, kita telah melihat banyak hal hari ini, jadi saya akan menyimpulkannya.

  • Jangan khawatir, Anda akan memiliki waktu beberapa menit untuk beristirahat.

  • CompanionDeviceManager adalah API terbaik bagi Anda untuk menangani interaksi Bluetooth apa pun, interaksi Bluetooth berkelanjutan, seperti yang telah Hanrui sampaikan sebelumnya.

  • Jika aplikasi Anda memiliki panggilan voice over IP, panggilan tersebut tidak harus menjadi kasus penggunaan utamanya, misalnya, Anda memiliki bagian klien dukungan di aplikasi tempat pengguna dapat menghubungi dukungan.

  • Dalam hal ini, sekali lagi, cara terbaik untuk menangani panggilan voice over IP di Android, Jetpack Com-- Jetpack Telecom adalah solusinya.

  • Terakhir, untuk aplikasi berbagi atau pembuka file peer-to-peer, seperti yang saya sebutkan, dengan tempel untuk berbagi, Quick Share adalah solusinya.

  • Jadi, terima kasih semuanya, dan sebelum Anda pergi, kami akan berada di luar setelah ini untuk menjawab pertanyaan Anda.

  • Kami memiliki waktu konsultasi jika Anda memiliki pertanyaan, Anda tahu, di semua kasus penggunaan yang telah kami sajikan.

  • Dan jangan lupa untuk membagikan pembelajaran apa pun dari presentasi Anda atau sesi lainnya, tentu saja, di media sosial.

  • Kami memiliki #AndroidDevSummit.

  • Sekali lagi, sangat penting bagi kami untuk mengetahui bahwa kami memiliki interaksi, kami memiliki orang-orang yang benar-benar menikmati acara ini.

  • Hal ini membantu kami mengetahui bahwa kami memiliki komunitas yang ingin kami temui lagi.

  • Dan kumpulkan gantungan kunci sosial yang dapat Anda tambahkan ke gantungan kunci bot Android dari meja informasi.

  • Apakah saya melakukannya dengan benar?

  • Terima kasih.

Kode

Cuplikan kode

Cuplikan XML pada 06.17 di "Ringkasan aplikasi pendamping"
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                 android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Cuplikan Kotlin pada 06:34 di "Ringkasan aplikasi pendamping"
class BleForegroundService : Service() {
   override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
      …
      return START_STICKY
   }
}
Cuplikan XML pada 08:03 di "Implementasi menggunakan Pengelola Perangkat Pendamping"
<uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
Cuplikan Kotlin pada 08:38 di "Implementasi menggunakan Pengelola Perangkat Pendamping"
val paringRequest = AssociationRequest.Builder()
   .addDeviceFilter(deviceFilter)
   .setSingleDevice(true)
   .setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
   .build()

companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
   object : CompanionDeviceManager.Callback() {
       override fun onAssociationPending(intentSender: IntentSender) {
           intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
       }

       override fun onAssociationCreated(associationInfo: AssociationInfo) { … }

       override fun onFailure(error: CharSequence?) { … }
   }
)
Cuplikan Kotlin pada 09:47 di "Implementasi menggunakan Pengelola Perangkat Pendamping"
class BleCompanionDeviceService : CompanionDeviceService() {

   override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
       when (event.event) {
           DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
           DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
       }
   }

   private fun onDeviceAppeared(associationId: Int) { … }

   private fun onDeviceDisappeared(associationId: Int) { … }
}
Cuplikan XML pada menit 18:29 di "Memperkenalkan Jetpack Telecom"
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
Cuplikan Kotlin pada menit 18:36 di "Memperkenalkan Jetpack Telecom"
// Initialize CallsManager & register supported capabilities once
val callsManager = CallsManager(context)

callsManager.registerAppWithTelecom(
    capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
                   CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
)
Cuplikan Kotlin pada menit 18:55 di "Memperkenalkan Jetpack Telecom"
val attributes = CallAttributesCompat(
    displayName = "Kukk Nat",
    address = Uri.parse("tel:+16505550199"),
    direction = CallAttributesCompat.DIRECTION_INCOMING,
    callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
)

callsManager.addCall(
    attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
) {
    // Coroutine CallControlScope active for the duration of the call
}
Cuplikan Kotlin pada menit 19:49 di "Memperkenalkan Jetpack Telecom"
callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
    // 1. React to hardware mute toggles from Watch, Car, or Headset
    launch {
        isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
    }

    // 2. Observe available endpoints & request declarative switches
    launch {
        currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
    }
    requestEndpointChange(preferredBluetoothEndpoint)
}
Cuplikan Kotlin pada 29:31 di "Ringkasan Quick Share"
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val attachment = FileAttachment(
  fileName = "report.pdf",
  size = 1_048_576L,
  uri = fileUri,
  mimeType = "application/pdf",
  // Sensitive content will be masked in preview
  isSensitiveContent = false,
)

val content = ShareableContent.withFiles(listOf(attachment))
val request = SharingRequest.withContent(content)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
Cuplikan Kotlin pada 29:57 di "Ringkasan Quick Share"
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val request = SharingRequest.withoutContent()
val session = quickShareClient.startSharingSession(request, lifecycleOwner)

// Open the Quick Share overlay in receive mode
session.launchWindow(activity, contentSelectionIntent = null)
Cuplikan Kotlin pada 30:23 di "Ringkasan Quick Share"
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val urlAttachment = TextAttachment(
  text = groupAddUrl,
  type = TextAttachment.Type.URL,
)

val content = ShareableContent.withText(urlAttachment)
val appLink = AppLink("https://myapp.com/group/invite")
val request = SharingRequest.withContent(content, appLink)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
Cuplikan Kotlin pada menit 30:49 di "Ringkasan Quick Share"
// Final API may undergo further updates
scope.launch {
  for (event in session.sharingEvents) {
    when (event) {
      is SharingEvent.SendComplete ->
        println("Send finished")
      is SharingEvent.ReceiveComplete ->
        println("Received, files=${event.content?.files?.size}")
      else -> println("other event")
    }
  }
}