Sesli yardım Dokundur ve Oku

Android Automotive, sesin Google'ın sahip olduğu güvenli etkileşimlerdir ve kullanıcıların bunları gerçekleştirmesini Android Automotive OS ile etkileşime girmesini sağlar. Sonuç olarak, Android sesli asistan API'leri (VoiceInteractionSession dahil) sesli asistanların kullanıcılar için görevleri yerine getirmesini sağlamak araç sürerken başarılması zor olabiliyor.

Dokun ve Oku özelliği, sesli asistanların kısa mesajları açık olarak okumasına ve yanıtlamasına olanak tanır. Kullanıcı, mesaj bildirimleriyle etkileşimde bulunduğunda temsil eder. Bu hesabın entegre edebildiğiniz için sesli asistanı CarVoiceInteractionSession

Otomotiv'de Bildirim Merkezi'nde yayınlanan bildirimler tespit edildi INBOX olarak veya INBOX_IN_GROUP (örneğin, SMS mesajları) bir Oyna düğmesi. Kullanıcı, seçilen öğeyi etkinleştirmek için Oyna'yı tıklayabilir. sesli asistan, bildirimi sesli okur ve isteğe bağlı olarak sesli yanıt verir.

Okumak için dokunma bildirimi

Şekil 1. Oynat düğmesi bulunan Dokundur ve Oku bildirimi.

CarVoiceEngagementSession ile entegrasyon

Sonraki bölümlerde, bir sesli asistanın CarVoiceInteractionSession

Sesli etkileşimleri destekleyin

Araç sesli etkileşim hizmetleri sağlayan uygulamalar zorunludur Android'in mevcut sesli etkileşimlerine entegre edebiliyoruz. Daha fazla bilgiyi Android için Google Asistan bölümünde bulabilirsiniz. (VoiceInteractionSession hariç). Tüm sesli etkileşim API'si öğeler, mobil cihazlarda uygulananlarla aynı kalır; CarVoiceInteractionSession (Implement CarVoiceEngagementSession bölümünde açıklanmıştır) VoiceInteractionSession. Daha fazla bilgi için şu sayfalara bakın:

CarVoiceEngagementSession'ı uygulama

CarVoiceInteractionSession. sesli yardımların kısa mesajları sesli olarak okumasını etkinleştirmek için kullanabileceğiniz API'leri görüntüler ve ardından e-postalara kullanıcı adına yanıt verme.

CarVoiceInteractionSession ve arasındaki temel fark VoiceInteractionSession sınıf CarVoiceInteractionSession onShow oyununda pas kazandı Böylece sesli asistan, kullanıcının isteğinin bağlamını anında algılayabilir CarVoiceInteractionSession bir oturum başlatır. onShow için parametreler aşağıdaki tabloda listelenmiştir:

ArabaylaSes EtkileşimiOturumu SesliEtkileşimOturumu
onShow, şu üç parametreyi alır:
  • args
  • showFlags
  • actions
onShow, şu iki parametreyi alır:
  • args
  • showFlags

Android 10'daki değişiklikler

Android 10'dan itibaren platformda VoiceInteractionService.onGetSupportedVoiceActions çağrılıyor desteklenen işlemleri tespit etmek için kullanır. Sesli asistan VoiceInteractionService.onGetSupportedVoiceActions, aşağıdaki örnekte gösterildiği gibi:

public class MyInteractionService extends VoiceInteractionService {
    private static final List SUPPORTED_VOICE_ACTIONS = Arrays.asList(
        CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION);

    @Override
    public Set onGetSupportedVoiceActions(@NonNull Set voiceActions) {
       Set result = new HashSet<>(voiceActions);
       result.retainAll(SUPPORTED_VOICE_ACTIONS);
       return result;
   }
}

Geçerli işlemler aşağıdaki tabloda açıklanmıştır. Her işlemle ilgili ayrıntılar için bkz. Sıra diyagramları.

İşlem Beklenen yük Beklenen sesli etkileşim işlemi
VOICE_ACTION_READ_NOTIFICATION Mesajları kullanıcıya sesli olarak okuyun ve ardından Okundu Olarak İşaretle seçeneğini tetikleyin niyetlerini geri alamazsınız. İsteğe bağlı olarak, yanıt vermesi gerekir.
VOICE_ACTION_REPLY_NOTIFICATION Anahtarla birlikte ayrıştırılabilir.
. KEY_NOTIFICATION StatusBarNotification ile eşleşen.
. android.permission.BIND_NOTIFICATION_LISTENER_SERVICE gerektirir.
Kullanıcıdan yanıt mesajını belirtmesini isteyin, yanıt mesajını şuraya girin: RemoteInputReply ve ardından beklemedeki niyete göre belirleniyor.
VOICE_ACTION_HANDLE_EXCEPTION Anahtarlı dize.
. KEY_EXCEPTION ExceptionValue ile eşleşen (İstisna değerleri bölümünde açıklanmıştır).
. Boole değeriyle eşlenen KEY_FALLBACK_ASSISTANT_ENABLED. Değer true, kullanıcının isteğini işleyebilecek yedek asistan devre dışı bırakıldı.
İstisna için yapılması beklenen işlem diğer dokümanlara göz atın.

