ভয়েস সহকারী ট্যাপ-টু-রিড

অ্যান্ড্রয়েড অটোমোটিভ ভয়েসকে ড্রাইভ-নিরাপদ ইন্টারঅ্যাকশনের জন্য একটি গুরুত্বপূর্ণ উপাদান হিসেবে বিবেচনা করে এবং ড্রাইভ করার সময় ব্যবহারকারীদের Android অটোমোটিভ ওএস-এর সাথে ইন্টারঅ্যাক্ট করার সবচেয়ে নিরাপদ উপায়গুলির মধ্যে একটি। ফলস্বরূপ, আমরা অ্যান্ড্রয়েড ভয়েস অ্যাসিস্ট্যান্ট API গুলিকে প্রসারিত করেছি ( VoiceInteractionSession সহ) ব্যবহারকারীদের জন্য এমন কাজগুলি সম্পাদন করতে যা ড্রাইভিং করার সময় সম্পন্ন করা কঠিন হতে পারে৷

ট্যাপ-টু-রিড ভয়েস সহকারীকে ব্যবহারকারীর পক্ষ থেকে পাঠ্য বার্তা পড়তে এবং উত্তর দিতে সক্ষম করে, যখন ব্যবহারকারী বার্তা বিজ্ঞপ্তিগুলির সাথে যোগাযোগ করে। এই কার্যকারিতা প্রদান করতে, আপনি একটি ভয়েস সহকারীকে CarVoiceInteractionSession এর সাথে সংহত করতে পারেন।

স্বয়ংচালিত ক্ষেত্রে, INBOX বা INBOX_IN_GROUP হিসাবে চিহ্নিত বিজ্ঞপ্তি কেন্দ্রে পোস্ট করা বিজ্ঞপ্তিগুলি (উদাহরণস্বরূপ, এসএমএস বার্তা) একটি প্লে বোতাম অন্তর্ভুক্ত করে। ব্যবহারকারী নির্বাচিত ভয়েস সহকারীকে উচ্চস্বরে বিজ্ঞপ্তি পড়তে এবং ঐচ্ছিকভাবে ভয়েসের মাধ্যমে উত্তর দিতে প্লে ক্লিক করতে পারেন।

বিজ্ঞপ্তি পড়তে ট্যাপ করুন

চিত্র 1. প্লে বোতাম সহ ট্যাপ-টু-রিড বিজ্ঞপ্তি।

CarVoiceInteractionSession এর সাথে একীভূত করুন

পরবর্তী বিভাগগুলি বর্ণনা করে কিভাবে একটি ভয়েস সহকারীকে CarVoiceInteractionSession এর সাথে একীভূত করতে হয়।

ভয়েস মিথস্ক্রিয়া সমর্থন

যে অ্যাপগুলি গাড়ির ভয়েস ইন্টারঅ্যাকশন পরিষেবা প্রদান করে তাদের অবশ্যই বিদ্যমান Android ভয়েস ইন্টারঅ্যাকশনের সাথে একত্রিত হতে হবে। আরও জানতে, অ্যান্ড্রয়েডের জন্য Google সহকারী দেখুন ( VoiceInteractionSession বাদে)। যদিও সমস্ত ভয়েস ইন্টারঅ্যাকশন এপিআই উপাদানগুলি মোবাইল ডিভাইসে প্রয়োগের মতো একই থাকে, CarVoiceInteractionSession ( কারভয়েস ইন্টারঅ্যাকশন সেশন বাস্তবায়নে বর্ণিত) VoiceInteractionSession প্রতিস্থাপন করে। আরও তথ্যের জন্য, এই পৃষ্ঠাগুলি দেখুন:

CarVoice InteractionSession প্রয়োগ করুন

CarVoiceInteractionSession APIগুলিকে প্রকাশ করে যা আপনি ভয়েস সহকারীকে জোরে জোরে পাঠ্য বার্তা পড়তে এবং তারপর ব্যবহারকারীর পক্ষে এই বার্তাগুলির উত্তর দিতে সক্ষম করতে ব্যবহার করতে পারেন৷

CarVoiceInteractionSession এবং VoiceInteractionSession ক্লাসের মধ্যে মূল পার্থক্য হল যে CarVoiceInteractionSession onShow অ্যাকশনে পাস করে যাতে ভয়েস সহকারী CarVoiceInteractionSession একটি সেশন শুরু করার সাথে সাথে ব্যবহারকারীর অনুরোধের প্রেক্ষাপট সনাক্ত করতে পারে। প্রতিটি ক্লাসের জন্য onShow পরামিতিগুলি নিম্নলিখিত টেবিলে তালিকাভুক্ত করা হয়েছে:

