CINXE.COM

Thread Network SDK for Android  |  Google Home Developers

<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Google Home Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#00639b"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/home/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/favicon.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/touchicon-180.png"><link rel="canonical" href="https://developers.home.google.com/thread"><link rel="search" type="application/opensearchdescription+xml" title="Google Home Developers" href="https://developers.home.google.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developers.home.google.com/thread" /><link rel="alternate" hreflang="x-default" href="https://developers.home.google.com/thread" /><link rel="alternate" hreflang="ar" href="https://developers.home.google.com/thread?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developers.home.google.com/thread?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developers.home.google.com/thread?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developers.home.google.com/thread?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developers.home.google.com/thread?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developers.home.google.com/thread?hl=fr" /><link rel="alternate" hreflang="de" href="https://developers.home.google.com/thread?hl=de" /><link rel="alternate" hreflang="he" href="https://developers.home.google.com/thread?hl=he" /><link rel="alternate" hreflang="hi" href="https://developers.home.google.com/thread?hl=hi" /><link rel="alternate" hreflang="id" href="https://developers.home.google.com/thread?hl=id" /><link rel="alternate" hreflang="it" href="https://developers.home.google.com/thread?hl=it" /><link rel="alternate" hreflang="ja" href="https://developers.home.google.com/thread?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developers.home.google.com/thread?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developers.home.google.com/thread?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developers.home.google.com/thread?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developers.home.google.com/thread?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developers.home.google.com/thread?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developers.home.google.com/thread?hl=th" /><link rel="alternate" hreflang="tr" href="https://developers.home.google.com/thread?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developers.home.google.com/thread?hl=vi" /><title>Thread Network SDK for Android &nbsp;|&nbsp; Google Home Developers</title> <meta property="og:title" content="Thread Network SDK for Android &nbsp;|&nbsp; Google Home Developers"><meta name="description" content="An IPv6-based networking protocol designed for low-power Internet of Things devices in an IEEE 802.15.4-2006 wireless mesh network. "> <meta property="og:description" content="An IPv6-based networking protocol designed for low-power Internet of Things devices in an IEEE 802.15.4-2006 wireless mesh network. "><meta property="og:url" content="https://developers.home.google.com/thread"><meta property="og:image" content="https://developers.home.google.com/static/images/home-logo-share.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "dateModified": "2022-10-13", "headline": "Thread Network SDK for Android" } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="home-theme" type="article" layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <a href="#main-content" class="skip-link button"> Skip to main content </a> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="googleHomeDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/lockup.svg" class="devsite-site-logo" alt="Google Home Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-dropdown "> <button class="devsite-tabs-content devsite-tabs-dropdown-only gc-analytics-event devsite-icon devsite-icon-arrow-drop-down" track-type="nav" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > Develop </button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Explore products &amp; devices</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/ways-to-build" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/ways-to-build" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="explore products &amp; devices" tooltip data-category="Dropdown Explore" data-label="Compare products" > <div class="devsite-nav-item-title"> Compare products </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/use-cases" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/use-cases" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="explore products &amp; devices" tooltip data-label="Supported devices" data-category="Dropdown Explore" > <div class="devsite-nav-item-title"> Supported devices </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Control devices in your app</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/apis" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/apis" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="control devices in your app" tooltip data-label="APIs" data-category="Dropdown Explore" > <div class="devsite-nav-item-title"> Home APIs </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Integrate devices with Home</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/matter" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/matter" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="integrate devices with home" tooltip data-category="Dropdown Explore" data-label="Matter" > <div class="devsite-nav-item-title"> Matter </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/cloud-to-cloud" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/cloud-to-cloud" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="integrate devices with home" tooltip data-category="Dropdown Explore" data-label="Cloud" > <div class="devsite-nav-item-title"> Cloud-to-cloud </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/thread" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/thread" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="integrate devices with home" tooltip data-category="Dropdown Explore" data-label="Thread" > <div class="devsite-nav-item-title"> Thread </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown "> <button class="devsite-tabs-content devsite-tabs-dropdown-only gc-analytics-event devsite-icon devsite-icon-arrow-drop-down" track-type="nav" track-metadata-position="nav - resources" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > Resources </button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Documentation</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/apis/get-started" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/apis/get-started" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="documentation" tooltip data-label="APIs" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Home APIs </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/matter/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/matter/docs" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="documentation" tooltip data-label="Matter" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Matter </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/thread/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/thread/docs" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="documentation" tooltip data-category="Dropdown Resources" data-label="Thread" > <div class="devsite-nav-item-title"> Thread </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/cloud-to-cloud/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/cloud-to-cloud/docs" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="documentation" tooltip data-label="Cloud-to-cloud" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Cloud-to-cloud </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/codelabs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/codelabs" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="documentation" tooltip data-category="Dropdown Resources" data-label="Codelabs" > <div class="devsite-nav-item-title"> All codelabs </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Tools, test &amp; monitor</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools/virtual-device" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools/virtual-device" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="Matter Virtual Device" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Matter Virtual Device </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools/home-playground" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools/home-playground" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="Google Home Playground" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Google Home Playground </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools/test-suite" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools/test-suite" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="Test Suite" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Test Suite </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools/android-studio" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools/android-studio" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="Android Studio Plugin" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Android Studio Plugin </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="All tools" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> All tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/tools/analytics/monitoring" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/tools/analytics/monitoring" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools, test &amp; monitor" tooltip data-label="Quality dashboards" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Quality dashboards </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Business resources</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/case-studies" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/case-studies" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="business resources" tooltip data-label="Case studies" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Case studies </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/business-resources#certification-badging-program" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/business-resources#certification-badging-program" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="business resources" tooltip data-category="Dropdown Resources" data-label="Certification &amp; badging program" > <div class="devsite-nav-item-title"> Certification & badging program </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/business-resources#marketing-resources" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/business-resources#marketing-resources" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="business resources" tooltip data-label="Marketing resources" data-category="Dropdown Resources" > <div class="devsite-nav-item-title"> Marketing resources </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown "> <button class="devsite-tabs-content devsite-tabs-dropdown-only gc-analytics-event devsite-icon devsite-icon-arrow-drop-down" track-type="nav" track-metadata-position="nav - news &amp; community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: News &amp; community" track-name="news &amp; community" > News &amp; community </button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>News</li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/whats-new" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/whats-new" track-metadata-position="nav - news &amp; community" track-metadata-module="tertiary nav" track-metadata-module_headline="news" tooltip data-label="What&#39;s new" data-category="Dropdown News" > <div class="devsite-nav-item-title"> What's new </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/newsletters" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/newsletters" track-metadata-position="nav - news &amp; community" track-metadata-module="tertiary nav" track-metadata-module_headline="news" tooltip data-category="Dropdown News" data-label="Newsletters" > <div class="devsite-nav-item-title"> Newsletters </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Community</li> <li class="devsite-nav-item"> <a href="https://www.googlenestcommunity.com/t5/Smart-Home-Developer-Forum/bd-p/Smart-Home-Developer-Forum" track-type="nav" track-metadata-eventdetail="https://www.googlenestcommunity.com/t5/Smart-Home-Developer-Forum/bd-p/Smart-Home-Developer-Forum" track-metadata-position="nav - news &amp; community" track-metadata-module="tertiary nav" track-metadata-module_headline="community" tooltip target="_blank" data-category="Dropdown News" data-label="Developer Forum" > <div class="devsite-nav-item-title"> Developer Forum </div> </a> </li> <li class="devsite-nav-item"> <a href="https://stackoverflow.com/questions/tagged/google-smart-home" track-type="nav" track-metadata-eventdetail="https://stackoverflow.com/questions/tagged/google-smart-home" track-metadata-position="nav - news &amp; community" track-metadata-module="tertiary nav" track-metadata-module_headline="community" tooltip target="_blank" data-label="Stack Overflow" data-category="Dropdown News" > <div class="devsite-nav-item-title"> Stack Overflow </div> </a> </li> <li class="devsite-nav-item"> <a href="//google.qualtrics.com/jfe/form/SV_ezBhaM4WC0T7g8d?utm_source=Website&amp;Q_Language=en&amp;utm_campaign=Q4&amp;campaignDate=October2022&amp;referral_code=UXRFvdX1122409" track-type="nav" track-metadata-eventdetail="//google.qualtrics.com/jfe/form/SV_ezBhaM4WC0T7g8d?utm_source=Website&amp;Q_Language=en&amp;utm_campaign=Q4&amp;campaignDate=October2022&amp;referral_code=UXRFvdX1122409" track-metadata-position="nav - news &amp; community" track-metadata-module="tertiary nav" track-metadata-module_headline="community" tooltip target="_blank" data-label="Research studies" data-category="Dropdown News" > <div class="devsite-nav-item-title"> Join research studies </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-active "> <a href="https://developers.home.google.com/thread" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developers.home.google.com/thread" track-type="nav" track-metadata-position="nav - docs" track-metadata-module="primary nav" aria-label="Docs, selected" data-category="Site-Wide Custom Events" data-label="Tab: Docs" track-name="docs" > Docs </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/thread" track-metadata-position="nav - docs" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Docs" track-name="docs" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/apis/get-started" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/apis/get-started" track-metadata-position="nav - docs" track-metadata-module="tertiary nav" tooltip data-category="Dropdown Docs" data-label="APIs" > <div class="devsite-nav-item-title"> Home APIs </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/matter/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/matter/docs" track-metadata-position="nav - docs" track-metadata-module="tertiary nav" tooltip data-label="Matter" data-category="Dropdown Docs" > <div class="devsite-nav-item-title"> Matter </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/thread/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/thread/docs" track-metadata-position="nav - docs" track-metadata-module="tertiary nav" tooltip data-category="Dropdown Docs" data-label="Thread" > <div class="devsite-nav-item-title"> Thread </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.home.google.com/cloud-to-cloud/docs" track-type="nav" track-metadata-eventdetail="https://developers.home.google.com/cloud-to-cloud/docs" track-metadata-position="nav - docs" track-metadata-module="tertiary nav" tooltip data-label="Cloud-to-cloud" data-category="Dropdown Docs" > <div class="devsite-nav-item-title"> Cloud-to-cloud </div> </a> </li> </ul> </div> </div> </div> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Thread" tenant-name="Google Home Developers" > <form class="devsite-search-form" action="https://developers.home.google.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt" >Português</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="//console.home.google.com" data-category="Site-Wide Custom Events" data-label="Site header link" target="_blank" > Console </a> <devsite-user enable-profiles fp-auth id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://developers.home.google.com/thread" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="" > Thread </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab class="devsite-active"> <a href="https://developers.home.google.com/thread" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developers.home.google.com/thread" track-type="nav" track-metadata-position="nav - get started" track-metadata-module="primary nav" aria-label="Get Started, selected" data-category="Site-Wide Custom Events" data-label="Tab: Get Started" track-name="get started" > Get Started </a> </tab> <tab > <a href="https://developers.home.google.com/reference/com/google/android/gms/threadnetwork/package-summary" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developers.home.google.com/reference/com/google/android/gms/threadnetwork/package-summary" track-type="nav" track-metadata-position="nav - reference" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" > Reference </a> </tab> <tab > <a href="https://developers.home.google.com/thread/support" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developers.home.google.com/thread/support" track-type="nav" track-metadata-position="nav - support" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Support" track-name="support" > Support </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="googleHomeDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/lockup.svg" class="devsite-site-logo" alt="Google Home Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip > Develop </span> </span> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip menu="Develop"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Develop"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > <span class="devsite-nav-text" tooltip > Resources </span> </span> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > <span class="devsite-nav-text" tooltip menu="Resources"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Resources"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: News &amp; community" track-name="news &amp; community" > <span class="devsite-nav-text" tooltip > News &amp; community </span> </span> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: News &amp; community" track-name="news &amp; community" > <span class="devsite-nav-text" tooltip menu="News &amp; community"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="News &amp; community"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/thread" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Docs" track-name="docs" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Docs" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Docs </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Docs" track-name="docs" > <span class="devsite-nav-text" tooltip menu="Docs"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Docs"> </span> </span> </li> </ul> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/thread" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Get Started" track-name="get started" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get Started" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Get Started </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference/com/google/android/gms/threadnetwork/package-summary" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Reference" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Reference </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/thread/support" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Support" track-name="support" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Support" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Support </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="//console.home.google.com" class="devsite-nav-title gc-analytics-event " target="_blank" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Console" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Console </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/thread" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /thread" track-type="bookNav" track-name="click" track-metadata-eventdetail="/thread" ><span class="devsite-nav-text" tooltip>Overview</span></a></li> <li class="devsite-nav-item"><a href="/thread/release-notes" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /thread/release-notes" track-type="bookNav" track-name="click" track-metadata-eventdetail="/thread/release-notes" ><span class="devsite-nav-text" tooltip>Release notes</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Learn</span> </div></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://openthread.io/guides/thread-primer" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://openthread.io/guides/thread-primer" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://openthread.io/guides/thread-primer" target="_blank"><span class="devsite-nav-text" tooltip>Thread Primer</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/thread/support" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /thread/support" track-type="bookNav" track-name="click" track-metadata-eventdetail="/thread/support" ><span class="devsite-nav-text" tooltip>Support</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Codelabs</span> </div></li> <li class="devsite-nav-item"><a href="/codelabs/thread-sharing-apis" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /codelabs/thread-sharing-apis" track-type="bookNav" track-name="click" track-metadata-eventdetail="/codelabs/thread-sharing-apis" ><span class="devsite-nav-text" tooltip>Sharing the Thread Network With Google Thread Credentials APIs</span></a></li> </ul> <ul class="devsite-nav-list" menu="Develop" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Explore products &amp; devices </span> </span> </li> <li class="devsite-nav-item"> <a href="/ways-to-build" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compare products" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compare products </span> </a> </li> <li class="devsite-nav-item"> <a href="/use-cases" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Supported devices" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Supported devices </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Control devices in your app </span> </span> </li> <li class="devsite-nav-item"> <a href="/apis" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home APIs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home APIs </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Integrate devices with Home </span> </span> </li> <li class="devsite-nav-item"> <a href="/matter" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Matter" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Matter </span> </a> </li> <li class="devsite-nav-item"> <a href="/cloud-to-cloud" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cloud-to-cloud" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cloud-to-cloud </span> </a> </li> <li class="devsite-nav-item"> <a href="/thread" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Thread" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Thread </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Resources" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Documentation </span> </span> </li> <li class="devsite-nav-item"> <a href="/apis/get-started" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home APIs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home APIs </span> </a> </li> <li class="devsite-nav-item"> <a href="/matter/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Matter" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Matter </span> </a> </li> <li class="devsite-nav-item"> <a href="/thread/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Thread" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Thread </span> </a> </li> <li class="devsite-nav-item"> <a href="/cloud-to-cloud/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cloud-to-cloud" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cloud-to-cloud </span> </a> </li> <li class="devsite-nav-item"> <a href="/codelabs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All codelabs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All codelabs </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools, test &amp; monitor </span> </span> </li> <li class="devsite-nav-item"> <a href="/tools/virtual-device" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Matter Virtual Device" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Matter Virtual Device </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools/home-playground" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Home Playground" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Home Playground </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools/test-suite" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Test Suite" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Test Suite </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools/android-studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio Plugin" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio Plugin </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools/analytics/monitoring" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Quality dashboards" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Quality dashboards </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Business resources </span> </span> </li> <li class="devsite-nav-item"> <a href="/case-studies" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Case studies" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Case studies </span> </a> </li> <li class="devsite-nav-item"> <a href="/business-resources#certification-badging-program" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Certification &amp; badging program" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Certification &amp; badging program </span> </a> </li> <li class="devsite-nav-item"> <a href="/business-resources#marketing-resources" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Marketing resources" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Marketing resources </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="News &amp; community" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > News </span> </span> </li> <li class="devsite-nav-item"> <a href="/whats-new" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: What&#39;s new" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > What&#39;s new </span> </a> </li> <li class="devsite-nav-item"> <a href="/newsletters" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Newsletters" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Newsletters </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Community </span> </span> </li> <li class="devsite-nav-item"> <a href="https://www.googlenestcommunity.com/t5/Smart-Home-Developer-Forum/bd-p/Smart-Home-Developer-Forum" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Developer Forum" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Developer Forum </span> </a> </li> <li class="devsite-nav-item"> <a href="https://stackoverflow.com/questions/tagged/google-smart-home" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Stack Overflow" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Stack Overflow </span> </a> </li> <li class="devsite-nav-item"> <a href="//google.qualtrics.com/jfe/form/SV_ezBhaM4WC0T7g8d?utm_source=Website&amp;Q_Language=en&amp;utm_campaign=Q4&amp;campaignDate=October2022&amp;referral_code=UXRFvdX1122409" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Join research studies" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Join research studies </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Docs" aria-label="Side menu" hidden> <li class="devsite-nav-item"> <a href="/apis/get-started" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home APIs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home APIs </span> </a> </li> <li class="devsite-nav-item"> <a href="/matter/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Matter" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Matter </span> </a> </li> <li class="devsite-nav-item"> <a href="/thread/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Thread" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Thread </span> </a> </li> <li class="devsite-nav-item"> <a href="/cloud-to-cloud/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cloud-to-cloud" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cloud-to-cloud </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" id="main-content" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.home.google.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Google Home Developers" > Google Home Developers </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.home.google.com/thread" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Thread" > Thread </a> </li> </ul> </div> <h1 class="devsite-page-title" tabindex="-1"> Thread Network SDK for Android </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <p>The Thread Network SDK provides functionality that&#39;s similar to a digital keychain, allowing your Android apps to share Thread network credentials with Google Play services. This allows your apps to set up any Thread device from any smart home ecosystem, without exposing credentials and user data directly.</p> <p>With just a few API calls, you can:</p> <ol> <li>Request preferred Thread network credentials from Google Play services.</li> <li>Set up new border routers and add your Thread network credentials to Google Play services.</li> <li>If you already have in-field border routers, you can check if your border routers are in the preferred network and migrate them, if necessary.</li> </ol> <p>There are several user and developer journeys to consider. We&#39;ll cover most of them in this guide, along with other key features and recommended usage.</p> <aside class="note"><strong>Note:</strong><span> Starting from version <code translate="no" dir="ltr">16.0.0</code>, the Thread Network SDK supports Android 8.0+ (API level 26+). But for Android 8.0, mobile phones won&#39;t be able to connect to Thread end devices because <a href="https://www.rfc-editor.org/rfc/rfc4191#section-2.3">Route Information Option</a> (RIO) is only supported on Android 8.1+.</span></aside> <h2 id="key_terminology_and_api_concepts" data-text="Key terminology and API concepts" tabindex="-1">Key terminology and API concepts</h2> <p>Before you get started, it&#39;s helpful to understand the following terms:</p> <ul> <li><p><strong>Thread Network Credentials:</strong> Binary blob of Thread TLVs that encodes Thread Network Name, Network Key and other properties that are required by a Thread device to join a given Thread network.</p></li> <li><p><strong>Preferred Thread Network Credentials:</strong> The auto-selected Thread network credentials that can be shared with apps of different vendors using the <code translate="no" dir="ltr">getPreferredCredentials</code> API.</p></li> <li><p><strong>Border Agent ID:</strong> A 16-byte globally unique ID for a Thread Border Router device. This ID is created and managed by border router vendors.</p></li> <li><p><strong>Thread Border Router Setup app:</strong> This is your Android app that sets up new Thread Border Router devices and adds the Thread network credentials to Google Play services. Your app is the authoritative owner of the added credentials and has access to them.</p></li> </ul> <p>Many of the Thread Network APIs return a <a href="/android/reference/com/google/android/gms/tasks/Task">Task</a> that completes asynchronously. You can use <a href="/android/reference/com/google/android/gms/tasks/Task#public-abstract-tasktresult-addonsuccesslistener-onsuccesslistener-super-tresult-listener">addOnSuccessListener</a> and <a href="/android/reference/com/google/android/gms/tasks/Task#public-abstract-tasktresult-addonfailurelistener-onfailurelistener-listener">addOnFailureListener</a> to register callbacks for receiving the result. To learn more, refer to the <a href="/android/reference/com/google/android/gms/tasks/Task">Task</a> documentation.</p> <h2 id="credentials_ownership_and_maintenance" data-text="Credentials ownership and maintenance" tabindex="-1">Credentials ownership and maintenance</h2> <p>The app that adds the Thread network credentials becomes the owner of the credentials, and has full permissions to access to the credentials. If you try to access credentials added by other apps, you&#39;ll receive a <code translate="no" dir="ltr">PERMISSION_DENIED</code> error.</p> <p>As the app owner, it&#39;s recommended that you keep credentials stored in Google Play services up-to-date when the Thread Border Router network is updated. This means adding credentials when required, updating credentials when the border router&#39;s Thread network credentials change, and removing credentials when the Thread Border Router is removed or factory reset.</p> <h2 id="border_agent_discovery" data-text="Border Agent discovery" tabindex="-1">Border Agent discovery</h2> <p>Credentials must be saved with a Border Agent ID. You&#39;ll need to make sure that your Thread Border Router Setup app is able to determine the Border Agent IDs of your Thread border routers.</p> <p>Thread Border Routers must use mDNS to advertise Thread network information, including the Network Name, Extended Pan ID, and Border Agent ID. The corresponding <code translate="no" dir="ltr">txt</code> values for these attributes are <code translate="no" dir="ltr">nn</code>, <code translate="no" dir="ltr">xp</code>, and <code translate="no" dir="ltr">id</code>, respectively.</p> <aside class="note"><strong>Note:</strong><span> It&#39;s important for the Border Router device to include a 16-byte <code translate="no" dir="ltr">id</code> TXT value in its MeshCoP mDNS service for Google Play services to discover and identify the Thread network. For products using the open source <a href="https://github.com/openthread/ot-br-posix">ot-br-posix</a>, make sure that the <code translate="no" dir="ltr">OTBR_PUBLISH_MESHCOP_BA_ID</code> feature is enabled.</span></aside> <p>For networks with Google border routers, Google Play services automatically gets Google Thread network credentials for use.</p> <h2 id="integrate_the_sdk_into_your_android_app" data-text="Integrate the SDK into your Android app" tabindex="-1">Integrate the SDK into your Android app</h2> <p>To get started, complete the following steps:</p> <ol> <li><p>Follow the instructions provided at <a href="/android/guides/setup">Set up Google Play services</a>.</p></li> <li><p>Add the Google Play services dependency to your <code translate="no" dir="ltr">build.gradle</code> file:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-err">'</span><span class="devsite-syntax-n">com</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">google</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">android</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">gms</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-n">play</span><span class="devsite-syntax-o">-</span><span class="devsite-syntax-n">services</span><span class="devsite-syntax-o">-</span><span class="devsite-syntax-n">threadnetwork</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-m">16.2</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-m">1</span><span class="devsite-syntax-err">'</span> </code></pre></devsite-code></li> <li><p><em>Optional:</em> Define a <code translate="no" dir="ltr">BorderAgent</code> data class to store border router information. We&#39;ll use this data throughout this guide:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">class</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">BorderAgentInfo</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Network Name max 16 len</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">networkName</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">""</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">extPanId</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ByteArray</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ByteArray</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">16</span><span class="devsite-syntax-p">),</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">borderAgentId</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ByteArray</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ByteArray</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">16</span><span class="devsite-syntax-p">),</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code></li> </ol> <p>Next, we&#39;ll go over the recommended steps to add and manage preferred credentials.</p> <h2 id="new_border_router_setups" data-text="New border router setups" tabindex="-1">New border router setups</h2> <p>Before you create a new network for new border routers, it&#39;s important that you try using the preferred network credentials first. This ensures that Thread devices are connected to a single Thread network when possible.</p> <p>A call to <code translate="no" dir="ltr">getPreferredCredentials</code> launches an Activity, prompting users to allow the network request. If network credentials have been stored in the Thread SDK digital keychain, the credentials are returned to your app.</p> <h3 id="request_credentials" data-text="Request credentials" tabindex="-1">Request credentials</h3> <p>To prompt the user for preferred credentials:</p> <ol> <li><p>Declare an <code translate="no" dir="ltr">ActivityLauncher</code>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">private</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">lateinit</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">preferredCredentialsLauncher</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ActivityResultLauncher&lt;IntentSenderRequest&gt;</span> </code></pre></devsite-code></li> <li><p>Handle the Activity result, returned as <code translate="no" dir="ltr">ThreadNetworkCredentials</code>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-n">preferredCredentialsLauncher</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">registerForActivityResult</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">StartIntentSenderForResult</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ActivityResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">resultCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">RESULT_OK</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">threadNetworkCredentials</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">fromIntentSenderResultData</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">data</span><span class="devsite-syntax-o">!!</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">threadNetworkCredentials</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">networkName</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">else</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"User denied request."</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> </code></pre></devsite-code></li> <li><p>If you&#39;re setting up a new Thread Border Router, it&#39;s advised that you call <code translate="no" dir="ltr">preferredCredentials</code> and launch the Activity. This call will ensure that your new Thread Border Router will use the same credentials already stored as <em>preferred</em> in the phone, promoting the convergence of different TBRs to the same network.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">private</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">getPreferredThreadNetworkCredentials</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetwork</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getClient</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-k">this</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">preferredCredentials</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnSuccessListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">intentSenderResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">intentSenderResult</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">intentSender</span><span class="devsite-syntax-o">?.</span><span class="devsite-syntax-na">let</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">preferredCredentialsLauncher</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">launch</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">IntentSenderRequest</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">Builder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-na">build</span><span class="devsite-syntax-p">())</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"No preferred credentials found."</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnFailureListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Exception</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">TAG</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"ERROR: [</span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s">]"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code></li> <li><p>If your use case relates to setting up non-TBR devices, such as a new Matter-over-Thread end device, it&#39;s advised that you use the <code translate="no" dir="ltr">allActiveCredentials</code> api to fetch credentials. This call will scan for TBRs found in the local network and thus won&#39;t return credentials that are not available by an existing TBR locally.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-c1">// Creates the IntentSender result launcher for the getAllActiveCredentials API</span> <span class="devsite-syntax-kd">private</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">getAllActiveCredentialsLauncher</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">registerForActivityResult</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">StartIntentSenderForResult</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ActivityResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">resultCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">RESULT_OK</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">activeCredentials</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">List&lt;ThreadNetworkCredentials&gt;</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">parseListFromIntentSenderResultData</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">data</span><span class="devsite-syntax-o">!!</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Use the activeCredentials list</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">else</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// The user denied to share!</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-c1">// Invokes the getAllActiveCredentials API and starts the dialog activity with the returned</span> <span class="devsite-syntax-c1">// IntentSender</span> <span class="devsite-syntax-n">threadNetworkClient</span> <span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getAllActiveCredentials</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnSuccessListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">intentSenderResult</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">IntentSenderResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">intentSender</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">intentSenderResult</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">intentSender</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">intentSender</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">null</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getAllActiveCredentialsLauncher</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">launch</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">IntentSenderRequest</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">Builder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">intentSender</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-na">build</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">else</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// No active network credentials found!</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-c1">// Handles the failure</span> <span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnFailureListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Exception</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Handle the exception</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code></li> </ol> <h3 id="create_a_new_thread_network" data-text="Create a new Thread network" tabindex="-1">Create a new Thread network</h3> <p>If there are neither preferred Thread network credentials nor active thread credentials available in a user&#39;s Thread network, then you can use the <code translate="no" dir="ltr">addCredentials</code> API to add credentials to Google Play Services. To do this, you&#39;ll need to create a <code translate="no" dir="ltr">ThreadBorderAgent</code>, and also supply a <code translate="no" dir="ltr">ThreadNetworkCredentials</code> object.</p> <p>To create a random network, call the <code translate="no" dir="ltr">newRandomizeBuilder</code>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">threadCredentials</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">newRandomizedBuilder</span><span class="devsite-syntax-p">().</span><span class="devsite-syntax-na">build</span><span class="devsite-syntax-p">()</span> </code></pre></devsite-code> <p>To specify the Thread network Name:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">threadCredentials</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">newRandomizedBuilder</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">setNetworkName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"ThreadNetworkSDK"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">build</span><span class="devsite-syntax-p">()</span> </code></pre></devsite-code> <h3 id="add_credentials" data-text="Add credentials" tabindex="-1">Add credentials</h3> <p>To make your Thread network credentials available for other Thread vendors, we need to add them to Google Play services. Before we can add our new credentials, we also need to know to which border router device this Thread network belongs to.</p> <p>In this example, we&#39;ll create a <code translate="no" dir="ltr">ThreadBorderAgent</code> from a Border Agent ID, and pass the new Thread network credentials that you just created:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">private</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">addCredentials</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">borderAgentInfo</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">BorderAgentInfo</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">credentialsToBeAdded</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">threadBorderAgent</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadBorderAgent</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">newBuilder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">borderAgentInfo</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">borderAgentId</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-na">build</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"border router id:"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">threadBorderAgent</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">id</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetwork</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getClient</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-k">this</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addCredentials</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">threadBorderAgent</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">credentialsToBeAdded</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnSuccessListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"Credentials added."</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">addOnFailureListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Exception</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">TAG</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"ERROR: [</span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s">]"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code><aside class="note"><strong>Note:</strong><span> The Border Agent ID <strong>MUST</strong> be the <code translate="no" dir="ltr">id</code> TXT value of the Border Router mDNS MeshCoP service.</span></aside><aside class="note"><strong>Note:</strong><span> You should use <code translate="no" dir="ltr">addCredentials</code> to update the preferred credentials when a border router&#39;s Thread network credentials change. Existing Thread network credentials that are associated with the same border router will be overwritten.</span></aside> <h2 id="detect_and_migrate_in-field_border_routers" data-text="Detect and migrate in-field border routers" tabindex="-1">Detect and migrate in-field border routers</h2> <p>If you currently have in-field border routers, you can use <code translate="no" dir="ltr">isPreferredCredentials</code> to determine if your border routers belong to the preferred network. This API does not prompt the user for permission, and checks border router credentials against what&#39;s stored in Google Play services.</p> <p><code translate="no" dir="ltr">isPreferredCredentails</code> returns <code translate="no" dir="ltr">0</code> for not matched, and <code translate="no" dir="ltr">1</code> for matched, as an <code translate="no" dir="ltr">Int</code> datatype. You can use <code translate="no" dir="ltr">IsPreferredCredentialsResult</code> to check your results.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Transact-SQL"><code translate="no" dir="ltr"><span class="devsite-syntax-k">public</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">@interface</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">IsPreferredCredentialsResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-err">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">int</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PREFERRED_CREDENTIALS_NOT_FOUND</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span><span class="devsite-syntax-mi">1</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">int</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PREFERRED_CREDENTIALS_NOT_MATCHED</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">0</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">int</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PREFERRED_CREDENTIALS_MATCHED</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">1</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-err">}</span> </code></pre></devsite-code> <p>To use <code translate="no" dir="ltr">isPreferredCredentials</code>, you&#39;ll need to create a <code translate="no" dir="ltr">ThreadNetworkCredentials</code> object first. There are several ways to instantiate <code translate="no" dir="ltr">ThreadNetworkCredentials</code>. In the next steps, we&#39;ll go over these options.</p> <h3 id="thread_network_credentials_by_operational_dataset" data-text="Thread network credentials by Operational Dataset" tabindex="-1">Thread network credentials by Operational Dataset</h3> <p>There are cases that your Thread Border Router is already set up with a Thread network, and you want to add this Thread network to Google Play services to share it with other vendors. You can create a <code translate="no" dir="ltr">ThreadNetworkCredential</code> instance from a raw Thread Active Operational Dataset TLV list:</p> <ol> <li><p>Convert the Operational Dataset to a <code translate="no" dir="ltr">ByteArray</code>. For example:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr">val activeDataset = "0e080000000000010000000300000f35060004001fffe0020833333333...".dsToByteArray() </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr">fun String.dsToByteArray(): ByteArray { return chunked(2).map { it.toInt(16).toByte() }.toByteArray() } </code></pre></devsite-code></li> <li><p>Use <code translate="no" dir="ltr">fromActiveOperationalDataset</code> to create the <code translate="no" dir="ltr">ThreadNetworkCredentials</code>. When successful, you&#39;ll be able to get the Thread network Name, Channel, and other network information. For a complete list of properties, refer to <a href="/reference/com/google/android/gms/threadnetwork/ThreadNetworkCredentials">ThreadNetworkCredentials</a>.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr">val threadNetworkCredentials = ThreadNetworkCredentials.fromActiveOperationalDataset(activeDataset) Log.d( "threadNetworkCredentials", threadNetworkCredentials.channel.toString() + " - " + threadNetworkCredentials.networkName) </code></pre></devsite-code></li> <li><p>Call the <code translate="no" dir="ltr">isPreferredCredentials</code> API and pass the <code translate="no" dir="ltr">ThreadNetworkCredentials</code>.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Genshi"><code translate="no" dir="ltr">ThreadNetwork.getClient(this) .isPreferredCredentials(threadNetworkCredentials) .addOnSuccessListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>result<span class="devsite-syntax-w"> </span>-&gt; <span class="devsite-syntax-w"> </span>when<span class="devsite-syntax-w"> </span>(result)<span class="devsite-syntax-w"> </span>{ <span class="devsite-syntax-w"> </span>IsPreferredCredentialsResult.PREFERRED_CREDENTIALS_NOT_MATCHED<span class="devsite-syntax-w"> </span>-&gt; <span class="devsite-syntax-w"> </span>Log.d("isPreferredCredentials",<span class="devsite-syntax-w"> </span>"Credentials<span class="devsite-syntax-w"> </span>not<span class="devsite-syntax-w"> </span>matched.") <span class="devsite-syntax-w"> </span>IsPreferredCredentialsResult.PREFERRED_CREDENTIALS_MATCHED<span class="devsite-syntax-w"> </span>-&gt; <span class="devsite-syntax-w"> </span>Log.d("isPreferredCredentials",<span class="devsite-syntax-w"> </span>"Credentials<span class="devsite-syntax-w"> </span>matched.") <span class="devsite-syntax-w"> </span>} } .addOnFailureListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>e:<span class="devsite-syntax-w"> </span>Exception<span class="devsite-syntax-w"> </span>-&gt;<span class="devsite-syntax-w"> </span>Log.d("isPreferredCredentials",<span class="devsite-syntax-w"> </span>"ERROR:<span class="devsite-syntax-w"> </span>[<span class="devsite-syntax-cp">${</span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-cp">}</span>]")<span class="devsite-syntax-w"> </span>} </code></pre></devsite-code></li> </ol> <h3 id="thread_network_credentials_by_border_agent" data-text="Thread network credentials by Border Agent" tabindex="-1">Thread network credentials by Border Agent</h3> <p>A Border Agent ID uniquely identifies a border router device. To use the <code translate="no" dir="ltr">getCredentialsByBorderAgent</code> API, first you&#39;ll need to create a <code translate="no" dir="ltr">ThreadBorderAgent</code> object and pass the Border Agent ID.</p> <p>Once you&#39;ve created the <code translate="no" dir="ltr">ThreadBorderAgent</code> object, call <code translate="no" dir="ltr">getCredentialsByBorderAgent</code>. If the credentials have been saved, check to see if they&#39;re preferred.</p> <aside class="special"><strong>Important:</strong><span> This API will fail if the credentials were not added by your app.</span></aside><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="GDScript"><code translate="no" dir="ltr"><span class="devsite-syntax-n">private</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">isPreferredThreadNetworkByBorderAgent</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">borderAgentInfo</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">BorderAgentInfo</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">threadBorderAgent</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadBorderAgent</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">newBuilder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">borderAgentInfo</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">borderAgentId</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">build</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"border router id:"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">threadBorderAgent</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">id</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">isPreferred</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">IsPreferredCredentialsResult</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">PREFERRED_CREDENTIALS_NOT_FOUND</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">borderAgentCredentials</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentials</span><span class="devsite-syntax-err">?</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">taskByBorderAgent</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetwork</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">getClient</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">this</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">taskByBorderAgent</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">getCredentialsByBorderAgent</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">threadBorderAgent</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">addOnSuccessListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ThreadNetworkCredentialsResult</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">borderAgentCredentials</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">credentials</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">credentials</span><span class="devsite-syntax-err">?</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">let</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">taskByBorderAgent</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">isPreferredCredentials</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">it</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">addOnSuccessListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">isPreferred</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">result</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">addOnFailureListener</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Exception</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Log</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">d</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">TAG</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"ERROR: [${e}]"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <h3 id="thread_network_credentials_by_extended_pan_id" data-text="Thread network credentials by Extended Pan ID" tabindex="-1">Thread network credentials by Extended Pan ID</h3> <p>Similar to <code translate="no" dir="ltr">getPreferredCredentials</code>, you can also prompt the user for credentials from a border router&#39;s Extended Pan ID. The <code translate="no" dir="ltr">getCredentialsByExtendedPanId</code> returns an <code translate="no" dir="ltr">IntentSender</code>, and the Activity result contains a <code translate="no" dir="ltr">ThreadNetworkCredentials</code> object when the user approves.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Genshi"><code translate="no" dir="ltr">private<span class="devsite-syntax-w"> </span>fun<span class="devsite-syntax-w"> </span>getCredentialsByExtPanId(borderAgentInfo:<span class="devsite-syntax-w"> </span>BorderAgentInfo)<span class="devsite-syntax-w"> </span>{ <span class="devsite-syntax-w"> </span>ThreadNetwork.getClient(this) <span class="devsite-syntax-w"> </span>.getCredentialsByExtendedPanId(borderAgentInfo.extPanId) <span class="devsite-syntax-w"> </span>.addOnSuccessListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>intentSenderResult<span class="devsite-syntax-w"> </span>-&gt; <span class="devsite-syntax-w"> </span>intentSenderResult.intentSender?.let<span class="devsite-syntax-w"> </span>{ <span class="devsite-syntax-w"> </span>preferredCredentialsLauncher.launch(IntentSenderRequest.Builder(it).build()) <span class="devsite-syntax-w"> </span>} <span class="devsite-syntax-w"> </span>?:<span class="devsite-syntax-w"> </span>Log.d("debug",<span class="devsite-syntax-w"> </span>"No<span class="devsite-syntax-w"> </span>credentials<span class="devsite-syntax-w"> </span>found.") <span class="devsite-syntax-w"> </span>} <span class="devsite-syntax-w"> </span>.addOnFailureListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>e:<span class="devsite-syntax-w"> </span>Exception<span class="devsite-syntax-w"> </span>-&gt;<span class="devsite-syntax-w"> </span>Log.d(TAG,<span class="devsite-syntax-w"> </span>"ERROR:<span class="devsite-syntax-w"> </span>[<span class="devsite-syntax-cp">${</span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-cp">}</span>]")<span class="devsite-syntax-w"> </span>} } </code></pre></devsite-code> <h2 id="remove_credentials" data-text="Remove Credentials" tabindex="-1">Remove Credentials</h2> <p>When your Border Router device is removed from your home or factory reset, you need to remove its Thread network from Google Play services.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Genshi"><code translate="no" dir="ltr">private<span class="devsite-syntax-w"> </span>fun<span class="devsite-syntax-w"> </span>removeCredentials(borderAgentInfo:<span class="devsite-syntax-w"> </span>BorderAgentInfo)<span class="devsite-syntax-w"> </span>{ <span class="devsite-syntax-w"> </span>val<span class="devsite-syntax-w"> </span>threadBorderAgent<span class="devsite-syntax-w"> </span>=<span class="devsite-syntax-w"> </span>ThreadBorderAgent.newBuilder(borderAgentInfo.borderAgentId).build() <span class="devsite-syntax-w"> </span>Log.d("debug",<span class="devsite-syntax-w"> </span>"border<span class="devsite-syntax-w"> </span>router<span class="devsite-syntax-w"> </span>id:"<span class="devsite-syntax-w"> </span>+<span class="devsite-syntax-w"> </span>threadBorderAgent.id) <span class="devsite-syntax-w"> </span>ThreadNetwork.getClient(this) <span class="devsite-syntax-w"> </span>.removeCredentials(threadBorderAgent) <span class="devsite-syntax-w"> </span>.addOnSuccessListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>Log.d("debug",<span class="devsite-syntax-w"> </span>"Credentials<span class="devsite-syntax-w"> </span>removed.")<span class="devsite-syntax-w"> </span>} <span class="devsite-syntax-w"> </span>.addOnFailureListener<span class="devsite-syntax-w"> </span>{<span class="devsite-syntax-w"> </span>e:<span class="devsite-syntax-w"> </span>Exception<span class="devsite-syntax-w"> </span>-&gt;<span class="devsite-syntax-w"> </span>Log.d(TAG,<span class="devsite-syntax-w"> </span>"ERROR:<span class="devsite-syntax-w"> </span>[<span class="devsite-syntax-cp">${</span><span class="devsite-syntax-n">e</span><span class="devsite-syntax-cp">}</span>]")<span class="devsite-syntax-w"> </span>} } </code></pre></devsite-code> <h2 id="resources" data-text="Resources" tabindex="-1">Resources</h2> <p>To learn more about the Thread Network SDK, refer to the <a href="/reference/com/google/android/gms/threadnetwork/package-summary">API Reference</a>.</p> </div> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2022-10-13 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Incorrect information","incorrectInformation","thumb-down"],["Not enough information/samples","notEnoughInformationSamples","thumb-down"],["Too complicated","tooComplicated","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2022-10-13 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">For devices</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/matter" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Matter"data-category="Footer"> Matter </a> <div class="devsite-footer-linkbox-description">New IP-based smart home connectivity protocol that enables broad interoperability with many ecosystems</div> </li> <li class="devsite-footer-linkbox-item"> <a href="/cloud-to-cloud" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Cloud-to-cloud"data-category="Footer"> Cloud-to-cloud </a> <div class="devsite-footer-linkbox-description">Connect your cloud backend with the Smart Home API</div> </li> <li class="devsite-footer-linkbox-item"> <a href="/ways-to-build" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Ways to Build"data-category="Footer"> <div class="devsite-footer-linkbox-icon" aria-hidden="true"> <picture> <img src="/images/footer-icon.svg" loading="lazy" alt=""> </picture> </div> Find out which integration to build </a> <div class="devsite-footer-linkbox-description">We’ll recommend an integration based on your device and needs</div> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">For apps, platforms & services</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/apis" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Home APIs"data-category="Footer"> Home APIs </a> <div class="devsite-footer-linkbox-description">Access over 600M devices, hubs for Google Home and Matter infrastructure, and an automation engine powered by Google intelligence</div> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Use cases</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=light" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Use Cases Lighting"> Lighting </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=thermostat" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Use Cases Climate"> Climate </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=lock" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Use Cases Safety"data-category="Footer"> Safety & security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=tv" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Use Cases Media"> Media & technology </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=vacuum" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Use Cases Household"data-category="Footer"> Household appliances </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=coffee-maker" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Use Cases Kitchen"> Kitchen appliances </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=shower" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Use Cases Bed"data-category="Footer"> Bed & bath </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/use-cases?device=sprinkler" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Use Cases Outdoor"data-category="Footer"> Outdoor </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Business resources</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/certification" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Resources Certification"> Certification & badging </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/business-resources#marketing-resources" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Resources Marketing"> Marketing resources </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/business-resources#development-resources" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Resources Development"data-category="Footer"> Development resources </a> </li> <li class="devsite-footer-linkbox-item"> <h3 class="devsite-footer-linkbox-heading no-link"> Legal </h3> </li> <li class="devsite-footer-linkbox-item"> <a href="/terms" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Terms"> Developer Terms of Service </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/policies" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"data-label="Policies"> Developer Policies </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Console</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//console.home.google.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Footer"target="_blank"data-label="Console Home"> Developer Console </a> </li> <li class="devsite-footer-linkbox-item"> <h3 class="devsite-footer-linkbox-heading no-link"> Support </h3> </li> <li class="devsite-footer-linkbox-item"> <a href="//stackoverflow.com/questions/tagged/google-smart-home" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" target="_blank"data-category="Footer"data-label="Community Stack Overflow"> Stack Overflow </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.googlenestcommunity.com/t5/Smart-Home-Developer-Forum/bd-p/Smart-Home-Developer-Forum" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" target="_blank"data-label="Community Google Nest"data-category="Footer"> Google Nest Community </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt" >Português</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[{&#34;dimensions&#34;: {&#34;dimension1&#34;: &#34;Signed out&#34;, &#34;dimension2&#34;: false, &#34;dimension4&#34;: &#34;en&#34;, &#34;dimension3&#34;: &#34;en&#34;, &#34;dimension5&#34;: false}, &#34;gaid&#34;: &#34;UA-227286873-1&#34;, &#34;metrics&#34;: {}, &#34;purpose&#34;: 0}]</script> <script type="application/json" tag-management>{&#34;at&#34;: &#34;True&#34;, &#34;ga4&#34;: [{&#34;id&#34;: &#34;G-333MC3Y0E5&#34;, &#34;purpose&#34;: 0}], &#34;ga4p&#34;: [{&#34;id&#34;: &#34;G-333MC3Y0E5&#34;, &#34;purpose&#34;: 0}], &#34;gtm&#34;: [], &#34;parameters&#34;: {&#34;internalUser&#34;: &#34;False&#34;, &#34;language&#34;: {&#34;machineTranslated&#34;: &#34;False&#34;, &#34;requested&#34;: &#34;en&#34;, &#34;served&#34;: &#34;en&#34;}, &#34;pageType&#34;: &#34;article&#34;, &#34;projectName&#34;: &#34;Thread&#34;, &#34;signedIn&#34;: &#34;False&#34;, &#34;tenant&#34;: &#34;home&#34;, &#34;recommendations&#34;: {&#34;sourcePage&#34;: &#34;&#34;, &#34;sourceType&#34;: 0, &#34;sourceRank&#34;: 0, &#34;sourceIdenticalDescriptions&#34;: 0, &#34;sourceTitleWords&#34;: 0, &#34;sourceDescriptionWords&#34;: 0, &#34;experiment&#34;: &#34;&#34;}, &#34;experiment&#34;: {&#34;ids&#34;: &#34;&#34;}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <devsite-fully-clickable target=" .home-core-clickable, .home-illustrated-items-program, .home-logos .devsite-landing-row-item, .home-sidecar-clickable, .home-sidecar-columns .devsite-landing-row-item, .fully-clickable" watch="devsite-content"></devsite-fully-clickable> <script nonce="gW8wdfzIwc1w/Kh1pVtDuXuBDhdHDn"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/js/app_loader.js', '[46,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home","https://home-dot-devsite-v2-prod.appspot.com",1,null,["/_pwa/home/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/favicon.png","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/home/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,116,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developers.home.google.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["TpcFeatures__enable_mirror_tenant_redirects","Search__enable_page_map","Profiles__enable_join_program_group_endpoint","Profiles__enable_dashboard_curated_recommendations","Cloud__enable_cloud_facet_chat","Profiles__enable_developer_profiles_callout","Profiles__enable_complete_playlist_endpoint","Profiles__enable_release_notes_notifications","Cloud__enable_cloudx_ping","Profiles__require_profile_eligibility_for_signin","Cloud__enable_legacy_calculator_redirect","Cloud__enable_cloud_shell","Cloud__enable_cloud_shell_fte_user_flow","MiscFeatureFlags__enable_view_transitions","Profiles__enable_profile_collections","MiscFeatureFlags__developers_footer_image","Cloud__enable_cloudx_experiment_ids","Profiles__enable_completequiz_endpoint","Profiles__enable_stripe_subscription_management","MiscFeatureFlags__enable_project_variables","CloudShell__cloud_code_overflow_menu","Profiles__enable_completecodelab_endpoint","EngEduTelemetry__enable_engedu_telemetry","Search__enable_dynamic_content_confidential_banner","Profiles__enable_public_developer_profiles","Cloud__enable_free_trial_server_call","Analytics__enable_clearcut_logging","Search__enable_ai_eligibility_checks","Profiles__enable_awarding_url","Concierge__enable_pushui","Profiles__enable_page_saving","MiscFeatureFlags__developers_footer_dark_image","MiscFeatureFlags__enable_explain_this_code","Search__enable_suggestions_from_borg","DevPro__enable_cloud_innovators_plus","Experiments__reqs_query_experiments","BookNav__enable_tenant_cache_key","MiscFeatureFlags__enable_firebase_utm","Cloud__enable_cloud_dlp_service","OnSwitch__enable","CloudShell__cloud_shell_button","MiscFeatureFlags__enable_variable_operator","DevPro__enable_developer_subscriptions","TpcFeatures__enable_unmirrored_page_left_nav","Cloud__enable_llm_concierge_chat","Profiles__enable_recognition_badges","MiscFeatureFlags__emergency_css"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.clients6.google.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.clients6.google.com",1,4,null,"https://developerprofiles-pa.clients6.google.com",[46,"home","Google Home Developers","developers.home.google.com",null,"home-dot-devsite-v2-prod.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],null,null,null,null,[1,null,1],[1,1,null,1,1]],null,[61,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,1,1,null,null,null,null,null,null,[[],[],[],[],[],[],[]],null,null,null,null,null,null,[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[2,4,6,7,1,12,14,15,17,18,20,21,22,23,28,30,32,36,39,40,43],null,[[],[1,1]],[[["UA-227286873-1"],["UA-227286873-2"],null,null,["UA-227286873-3"],null,null,[["G-333MC3Y0E5"],null,null,[["G-333MC3Y0E5",1]]],[["UA-227286873-1",1]],null,[["UA-227286873-3",1]],null,1],[[2,2],[4,5],[3,4],[1,1],[5,8]]],null,4],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m",1]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10