Google Asistan ve medya uygulamaları

Google Asistan, Google Home ve telefonunuz gibi birçok cihazı kontrol etmek için sesli komutları kullanmanıza olanak tanır. Medya komutlarını anlamak ("Beyoncé'den bir şey çal") için yerleşik bir özelliğe sahiptir ve medya denetimlerini (duraklat, atla, ileri sarın, beğen gibi) destekler.

Asistan, bir medya oturumu kullanarak Android medya uygulamalarıyla iletişim kurar. Uygulamanızı başlatmak ve oynatmayı başlatmak için ntents veya hizmetleri kullanabilir. En iyi sonuçlar için uygulamanız bu sayfada açıklanan tüm özellikleri uygulamalıdır.

bölümüne bakın.

Medya oturumu kullanma

Oynatma başladıktan sonra Asistan'ın aktarım kontrollerini çalıştırabilmesi için her ses ve video uygulaması bir medya oturumu uygulamalıdır.

Asistan yalnızca bu bölümde listelenen işlemleri kullansa da en iyi uygulamanın, diğer uygulamalarla uyumluluğu sağlamak için tüm hazırlık ve oynatma API'lerini uygulamak olduğunu unutmayın. Medya oturumu geri çağırmaları, desteklemediğiniz işlemler için ERROR_CODE_NOT_SUPPORTED kullanarak bir hata döndürebilir.

Medya ve aktarım kontrollerini etkinleştirmek için uygulamanızın MediaSession nesnesinde şu işaretleri ayarlayın:

Kotlin

session.setFlags(
        MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or
        MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)

Java

session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

Uygulamanızın medya oturumu, desteklediği işlemleri tanımlamalı ve ilgili medya oturumu geri çağırmalarını uygulamalıdır. Desteklenen işlemlerinizi setActions() bölümünde belirtin.

Universal Android Music Player örnek projesi, medya oturumu oluşturma konusunda iyi bir örnektir.

Oynatma işlemleri

Bir hizmetten oynatmaya başlamak için medya oturumunda şu PLAY işlemleri ve geri çağırmaları olmalıdır:

İşlem Geri Arama
ACTION_PLAY onPlay()
ACTION_PLAY_FROM_SEARCH onPlayFromSearch()
ACTION_PLAY_FROM_URI (*) onPlayFromUri()

Oturumunuzda şu PREPARE işlemi ve geri çağırma işlevleri de uygulanmalıdır:

İşlem Geri Arama
ACTION_PREPARE onPrepare()
ACTION_PREPARE_FROM_SEARCH onPrepareFromSearch()
ACTION_PREPARE_FROM_URI (*) onPrepareFromUri()

(*) Google Asistan URI tabanlı işlemler, yalnızca Google'a URI'lar sağlayan şirketlerde işe yarar. Medya içeriğinizi Google'a açıklama hakkında daha fazla bilgi edinmek için Medya İşlemleri konusuna bakın.

Hazırlık API'lerinin uygulanmasıyla, sesli komuttan sonraki oynatma gecikmesi azaltılabilir. Oynatma gecikmesini iyileştirmek isteyen medya uygulamaları, ekstra süreyi kullanarak içeriği önbelleğe almaya ve medya oynatmayı hazırlamaya başlayabilir.

Arama sorgularını ayrıştır

Kullanıcı, "[Uygulamanızın adı] uygulamasında caz çal" veya "[Şarkı başlığı] adlı şarkınızı dinleyin" gibi belirli bir medya öğesini aradığında onPrepareFromSearch() veya onPlayFromSearch() geri çağırma yöntemi, bir sorgu parametresi ve ekstralar paketi alır.

Uygulamanız sesli arama sorgusunu ayrıştırmalı ve aşağıdaki adımları uygulayarak çalmayı başlatmalıdır:

  1. Sonuçları filtrelemek için sesli aramanın döndürdüğü ekstralar paketini ve arama sorgusu dizesini kullanın.
  2. Bu sonuçlara göre bir oynatma sırası oluşturun.
  3. Sonuçlardan en alakalı medya öğesini oynatın.

onPlayFromSearch() yöntemi, sesli aramadan daha ayrıntılı bilgiler içeren bir "Extras" parametresi alır. Bu ekstra özellikler, çalmak üzere uygulamanızdaki ses içeriğini bulmanıza yardımcı olur. Arama sonuçları bu verileri sağlayamazsa ham arama sorgusunu ayrıştırmak ve sorguya göre uygun parçaları çalmak için bir mantık uygulayabilirsiniz.