İstisna değerleri

EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING. sesli asistana Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE izninin olmadığını ve kullanıcıdan bu iznin alınması gerektiğini belirtir.

Bildirim dinleyici izni isteme

Varsayılan sesli asistanda bildirim dinleyici yoksa platformun FallbackAssistant (araba üreticisi tarafından etkinleştirildiyse), sesli asistan devre dışı bırakılmadan önce mesajı sesli okuyabilir. bildirimi gönderilir. FallbackAssistant hizmetinin etkin olup olmadığını ve mesajı okuduysa, sesli asistanın mesajı kontrol etmesi Yükteki boole değeri: KEY_FALLBACK_ASSISTANT_ENABLED.

Platform, sesli asistana şunun için hız sınırlama mantığı eklemesini öneriyor: bu iznin istenme sayısı. Böylece, bunu yapmayan kullanıcılara sesli asistana bu izni vermek istiyor ve Kısa mesajları sesli okumak için FallbackAssistant. Bir kullanıcı bir mesaj bildiriminde Oynat'a her bastığında izin almak için kullanıcı olumsuz bir kullanıcı deneyimine yol açabilir. Platformda oran sınırı uygulanmamalıdır. sesli asistan adına yapabilirsiniz.

Bildirim dinleyici izni istenirken sesli asistan Kullanıcının park halinde mi yoksa araçla mı gittiğini belirlemek için CarUxRestrictionsManager kullanın. Kullanıcı araba kullanıyorsa sesli asistan iznin nasıl verileceğine ilişkin talimatları içeren bir bildirim görüntüler. İşlem devam ediyor daha güvenli olduğunda izin vermesine yardımcı olur (ve bunu hatırlatır).

StatusBarBildirim ile çalışma

StatusBarNotification, Okuma ve Yanıtlama ödeviyle teslim edildi sesli işlemler her zaman açıklandığı gibi araba ile uyumlu mesajlaşma bildiriminde bulunur Bildir ileti kullanıcıları. Bazı bildirimlerde Yanıt Beklemede Okundu olarak işaretle bekleyen amaçları var.

Bildirimlerle etkileşimleri kolaylaştırmak için NotificationPayloadHandler, Bu sekme, bildirimden iletileri ayıklama ve mesajları bildirimin beklemedeki uygun amacına göre yanıtlamalıdır. sesli asistan mesajı okur, sesli asistanın İşaretçiyi tetiklemesi gerekir okuma amacı olarak ayarlanır.

Dokundur ve Okuyun ön koşullarını yerine getirin

Varsayılan sesin yalnızca VoiceInteractionSession kadarı kullanıcı, sesli işlemi tetiklediğinde Asistan'a bildirim gönderilir. mesajları yanıtlayabilir. Yukarıda belirtildiği gibi bu varsayılan sesli asistan ayrıca bildirim dinleyici iznine sahip olmanız gerekir.

Dizi diyagramları

Bu şekiller CarVoiceInteractionSession actions mantıksal akışlarını gösterir:

VOICE_ACTION_READ_BİLDİRİM

Şekil 2. VOICE_ACTION_READ_Bildirim için sıra şeması.

Şekil 3'te, izin isteklerinde oran sınırlarının uygulanması önerilir:

SESLİ_İŞLEM_REPLY_BİLDİRİM

Şekil 3. VOICE_ACTION_REPLY_Bildirim için sıra şeması.

SES_İŞLEMİ_EL_İSTİSNASI

4.Şekil VOICE_ACTION_HANDLE_EXCEPTION için sıra şeması.

Uygulamanın adını okuma

Mesajlaşma sırasında sesli asistanınızın mesajlaşma uygulamasının adını sesli okumasını mesaj okuması (örneğin, "Hangouts'tan Sammy şunu dedi:") aşağıdakine benzer bir işlev oluşturun: aşağıdaki kod örneğinde, asistanın doğru adı okuduğundan emin olun:

@Nullable
String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) {
    ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName());
    if (info == null) return null;

    Notification notification = statusBarNotification.getNotification();

    // Sometimes system packages will post on behalf of other apps, so check this
    // field for a system app notification.
    if (isSystemApp(info)
            && notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) {
        return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME);
    } else {
        PackageManager pm = context.getPackageManager();
        return String.valueOf(pm.getApplicationLabel(info));
    }
}

@Nullable
ApplicationInfo getApplicationInfo(Context context, String packageName) {
    final PackageManager pm = context.getPackageManager();
    ApplicationInfo info;
    try {
        info = pm.getApplicationInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
        return null;
    }
    return info;
}

boolean isSystemApp(ApplicationInfo info) {
    return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}