يقدّم نظام التشغيل Android 6.0 Marshmallow طريقة جديدة للمستخدمين للتفاعل مع التطبيقات من خلال تطبيقات المساعِد، مثل مساعد Google. المساعد هو نافذة من المستوى الأعلى يمكن للمستخدمين عرضها للحصول على إجراءات ذات صلة بالسياق لنشاطك الحالي. وقد تتضمّن هذه الإجراءات روابط لصفحات في تطبيقات أخرى على الجهاز.
فعِّل المستخدمون المساعد من خلال الضغط مع الاستمرار على زر الشاشة الرئيسية أو من خلال قول عبارة رئيسية. استجابةً لذلك، يفتح النظام نافذة من المستوى الأعلى تعرض الإجراءات ذات الصلة بالسياق.
ينفّذ تطبيق مساعد، مثل "مساعد Google"، نافذة المساعد المركّب من خلال ميزة تُعرف باسم Now on Tap، وتعمل مع الوظائف على مستوى نظام Android الأساسي. ويسمح النظام للمستخدم باختيار تطبيق مساعد يحصل على معلومات سياقية من تطبيقك باستخدام واجهة برمجة التطبيقات Assist API على نظام التشغيل Android.
يوضّح هذا الدليل كيفية استخدام تطبيقات Android لواجهة برمجة التطبيقات Assist API لتحسين تجربة مستخدمي المساعِد. للتعرّف على كيفية إنشاء تطبيق وسائط ليتمكّن "مساعد Google" من تشغيله والتحكّم فيه، اطّلِع على مقالة "مساعد Google" وتطبيقات الوسائط.
استخدام "مساعد Google"
يوضِّح الشكل 1 تفاعل مستخدم نموذجي مع المساعد. عندما يضغط المستخدم مع الاستمرار على زر الصفحة الرئيسية، يتم استدعاء عمليات استدعاء واجهة برمجة التطبيقات Assist API في التطبيق المصدر (الخطوة 1). يعرض المساعد نافذة التراكب (الخطوتان 2 و3)، ثم يختار المستخدم الإجراء المطلوب تنفيذه. ينفِّذ المساعد الإجراء المحدّد، مثل بدء طلب باستخدام رابط لصفحة في تطبيق المطعم (الوجهة) (الخطوة 4).
يمكن للمستخدمين ضبط المساعد من خلال اختيار الإعدادات > التطبيقات > التطبيقات التلقائية > المساعد والإدخال الصوتي. ويمكن للمستخدمين تغيير خيارات النظام، مثل الوصول إلى محتوى الشاشة كنص والوصول إلى لقطة شاشة، كما هو موضّح في الشكل 2.
التطبيق المصدر
للتأكّد من أنّ تطبيقك يعمل مع "مساعد Google" كمصدر للمعلومات للمستخدم، تحتاج فقط إلى اتّباع أفضل ممارسات تسهيل الاستخدام. يصف هذا القسم كيفية تقديم معلومات إضافية للمساعدة في تحسين تجربة المستخدم مع "مساعد Google"، بالإضافة إلى السيناريوهات التي تتطلّب معالجة خاصة، مثل "العروض" المخصّصة.
مشاركة معلومات إضافية مع المساعد
بالإضافة إلى النص ولقطة الشاشة، يمكن لتطبيقك مشاركة معلومات أخرى مع المساعد. على سبيل المثال، يمكن لتطبيق الموسيقى اختيار إرسال معلومات الألبوم الحالية ليتمكّن "مساعد Google" من اقتراح إجراءات أكثر ذكاءً مخصّصة للنشاط الحالي. وتجدُر الإشارة إلى أنّ "واجهات برمجة تطبيقات المساعدة" لا توفّر عناصر تحكّم في الوسائط. لإضافة عناصر التحكّم في الوسائط، يُرجى الاطّلاع على "مساعد Google" وتطبيقات الوسائط.
ولتوفير معلومات إضافية للمساعد، يوفّر تطبيقك سياقًا عامًا للتطبيق من خلال تسجيل أداة استماع للتطبيق ويوفر معلومات خاصة بالنشاط باستخدام عمليات معاودة الاتصال بالنشاط كما هو موضّح في الشكل 3:
لتوفير سياق التطبيق العام، ينشئ التطبيق عملية تنفيذ لمحاولة
Application.OnProvideAssistDataListener
ويُسجّلها
باستخدام registerOnProvideAssistDataListener()
.
لتوفير معلومات سياقية خاصة بالنشاط، تلغي السمة activity
السمتَين onProvideAssistData()
وonProvideAssistContent()
.
يتم استدعاء طريقتَي النشاط بعد استدعاء الدالة الاختيارية لردّ الاتصال العميق. وبما أنّ وظائف الاستدعاء يتم تنفيذها في سلسلة التعليمات الرئيسية، من المفترض أن تتم على الفور.
لا يتمّ استدعاء وظائف الاستدعاء إلا عندما يكون النشاط قيد التشغيل.
توفير السياق
عندما يشغِّل المستخدم المساعد، يتم استدعاء onProvideAssistData()
لإنشاء ACTION_ASSIST
ACTION_ASSIST
كامل مع جميع سياق
التطبيق الحالي الذي يتم تمثيله على أنّه مثيل AssistStructure
. يمكنك إلغاء هذه الطريقة لوضع أي عنصر تريده في الحزمة ليتم عرضه في الجزء EXTRA_ASSIST_CONTEXT
من هدف المساعدة.
وصف المحتوى
يمكن لتطبيقك تنفيذ onProvideAssistContent()
لتحسين تجربة المستخدم في "مساعد Google" من خلال توفير مراجع ذات صلة بالمحتوى
ذات صلة بالنشاط الحالي. يمكنك وصف محتوى التطبيق باستخدام
المفردات الشائعة المحدّدة في Schema.org
من خلال كائن JSON-LD. في المثال أدناه، يقدّم تطبيق موسيقى
بيانات منظَّمة لوصف الألبوم الموسيقي الذي يشاهده المستخدم حاليًا:
Kotlin
override fun onProvideAssistContent(assistContent: AssistContent) { super.onProvideAssistContent(assistContent) val structuredJson: String = JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString() assistContent.structuredData = structuredJson }
Java
@Override public void onProvideAssistContent(AssistContent assistContent) { super.onProvideAssistContent(assistContent); String structuredJson = new JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString(); assistContent.setStructuredData(structuredJson); }
يمكنك أيضًا تحسين تجربة المستخدم من خلال عمليات التنفيذ المخصّصة للسمة
onProvideAssistContent()
،
والتي يمكن أن توفّر لك المزايا التالية:
- يتم تعديل الغرض من المحتوى المقدَّم ليعكس بشكل أفضل سياق المستوى الأعلى للنشاط.
- توفّر معرّف الموارد المنتظم (URI) للمحتوى المعروض.
- يتم ملء
setClipData()
بمحتوى إضافي يهمّ المستخدم ويشاهده حاليًا.
ملاحظة: من المحتمل أن تحتاج التطبيقات التي تستخدم عملية تنفيذ مخصّصة لاختيار النص إلى
تنفيذ onProvideAssistContent()
واستدعاء setClipData()
.
التنفيذ التلقائي
في حال عدم تنفيذ onProvideAssistData()
أو onProvideAssistContent()
عملية معاودة الاتصال، يواصل النظام العمل ويرسل
المعلومات التي تم جمعها تلقائيًا إلى المساعد ما لم يتم وضع علامة على النافذة
الحالية على أنّها آمنة.
كما هو موضّح في الشكل 3، يستخدم النظام التنفيذ التلقائي لعنصرَي onProvideStructure()
وonProvideVirtualStructure()
للقيام بما يلي:
جمع النصوص ومعلومات التسلسل الهرمي للعرض إذا نفّذت طريقة العرض رسمًا نصيًا مخصّصًا، يمكنك إلغاء onProvideStructure()
لتزويد "مساعد Google" بالنص المعروض للمستخدم من خلال استدعاء setText(CharSequence)
.
وفي معظم الحالات، يؤدي تنفيذ دعم تسهيل الاستخدام إلى السماح للمساعد بالحصول على المعلومات التي يحتاج إليها. لإتاحة إمكانية الوصول، يُرجى اتّباع أفضل الممارسات الموضحة في مقالة إتاحة إمكانية الوصول إلى التطبيقات، بما في ذلك ما يلي:
- أدخِل سمات
android:contentDescription
. - تعبئة
AccessibilityNodeInfo
لطرق العرض المخصّصة - عليك
التأكّد من أنّ كائنات
ViewGroup
المخصّصة تعرض عناصرها الثانوية بشكل صحيح.
استبعاد المشاهدات من المساعدين
لمعالجة المعلومات الحسّاسة، يمكن لتطبيقك استبعاد العرض الحالي من المساعد
من خلال ضبط مَعلمة FLAG_SECURE
لتنسيق WindowManager
. يجب ضبط FLAG_SECURE
صراحةً لكل FLAG_SECURE
نافذة أنشأها النشاط، بما في ذلك مربّعات الحوار. يمكن لتطبيقك أيضًا استخدام
setSecure()
لاستبعاد
سطح من "مساعد Google". لا تتوفّر
آلية شاملة (على مستوى التطبيق) لاستبعاد جميع المشاهدات من "مساعد Google". يُرجى العلم أنّ FLAG_SECURE
لا يتسبّب في إيقاف تنشيط استدعاءات واجهة برمجة التطبيقات Assist API. وسيظل بإمكان النشاط الذي يستخدم FLAG_SECURE
تقديم معلومات بشكل واضح إلى أحد تطبيقات المساعد باستخدام عمليات الاستدعاء الموضّحة سابقًا في هذا الدليل.
ملاحظة: بالنسبة إلى حسابات المؤسسات (Android for Work)، يمكن للمشرف إيقاف جمع بيانات المساعد للملف الشخصي للعمل باستخدام طريقة setScreenCaptureDisabled()
من واجهة برمجة تطبيقات DevicePolicyManager
.
التفاعلات الصوتية
يتم أيضًا استدعاء استدعاءات واجهة برمجة التطبيقات Assist عند اكتشاف العبارة الرئيسية. ولمزيد من المعلومات، يُرجى الاطّلاع على مستندات الإجراءات الصوتية.
اعتبارات الترتيب Z
يستخدم أحد المساعدين نافذة مركّبة خفيفة يتم عرضها أعلى النشاط الحالي. بما أنّ المستخدم يمكنه تفعيل المساعد في أي وقت، لا تنشئ نوافذ تنبيهات نظام دائمة تتداخل مع نافذة التراكب، كما هو موضّح في الشكل 4.
إذا كان تطبيقك يستخدم نوافذ تنبيه النظام، يجب إزالتها على الفور لأن تركها على الشاشة يؤدي إلى خفض مستوى تجربة المستخدم.
تطبيق الوجهة
تستفيد تطبيقات "مساعد Google" عادةً من الربط بصفحة معيّنة للعثور على التطبيقات الوجهة. لجعل تطبيقك وجهة محتملة، ننصحك بإضافة دعم الربط بصفحة معيّنة. فالمطابقة بين سياق المستخدم الحالي والروابط لصفحات في التطبيق أو الإجراءات المحتملة الأخرى التي يتم عرضها في نافذة التراكب (الموضّحة في الخطوة 3 في الشكل 1) خاصة بعملية تنفيذ "مساعد Google". على سبيل المثال، يستخدم تطبيق "مساعد Google" ميزة الربط بصفحة معيّنة وروابط التطبيقات بهدف جذب الزيارات إلى التطبيقات المقصودة.
تنفيذ "مساعد Google" الخاص بك
وقد تحتاج إلى استخدام مساعدك الخاص. كما هو موضح في الشكل 2، يمكن للمستخدم اختيار تطبيق المساعد النشط. ويجب أن يوفر تطبيق المساعد تنفيذًا للسمتَين VoiceInteractionSessionService
وVoiceInteractionSession
على النحو الموضّح في
مثال VoiceInteraction
هذا. ويتطلب التطبيق أيضًا الحصول على إذن BIND_VOICE_INTERACTION
. يمكن للمساعد بعد ذلك
تلقّي النص وعرض التسلسل الهرمي الذي يمثّله مثيل AssistStructure
في onHandleAssist()
.
يتلقّى لقطة الشاشة من خلال onHandleScreenshot()
.