Aşağıdaki ekstra özellikler Android Automotive OS ve Android Auto'da desteklenir:

Aşağıdaki kod snippet'i, sesli arama sorgusunu ayrıştırıp oynatmayı başlatmak için MediaSession.Callback uygulamanızda onPlayFromSearch() yönteminin nasıl geçersiz kılınacağını gösterir:

Kotlin

override fun onPlayFromSearch(query: String?, extras: Bundle?) {
    if (query.isNullOrEmpty()) {
        // The user provided generic string e.g. 'Play music'
        // Build appropriate playlist queue
    } else {
        // Build a queue based on songs that match "query" or "extras" param
        val mediaFocus: String? = extras?.getString(MediaStore.EXTRA_MEDIA_FOCUS)
        if (mediaFocus == MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) {
            isArtistFocus = true
            artist = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST)
        } else if (mediaFocus == MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) {
            isAlbumFocus = true
            album = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM)
        }

        // Implement additional "extras" param filtering
    }

    // Implement your logic to retrieve the queue
    var result: String? = when {
        isArtistFocus -> artist?.also {
            searchMusicByArtist(it)
        }
        isAlbumFocus -> album?.also {
            searchMusicByAlbum(it)
        }
        else -> null
    }
    result = result ?: run {
        // No focus found, search by query for song title
        query?.also {
            searchMusicBySongTitle(it)
        }
    }

    if (result?.isNotEmpty() == true) {
        // Immediately start playing from the beginning of the search results
        // Implement your logic to start playing music
        playMusic(result)
    } else {
        // Handle no queue found. Stop playing if the app
        // is currently playing a song
    }
}

Java

@Override
public void onPlayFromSearch(String query, Bundle extras) {
    if (TextUtils.isEmpty(query)) {
        // The user provided generic string e.g. 'Play music'
        // Build appropriate playlist queue
    } else {
        // Build a queue based on songs that match "query" or "extras" param
        String mediaFocus = extras.getString(MediaStore.EXTRA_MEDIA_FOCUS);
        if (TextUtils.equals(mediaFocus,
                MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)) {
            isArtistFocus = true;
            artist = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST);
        } else if (TextUtils.equals(mediaFocus,
                MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE)) {
            isAlbumFocus = true;
            album = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM);
        }

        // Implement additional "extras" param filtering
    }

    // Implement your logic to retrieve the queue
    if (isArtistFocus) {
        result = searchMusicByArtist(artist);
    } else if (isAlbumFocus) {
        result = searchMusicByAlbum(album);
    }

    if (result == null) {
        // No focus found, search by query for song title
        result = searchMusicBySongTitle(query);
    }

    if (result != null && !result.isEmpty()) {
        // Immediately start playing from the beginning of the search results
        // Implement your logic to start playing music
        playMusic(result);
    } else {
        // Handle no queue found. Stop playing if the app
        // is currently playing a song
    }
}

Uygulamanızda ses içeriğini çalmak için sesli aramanın nasıl uygulanacağına ilişkin daha ayrıntılı bir örnek için Evrensel Android Müzik Oynatıcı örneğine bakın.

Boş sorguları işleyin

onPrepare(), onPlay(), onPrepareFromSearch() veya onPlayFromSearch() bir arama sorgusu olmadan çağrılırsa medya uygulamanız "mevcut" medyayı oynatır. Geçerli bir medya içeriği yoksa uygulama bir şey çalmayı denemelidir. Örneğin, en son oynatma listesinden bir şarkı veya rastgele bir sıradan şarkı çalmayı denemelidir. Bir kullanıcı, ek bilgi olmaksızın "[Uygulamanızın adı] uygulamasında müzik çal" komutu verdiğinde Asistan, bu API'leri kullanır.

Bir kullanıcı "[Uygulamanızın adı] uygulamasında müzik çal" dediğinde Android Automotive OS veya Android Auto, uygulamanızın onPlayFromSearch() yöntemini çağırarak uygulamanızı başlatmaya ve ses çalmaya çalışır. Ancak kullanıcı medya öğesinin adını söylemediği için onPlayFromSearch() yöntemi boş bir sorgu parametresi alır. Bu tür durumlarda uygulamanız hemen bir ses çalarak (örneğin, en son şarkı listesinden bir şarkı veya rastgele bir sıradan şarkı çalarak) yanıt vermelidir.