CarVoice ইন্টারঅ্যাকশন সেশন ভয়েস ইন্টারঅ্যাকশন সেশন
onShow এই তিনটি পরামিতি নেয়:
  • args
  • showFlags
  • actions
onShow এই দুটি পরামিতি নেয়:
  • args
  • showFlags

Android 10 এ পরিবর্তন

Android 10 দিয়ে শুরু করে, কোন ক্রিয়াগুলি সমর্থিত তা সনাক্ত করতে প্ল্যাটফর্মটি VoiceInteractionService.onGetSupportedVoiceActions কল করে৷ ভয়েস সহকারী VoiceInteractionService.onGetSupportedVoiceActions ওভাররাইড করে এবং প্রয়োগ করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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;
   }
}

নিম্নলিখিত সারণীতে বৈধ কর্মগুলি বর্ণনা করা হয়েছে। প্রতিটি ক্রিয়া সম্পর্কে বিস্তারিত জানার জন্য, সিকোয়েন্স ডায়াগ্রাম দেখুন।

অ্যাকশন প্রত্যাশিত পেলোড প্রত্যাশিত ভয়েস ইন্টারঅ্যাকশন অ্যাকশন
VOICE_ACTION_READ_NOTIFICATION ব্যবহারকারীর কাছে উচ্চস্বরে বার্তাগুলি পড়ুন এবং তারপর বার্তাগুলি সফলভাবে পড়া হয়ে গেলে মুলতুবি থাকা অভিপ্রায়কে পঠিত হিসাবে চিহ্নিত করুন৷ ঐচ্ছিকভাবে, একটি উত্তরের জন্য ব্যবহারকারীকে অনুরোধ করুন।
VOICE_ACTION_REPLY_NOTIFICATION চাবি দিয়ে পারসেলযোগ্য।
KEY_NOTIFICATION যা StatusBarNotification ম্যাপ করে।
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE প্রয়োজন।
ব্যবহারকারীকে উত্তর বার্তাটি বলার জন্য অনুরোধ করুন, মুলতুবি থাকা অভিপ্রায়ের RemoteInputReply এ উত্তর বার্তাটি ইনপুট করুন এবং তারপরে মুলতুবি অভিপ্রায়টি ফায়ার করুন৷
VOICE_ACTION_HANDLE_EXCEPTION কী দিয়ে স্ট্রিং।
KEY_EXCEPTION যা ExceptionValue এর মানচিত্র ( ব্যতিক্রম মানগুলিতে বর্ণিত)।
KEY_FALLBACK_ASSISTANT_ENABLED যা একটি বুলিয়ান মান মানচিত্র করে। মান true হলে, ব্যবহারকারীর অনুরোধ পরিচালনা করতে পারে এমন ফলব্যাক সহকারী অক্ষম করা হয়েছে।
ব্যতিক্রমের জন্য প্রত্যাশিত পদক্ষেপটি ব্যতিক্রমের জন্য ডকুমেন্টেশনে সংজ্ঞায়িত করা হয়েছে।

ব্যতিক্রম মান

EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING ভয়েস সহকারীকে নির্দেশ করে যে এটি Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE অনুমতি হারিয়েছে এবং ব্যবহারকারীর কাছ থেকে এই অনুমতিটি পেতে।

বিজ্ঞপ্তি শ্রোতা অনুমতি অনুরোধ

যদি ডিফল্ট ভয়েস সহকারীর বিজ্ঞপ্তি শ্রোতার অনুমতি না থাকে, তাহলে প্ল্যাটফর্মের FallbackAssistant (যদি গাড়ি প্রস্তুতকারক দ্বারা সক্ষম করা থাকে) ভয়েস সহকারীকে অনুমতির অনুরোধ জানানোর আগে উচ্চস্বরে বার্তাটি পড়তে পারে। FallbackAssistant সক্ষম আছে কিনা তা নির্ধারণ করতে এবং বার্তাটি পড়েছে কিনা, ভয়েস সহকারীকে পেলোডে KEY_FALLBACK_ASSISTANT_ENABLED বুলিয়ান মান পরীক্ষা করা উচিত।

প্ল্যাটফর্মটি সুপারিশ করে যে ভয়েস সহকারীকে এই অনুমতিটি যতবার অনুরোধ করা হয়েছে তার জন্য হার-সীমিত যুক্তি যুক্ত করুন। এটি করা ব্যবহারকারীকে সম্মান করে যিনি ভয়েস সহকারীকে এই অনুমতি দিতে চান না এবং FallbackAssistant উচ্চস্বরে পাঠ্য বার্তা পড়তে পছন্দ করেন। ব্যবহারকারী যখনই একটি বার্তা বিজ্ঞপ্তিতে প্লে টিপুন তখন ব্যবহারকারীকে অনুমতির জন্য অনুরোধ করা একটি নেতিবাচক ব্যবহারকারীর অভিজ্ঞতা হতে পারে। প্ল্যাটফর্ম ভয়েস সহকারীর পক্ষে হারের সীমা আরোপ করে না।

