אין יותר צורך לבצע את הפעולות הקוליות של המערכת בשילוב עם Assistant. מידע נוסף על גרסאות חלופיות זמין בתיעוד של פעולות באפליקציות.

אינטראקציות קוליות

אינטראקציה קולית היא סוג מיוחד של פעילות ב-Android המופעלת באמצעות הקול של המשתמש, שמאפשר גם להשלים פעולה באמצעות הקול. לעומת זאת, כוונות פעילות רגילות נועדו להתחיל פעולה, אבל להשלים אותה באמצעות אינטראקציה במגע.

לדוגמה, כוונת ה-DIAL של Android מיושמת על ידי אפליקציה של חייגן, אבל הכוונה היא לטעון מראש את מספר הטלפון רק בחייגן. המשתמש צריך לגעת בלחצן כדי להתחיל את השיחה בפועל.

מינוי אינטראקציה קולית

אפליקציות שמפעילות פעילות אינטראקציה קולית בקובץ המניפסט של Android דרך הקטגוריה android.intent.category.VOICE.

הדוגמה הבאה ממחישה איך לציין פעילות של אינטראקציה קולית:

<activity android:name="org.example.MyVoiceActivity">
  <intent-filter>
    <action android:name="org.example.MY_ACTION_INTENT" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.VOICE" />
  </intent-filter>
</activity>

הדוגמה הבאה ממחישה איך לציין את פעילות האינטראקציה הקשורה למגע:

<activity android:name="org.example.MyTouchActivity">
  <intent-filter>
    <action android:name="org.example.MY_ACTION_INTENT" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

הטיפול באינטראקציה הקולית

ברגע שהבקשה שלכם התקבלה, היא צריכה לקבוע את האינטראקציה המתאימה. מה שמתאים תלוי באופי האפליקציה: עד כמה אתם רוצים לשאול את המשתמש, עד כמה בטוח להשלים את הפעולה וכו'.

אישור באמצעות אינטראקציה קולית

לעיתים קרובות המשתמשים צריכים לאמת את הפעולה שמתרחשת בעקבות הבקשה שלהם. לדוגמה, בקשה של משתמש להזמנת מונית עשויה לכלול את כל הפרטים של הבקשה (שעה, מקום ויעד), אבל של פרטים נוספים (כמו העלות ושעת ההגעה) צריך לאמת את פרטי המשתמש.

תמונה שמופיע בה פעילות קולית

הדוגמה הבאה ממחישה איך לנהל אינטראקציה קולית עם אישור קולי:

class MyVoiceActivity extends Activity {
  class Confirm extends VoiceInteractor.ConfirmationRequest {
    public Confirm(String ttsPrompt, String visualPrompt) {
      VoiceInteractor.Prompt prompt = new VoiceInteractor.Prompt(
        new String[] {ttsPrompt}, visualPrompt);
      super(prompt, null);
    }

    @Override
    public void onConfirmationResult(
        boolean confirmed, Bundle null) {
      if (confirmed) {
        doAction();
      }
      finish();
    }
  };

  @Override
  public void onResume() {
    if (isVoiceInteraction()) {
      String ttsPrompt = getConfirmationTts();
      String visualPrompt = getConfirmationDisplayText();
      getVoiceInteractor().sendRequest(new Confirm(ttsPrompt, visualPrompt));
    } else {
      finish();
    }
  }
}

בדוגמה הזו, הפעילות מבקשת אישור כשהיא מתחילה כאינטראקציה קולית. היא בודקת קודם שזוהי פעילות קולית, על ידי קריאה ל-isVoiceInteraction(). מחלקת המשנה של VoiceInteractor.ConfirmationRequest מטפלת באישור האסינכרוני של המשתמש (אושר או נדחה), כדי לקבוע אם הפעולה צריכה להתבצע.

במקרה כזה, המשתמש יקבל את ההודעה המדוברת ויתבקש לאשר את אמירתו בקול (למשל, 'כן' או 'לא'). הפעילות תחזיר את הקריאה החוזרת (callback) המציינת את התוצאה.

בתהליך אישור ללא אישור

במקרים מסוימים, מספיק לדעת שהכוונה הגיעה מהקול של המשתמש, דבר המרמז שלא נדרש מידע נוסף כדי לאשר את הכוונה. לדוגמה, ביצוע שיחת טלפון או שליחת אימייל יכול להיות אינטראקציה סבירה לתמיכה.

הקריאה ל-isVoiceInteractionRoot() מבטיחה שהכוונה הגיעה מהקול של המשתמש. בעוד ש-isVoiceInteraction() מחזירה את הערך True גם אם פעילות האינטראקציה הקולית של אפליקציה אחרת מפעילה את הפעילות הקולית ללא כוונה כלשהי של המשתמש, isVoiceInteractionRoot() מחזירה את הערך true רק אם הפעילות בוצעה ישירות על ידי הפעולה הקולית של משתמש באפליקציית חיפוש Google.