Sesli işlemler için eski desteği beyan etme

Çoğu durumda, yukarıda açıklanan oynatma işlemlerini gerçekleştirmek, uygulamanıza ihtiyaç duyduğu tüm oynatma işlevlerini sağlar. Ancak bazı sistemler, uygulamanızın arama için Intent filtresi içermesini gerektirir. Uygulamanızın manifest dosyalarında bu Intent filtresini desteklediğinizi beyan etmeniz gerekir.

Bu kodu, bir telefon uygulamasının manifest dosyasına ekleyin:

<activity>
    <intent-filter>
        <action android:name=
             "android.media.action.MEDIA_PLAY_FROM_SEARCH" />
        <category android:name=
             "android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Aktarım denetimleri

Uygulamanızın medya oturumu etkin hale geldikten sonra Asistan, oynatmayı kontrol etmek ve medya meta verilerini güncellemek için sesli komutlar verebilir. Bunun işe yaraması için kodunuzun aşağıdaki işlemleri etkinleştirmesi ve karşılık gelen geri çağırmaları uygulaması gerekir:

İşlem Geri Arama Açıklama
ACTION_SKIP_TO_NEXT onSkipToNext() Sonraki video
ACTION_SKIP_TO_PREVIOUS onSkipToPrevious() Önceki şarkı
ACTION_PAUSE, ACTION_PLAY_PAUSE onPause() Duraklat
ACTION_STOP onStop() Durdur
ACTION_PLAY onPlay() Devam ettir
ACTION_SEEK_TO onSeekTo() 30 saniye geri sar
ACTION_SET_RATING onSetRating(android.support.v4.media.RatingCompat) Beğen/beğenme.
ACTION_SET_CAPTIONING_ENABLED onSetCaptioningEnabled(boolean) Altyazıyı açın/kapatın.

Not:

  • Arama komutlarının çalışması için PlaybackState öğesinin state, position, playback speed, and update time ile güncel olması gerekir. Durum değiştiğinde uygulama setPlaybackState() öğesini çağırmalıdır.
  • Medya uygulaması, medya oturumu meta verilerini de güncel tutmalıdır. Bu, "Hangi şarkı çalıyor?" gibi soruları destekler. Geçerli alanlar (parça başlığı, sanatçı ve adı gibi) değiştiğinde uygulamanın setMetadata() öğesini çağırması gerekir.
  • MediaSession.setRatingType(), uygulamanın desteklediği derecelendirme türünü belirtecek şekilde ayarlanmalı ve uygulama, onSetRating() özelliğini kullanmalıdır. Uygulama, derecelendirmeyi desteklemiyorsa derecelendirme türünü RATING_NONE olarak ayarlamalıdır.

Desteklediğiniz sesli işlemler, büyük olasılıkla içerik türüne göre değişiklik gösterir.

İçerik Türü Gerekli İşlemler
Müzik

Desteklenmelidir: Oynat, Duraklat, Durdur, Sonrakine Atla ve Öncekine Atla

Şunlar için destek önerin: Ara

Podcast

Desteklenmelidir: Oynat, Duraklat, Durdur ve Şuraya Ara

Şunun için destek önerilir: Sonrakine atla ve Öncekine atla

Sesli kitap Desteklenmelidir: Oynat, Duraklat, Durdur ve Şuraya Ara
Radyo Desteklenmelidir: Oynat, Duraklat ve Durdur
Haberler Desteklenmelidir: Oynat, Duraklat, Durdur, Sonrakine Atla ve Öncekine Atla
Video

Desteklenmelidir: Oynat, Duraklat, Durdur, Sar, Geri Sar ve Hızlı İleri

Şunlar için destek önerin: Sonrakine atla ve Öncekine atla

Yukarıda listelenen işlemleri ürün tekliflerinizin izin verdiği kadar desteklemeniz, ancak diğer tüm işlemlere de nazik bir şekilde yanıt vermeniz gerekir. Örneğin, yalnızca premium kullanıcıların önceki öğeye geri dönme olanağı varsa ücretsiz katman kullanıcısı Asistan'dan önceki öğeye dönmesini isterse hata oluşturabilirsiniz. Daha fazla bilgi için hata işleme bölümüne bakın.