বিজ্ঞপ্তি শ্রোতার অনুমতির অনুরোধ করার সময়, ভয়েস সহকারীকে CarUxRestrictionsManager ব্যবহার করা উচিত তা নির্ণয় করার জন্য যে ব্যবহারকারী পার্ক করে আছেন বা গাড়ি চালাচ্ছেন কিনা। ব্যবহারকারী যদি গাড়ি চালায়, ভয়েস সহকারী একটি বিজ্ঞপ্তি প্রদর্শন করে যা অনুমতি দেওয়ার নির্দেশাবলী প্রদান করে। এটি করা ব্যবহারকারীকে অনুমতি দিতে সাহায্য করে (এবং স্মরণ করিয়ে দেয়) যখন এটি নিরাপদ হয়।

StatusBarNotification নিয়ে কাজ করুন

পড়ুন এবং উত্তর দিন ভয়েস অ্যাকশনগুলির সাথে পাস করা StatusBarNotification সর্বদা একটি গাড়ী-সামঞ্জস্যপূর্ণ বার্তাপ্রেরণ বিজ্ঞপ্তিতে থাকে যেমনটি বার্তা ব্যবহারকারীদের বিজ্ঞপ্তিতে বর্ণিত। যদিও কিছু বিজ্ঞপ্তির উত্তর মুলতুবি থাকা অভিপ্রায় নাও থাকতে পারে, সেগুলির সকলেই মুলতুবি থাকা অভিপ্রায়গুলিকে পঠিত হিসাবে চিহ্নিত করা আছে৷

বিজ্ঞপ্তিগুলির সাথে ইন্টারঅ্যাকশনগুলিকে স্ট্রীমলাইন করতে, NotificationPayloadHandler ব্যবহার করুন, যা বিজ্ঞপ্তি থেকে বার্তাগুলি বের করার পদ্ধতি প্রদান করে এবং বিজ্ঞপ্তির উপযুক্ত মুলতুবি থাকা অভিপ্রায়ে উত্তর বার্তাগুলি লিখতে পারে৷ ভয়েস অ্যাসিস্ট্যান্ট মেসেজ পড়ার পর, ভয়েস অ্যাসিস্ট্যান্টকে অবশ্যই রিড ইনটেন্ট হিসেবে মার্ক বাদ দিতে হবে।

ট্যাপ-টু-রিড পূর্বশর্তগুলি সন্তুষ্ট করুন

শুধুমাত্র ডিফল্ট ভয়েস সহকারীর VoiceInteractionSession অবহিত করা হয় যখন একজন ব্যবহারকারী বার্তা পড়তে এবং উত্তর দেওয়ার জন্য ভয়েস অ্যাকশন ট্রিগার করে। উপরে উল্লিখিত হিসাবে, এই ডিফল্ট ভয়েস সহকারীর অবশ্যই বিজ্ঞপ্তি শ্রোতার অনুমতি থাকতে হবে।

সিকোয়েন্স ডায়াগ্রাম

এই পরিসংখ্যানগুলি CarVoiceInteractionSession actions লজিক প্রবাহ প্রদর্শন করে:

VOICE_ACTION_READ_NOTIFICATION

চিত্র 2. VOICE_ACTION_READ_NOTIFICATION এর জন্য সিকোয়েন্স ডায়াগ্রাম।

চিত্র 3-এর ক্ষেত্রে, অনুমতির অনুরোধে রেট সীমার অ্যাপটি সুপারিশ করা হয়:

VOICE_ACTION_REPLY_NOTIFICATION

চিত্র 3. VOICE_ACTION_REPLY_NOTIFICATION এর জন্য সিকোয়েন্স ডায়াগ্রাম।

VOICE_ACTION_HANDLE_EXCEPTION

চিত্র 4. VOICE_ACTION_HANDLE_EXCEPTION এর জন্য সিকোয়েন্স ডায়াগ্রাম।

অ্যাপের নাম পড়ুন

আপনি যদি চান যে আপনার ভয়েস অ্যাসিস্ট্যান্ট মেসেজ রিডআউটের সময় মেসেজিং অ্যাপের নাম উচ্চস্বরে পড়ুক (উদাহরণস্বরূপ, "Hangouts থেকে স্যাম বলেছেন..."), সহকারী পাঠ করছে তা নিশ্চিত করতে নিম্নলিখিত কোড উদাহরণে দেখানো হয়েছে এমন একটি ফাংশন তৈরি করুন সঠিক নাম:

@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;
}