הדוגמה הבאה ממחישה כיצד ניתן לטפל באינטראקציה קולית ללא אישור:

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteractionRoot()) {
         // Interaction started by the users voice
        doAction();
    }
    finish();
  }
}

אם הפעילות שבוצעה היא לא פעילות קולית, יש להשלים אותה באמצעות מגע. אינטראקציות קוליות צריכות תמיד &לענות&מענה; כדי לגעת בתקשורת במידת הצורך.

סיום האינטראקציה הקולית

אחרי שהאפליקציה תשאל את המשתמש, היא אמורה להתקשר אל finish() כדי לסגור את תיבת הדו-שיח. אחרת, לוחית הדו-שיח הרטובה תמשיך להופיע בתחתית המסך, והיא תופסת שטח מסך ומבלבל את המשתמשים.

אם רוצים לשמור על פעילות של משתמשים, אפשר להתחיל פעילות רגילה חדשה ולסיים את האינטראקציה הקולית. התחילו את הפעילות שלכם באמצעות הסימון Intent.FLAG_ACTIVITY_NEW_TASK כדי לצאת ממשימת האינטראקציה הקולית.

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteractionRoot()) {
        doAction();
    }

    // Start my main non-voice Activity
    Intent intent = new Intent(this, MyMainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    finish();
  }
}

מתבצעת שליחה של סטטוס ההשלמה

כדי שהסטטוס של אינטראקציה קולית יהיה חשוב, המשתמשים צריכים לבצע פעולה חיונית. לדוגמה:

  • חלק מהפעולות עשויות להיות זמינות למשתמש לשימוש עתידי – לדוגמה, פרטי ההזמנה של הזמנה במסעדה עשויים להיות זמינים באופן אוטומטי ככרטיס תזכורת ב-Google Now, או מהשאילתה [ההזמנות שלי].
  • הפעילויות יכולות לבחור להחזיר URI של הקשר (למשל URI של ספק תוכן במכשיר או קישור עומק לכתובת URL באינטרנט), המציין הפניה לתוצאה של הפעולה. מידע זה מאפשר לאפליקציות לזהות מתי פעולה מסוימת היא &ציטוט; לעקוב אחר" כדי לבצע פעולה קודמת (למשל, ביטול ההתראה שהוגדרה עכשיו / שיתוף התמונה שצולמה כרגע)
  • מציין מתי לא ניתן להשלים את הפעולה. חלק קריטי בבניית אמון המשתמשים במערכת הוא טיפול בשגיאות או המגבלות של אינטראקציה קולית בצורה אחראית. לדוגמה, ייתכן שאי אפשר לבצע את התהליך באמצעות כניסה לחשבון או להזין כרטיס אשראי. ההקפדה על כך חשובה במיוחד בטיפול בעיניים ללא תחושת בסביבה של כלי רכב.

הדוגמה הבאה מראה איך לדווח על סטטוס השלמת אינטראקציה:

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteraction()) {
      Bundle status = new Bundle();
      VoiceInteractor.Request request = null;

      if (doAction(status)) {
        request = new VoiceInteractor.CompleteVoiceRequest(
            "Success", status);
      } else {
        request = new VoiceInteractor.AbortVoiceRequest(
            "Too Complex", status);
      }
      getVoiceInteractor().sendRequest(request);
    }
    finish();
  }
}

אינטראקציה מרובה מצבים

משתמשים משלבים לעיתים קרובות אינטראקציה עם קול ומגע כשהם משלימים פעולה ממגוון סיבות (למשל, בעיות בזיהוי דיבור, בחירה מתוך רשימה של אפשרויות רבות וכו') ולכן חשוב לתמוך בשני שיטות האינטראקציה.

בפעילות הקולית יש לטפל בממשק מגע מינימלי בזמן אינטראקציה באמצעות קול. דברים שכדאי לזכור:

  • יש להציג רק את הפקדים הנדרשים להשלמת האינטראקציה הנוכחית. החלק של תצוגת המגע הזמין לתצוגת הפעילויות עשוי להצטמצם כדי להציג את סרגל האינטראקציות הקוליות. אין להציג אפליקציות בסרגל האפליקציות.
  • אם משתמש מקיים אינטראקציה באמצעות מגע בזמן שאינטראקציה קולית בהמתנה כרגע (למשל, המשתמש מאשר על ידי לחיצה על לחצן במקום על ידי קול), יש להתקשר ל-VoiceInteractor.Request.cancel כדי להפסיק את האינטראקציה הקולית.
  • לאחר שהמשתמש עובר לאינטראקציה במגע, עליו להמשיך באינטראקציה באמצעות מגע.