Denenecek örnek sesli sorgular

Aşağıdaki tabloda, uygulamanızı test ederken kullanmanız gereken bazı örnek sorgular verilmiştir:

MediaSession Geri Çağırması Kullanılacak “Ok Google” ifadesi
onPlay()

"Oyna."

"Devam ettir."

onPlayFromSearch()
onPlayFromUri()
Müzik

"(uygulama adı) uygulamasında müzik çal veya şarkı çal." Bu boş bir sorgudur.

"(uygulama adı) uygulamasında (şarkı | sanatçı | albüm | tür | oynatma listesi) çal."

Radyo "(uygulama adı) uygulamasında (frequency | Station) öğesini çal."
Sesli kitap

"Sesli kitabımı (uygulama adı) üzerinde oku."

"(uygulama adı) ile ilgili (sesli kitap) adlı kitabı okuyun."

Podcasts "(uygulama adı) uygulamasında (podcast) çal."
onPause() "Duraklat."
onStop() "Durdur."
onSkipToNext() "Sonraki (şarkı | bölüm | parça)."
onSkipToPrevious() "Önceki (şarkı | bölüm | parça)."
onSeekTo()

"Yeniden başlat."

"## saniye ileri sar."

"## dakika geri git."

Yok (MediaMetadata bilgilerinizi güncel tutun) "Çalan ne?"

Hatalar var

Asistan, medya oturumunda ortaya çıkan hataları ele alır ve bu hataları kullanıcılara bildirir. Medya oturumunuzun, Medya oturumuyla çalışma bölümünde açıklandığı gibi PlaybackState öğesindeki aktarım durumunu ve hata kodunu doğru bir şekilde güncellediğinden emin olun. Asistan, getErrorCode() tarafından döndürülen tüm hata kodlarını tanır.

Yaygın olarak yanlış işlenen destek kayıtları

Aşağıda, doğru şekilde ele aldığınızdan emin olmanız gereken hata durumlarıyla ilgili bazı örnekler verilmiştir:

  • Kullanıcının oturum açması gerekir
    • PlaybackState hata kodunu ERROR_CODE_AUTHENTICATION_EXPIRED olarak ayarlayın.
    • PlaybackState hata mesajını ayarlayın.
    • Oynatma için gerekirse PlaybackState durumunu STATE_ERROR olarak ayarlayın. Aksi takdirde PlaybackState öğesinin geri kalanını olduğu gibi saklayın.
  • Kullanıcı kullanılamayan bir işlem istiyor
    • PlaybackState hata kodunu uygun şekilde ayarlayın. Örneğin, işlem desteklenmiyorsa PlaybackState öğesini ERROR_CODE_NOT_SUPPORTED veya işlem, oturum açma korumalıysa ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED olarak ayarlayın.
    • PlaybackState hata mesajını ayarlayın.
    • PlaybackState öğesinin geri kalanını olduğu gibi saklayın.
  • Kullanıcı, uygulamada bulunmayan içeriği istiyor
    • PlaybackState hata kodunu uygun şekilde ayarlayın. Örneğin, ERROR_CODE_NOT_AVAILABLE_IN_REGION kullanın.
    • PlaybackState hata mesajını ayarlayın.
    • Oynatmayı kesintiye uğratmak için PlaybackSate durumunu STATE_ERROR olarak ayarlayın. Aksi takdirde, PlaybackState öğelerinin geri kalanını olduğu gibi saklayın.
  • Kullanıcı, tam eşleşmenin bulunmadığı durumlarda içerik ister. Örneğin, ücretsiz katman kullanıcısı yalnızca premium katmandaki kullanıcılara sunulan içeriği talep edebilir.
    • Hata döndürmemenizi ve bunun yerine oynatılacak benzer bir şey bulmaya öncelik vermenizi öneririz. Asistan, oynatma başlamadan önce en alakalı sesli yanıtı söyler.

Bilinçli şekilde oynatma

Asistan, derin bağlantı içeren bir niyet göndererek bir ses veya video uygulaması başlatabilir ve çalmayı başlatabilir.

Amaç ve derin bağlantısı farklı kaynaklardan gelebilir:

  • Asistan bir mobil uygulamayı başlatırken, bağlantıyla izleme işlemi sunan işaretlenmiş içerikleri almak için Google aramayı kullanabilir.
  • Asistan bir TV uygulamasını başlatırken uygulamanız, medya içeriği için URI'ları göstermek üzere bir TV Arama Sağlayıcısı içermelidir. Asistan, içerik sağlayıcıya bir sorgu gönderir. Bu sorgu, derin bağlantı için URI ve isteğe bağlı bir işlem içeren bir niyet döndürür. Sorgu, amaçta bir işlem döndürürse Asistan bu işlemi ve URI'yı uygulamanıza geri gönderir. Sağlayıcı bir işlem belirtmediyse Asistan Intent'e ACTION_VIEW ekler.

Asistan, uygulamanıza gönderdiği amaca true değeriyle ekstra EXTRA_START_PLAYBACK ekler. Uygulamanız, EXTRA_START_PLAYBACK ile niyet aldığında çalmaya başlar.

Etkin durumdayken amaçları işleme

Kullanıcılar, uygulamanız önceki bir isteğin içeriğini oynatırken Asistan'dan bir şey çalmasını isteyebilir. Bu, oynatma etkinliği başlatılmış ve etkin durumdayken uygulamanızın oynatmayı başlatmak için yeni amaçlar alabileceği anlamına gelir.

Derin bağlantılara sahip amaçları destekleyen etkinlikler, yeni istekleri ele almak için onNewIntent() değerini geçersiz kılar.

Asistan, oynatmaya başlarken uygulamanıza gönderdiği amaca ek işaretler ekleyebilir. Özellikle FLAG_ACTIVITY_CLEAR_TOP veya FLAG_ACTIVITY_NEW_TASK ya da her ikisini birden ekleyebilir. Kodunuzun bu işaretleri işlemesi gerekmese de Android sistemi bunlara yanıt verir. Bu durum, önceki URI'nin oynatılması sırasında yeni URI'ye sahip ikinci bir oynatma isteği geldiğinde uygulamanızın davranışını etkileyebilir. Bu durumda uygulamanızın nasıl tepki verdiğini test etmek iyi bir fikirdir. Durumu simüle etmek için adb komut satırı aracını kullanabilirsiniz (sabit 0x14000000, iki işaretin boole bit tabanlı VEYA değeridir):

adb shell 'am start -a android.intent.action.VIEW --ez android.intent.extra.START_PLAYBACK true -d "<first_uri>"' -f 0x14000000
adb shell 'am start -a android.intent.action.VIEW --ez android.intent.extra.START_PLAYBACK true -d "<second_uri>"' -f 0x14000000

Bir hizmetten oynatma

Uygulamanızda Asistan'dan bağlantılara izin veren bir media browser service varsa Asistan, hizmetin media session ile iletişim kurarak uygulamayı başlatabilir. Medya tarayıcı hizmeti hiçbir zaman Etkinlik başlatmamalıdır. Asistan, setSessionActivity() ile tanımladığınız PendingIntent değerine göre Etkinliğinizi başlatır.

Medya tarayıcı hizmetini başlatırken MediaSession.Token öğesini ayarladığınızdan emin olun. Desteklenen oynatma işlemlerini başlatma sırasında da dahil olmak üzere her zaman ayarlamayı unutmayın. Asistan, ilk oynatma komutunu göndermeden önce medya uygulamanızın oynatma işlemlerini ayarlamasını bekler.

Asistan, bir hizmetten başlamak için medya tarayıcısı istemci API'lerini uygular. Uygulamanızın medya oturumunda, OYNATMA işlemi geri çağırmalarını tetikleyen TransportControls çağrılarını gerçekleştirir.

Aşağıdaki şemada, Asistan tarafından oluşturulan aramaların sırası ve ilgili medya oturumu geri aramaları gösterilmektedir. (Hazırlıklı geri çağırmalar yalnızca uygulamanız bunları destekliyorsa gönderilir.) Tüm çağrılar eşzamansızdır. Asistan, uygulamanızdan yanıt beklemez.

Oynatmaya medya oturumuyla başlama

Bir kullanıcı, çalmak için sesli komut verdiğinde Asistan kısa bir duyuruyla yanıt verir. Duyuru tamamlanır tamamlanmaz Asistan bir OYNATMA işlemi yapar. Belirli bir oynatma durumu beklemez.

Uygulamanız ACTION_PREPARE_* işlemlerini destekliyorsa Asistan, duyuruyu başlatmadan önce PREPARE işlemini çağırır.

MediaTarayıcı Hizmetine bağlanma

Asistan'ın uygulamanızı başlatmak üzere bir hizmet kullanabilmesi için uygulamanın MediaTarayıcı Hizmeti'ne bağlanabilmesi ve MediaSession.Token parametresini alabilmesi gerekir. Bağlantı istekleri, hizmetin onGetRoot() yönteminde işlenir. İstekleri ele almanın iki yolu vardır:

  • Tüm bağlantı isteklerini kabul et
  • Yalnızca Asistan uygulamasından gelen bağlantı isteklerini kabul et

Tüm bağlantı isteklerini kabul et

Asistan'ın medya oturumunuza komut göndermesine izin vermek için bir ScannerRoot döndürmeniz gerekir. En kolay yol, tüm MediaTarayıcı uygulamalarının MediaTarayıcı Hizmetinize bağlanmasına izin vermektir. Boş olmayan bir ScannerRoot döndürmeniz gerekir. Universal Music Player'dan alınmış geçerli kodu aşağıda bulabilirsiniz:

Kotlin

override fun onGetRoot(
        clientPackageName: String,
        clientUid: Int,
        rootHints: Bundle?
): BrowserRoot? {

    // To ensure you are not allowing any arbitrary app to browse your app's contents, you
    // need to check the origin:
    if (!packageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return an empty browser root.
        // If you return null, then the media browser will not be able to connect and
        // no further calls will be made to other media browsing methods.
        Log.i(TAG, "OnGetRoot: Browsing NOT ALLOWED for unknown caller. Returning empty "
                + "browser root so all apps can use MediaController. $clientPackageName")
        return MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_EMPTY_ROOT, null)
    }

    // Return browser roots for browsing...
}

Java

@Override
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,
                             Bundle rootHints) {

    // To ensure you are not allowing any arbitrary app to browse your app's contents, you
    // need to check the origin:
    if (!packageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return an empty browser root.
        // If you return null, then the media browser will not be able to connect and
        // no further calls will be made to other media browsing methods.
        LogHelper.i(TAG, "OnGetRoot: Browsing NOT ALLOWED for unknown caller. "
                + "Returning empty browser root so all apps can use MediaController."
                + clientPackageName);
        return new MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_EMPTY_ROOT, null);
    }

    // Return browser roots for browsing...
}

Asistan uygulaması paketini ve imzasını kabul edin

Paket adını ve imzasını kontrol ederek Asistan'ın medya tarayıcısı hizmetinize bağlanmasına açıkça izin verebilirsiniz. Uygulamanız, MediaTarayıcı Hizmetinizin onGetRoot yönteminde paket adını alır. Asistan'ın medya oturumunuza komut göndermesine izin vermek için bir ScannerRoot döndürmeniz gerekir. Universal Müzik Oynatıcı örneğinde, bilinen paket adlarının ve imzalarının bir listesi bulunur. Aşağıda Google Asistan tarafından kullanılan paket adları ve imzaları verilmiştir.

<signature name="Google" package="com.google.android.googlequicksearchbox">
    <key release="false">19:75:b2:f1:71:77:bc:89:a5:df:f3:1f:9e:64:a6:ca:e2:81:a5:3d:c1:d1:d5:9b:1d:14:7f:e1:c8:2a:fa:00</key>
    <key release="true">f0:fd:6c:5b:41:0f:25:cb:25:c3:b5:33:46:c8:97:2f:ae:30:f8:ee:74:11:df:91:04:80:ad:6b:2d:60:db:83</key>
</signature>

<signature name="Google Assistant on Android Automotive OS" package="com.google.android.carassistant">
    <key release="false">17:E2:81:11:06:2F:97:A8:60:79:7A:83:70:5B:F8:2C:7C:C0:29:35:56:6D:46:22:BC:4E:CF:EE:1B:EB:F8:15</key>
    <key release="true">74:B6:FB:F7:10:E8:D9:0D:44:D3:40:12:58:89:B4:23:06:A6:2C:43:79:D0:E5:A6:62:20:E3:A6:8A:BF:90:E2</key>
</signature>