অ্যান্ড্রয়েডের জন্য একটি অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করা হচ্ছে

১. ভূমিকা

অ্যাক্সেসিবিলিটি সার্ভিস হলো অ্যান্ড্রয়েড ফ্রেমওয়ার্কের একটি বৈশিষ্ট্য, যা অ্যান্ড্রয়েড ডিভাইসে ইনস্টল করা অ্যাপ্লিকেশনগুলোর পক্ষ থেকে ব্যবহারকারীকে বিকল্প নেভিগেশন ফিডব্যাক দেওয়ার জন্য ডিজাইন করা হয়েছে। একটি অ্যাক্সেসিবিলিটি সার্ভিস অ্যাপ্লিকেশনের পক্ষ থেকে ব্যবহারকারীর সাথে যোগাযোগ করতে পারে, যেমন—টেক্সটকে স্পিচে রূপান্তর করা অথবা ব্যবহারকারী যখন স্ক্রিনের কোনো গুরুত্বপূর্ণ অংশে মাউস হোভার করেন তখন হ্যাপটিক ফিডব্যাক প্রদান করা। এই কোডল্যাবটি আপনাকে দেখাবে কীভাবে একটি খুব সাধারণ অ্যাক্সেসিবিলিটি সার্ভিস তৈরি করতে হয়।

অ্যাক্সেসিবিলিটি সার্ভিস বলতে কী বোঝায়?

অ্যাক্সেসিবিলিটি সার্ভিস প্রতিবন্ধী ব্যবহারকারীদের অ্যান্ড্রয়েড ডিভাইস ও অ্যাপ ব্যবহারে সহায়তা করে। এটি একটি দীর্ঘস্থায়ী বিশেষাধিকারপ্রাপ্ত পরিষেবা যা ব্যবহারকারীদের স্ক্রিনের তথ্য প্রক্রিয়াকরণে সাহায্য করে এবং ডিভাইসটির সাথে অর্থপূর্ণভাবে মিথস্ক্রিয়া করতে দেয়।

সাধারণ প্রবেশগম্যতা পরিষেবাগুলির উদাহরণ

  • সুইচ অ্যাক্সেস : চলাচলে সীমাবদ্ধতাযুক্ত অ্যান্ড্রয়েড ব্যবহারকারীদের এক বা একাধিক সুইচ ব্যবহার করে ডিভাইসগুলির সাথে যোগাযোগ করার সুযোগ দেয়।
  • ভয়েস অ্যাক্সেস (বিটা): এর মাধ্যমে চলাচলে সীমাবদ্ধতাযুক্ত অ্যান্ড্রয়েড ব্যবহারকারীরা মৌখিক নির্দেশের মাধ্যমে ডিভাইস নিয়ন্ত্রণ করতে পারবেন।
  • টকব্যাক : একটি স্ক্রিন রিডার যা সাধারণত দৃষ্টি প্রতিবন্ধী বা অন্ধ ব্যবহারকারীরা ব্যবহার করেন।

একটি প্রবেশগম্যতা পরিষেবা তৈরি করা

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

আপনি যা তৈরি করবেন

এই কোডল্যাবে, আপনি অ্যাক্সেসিবিলিটি এপিআই ব্যবহার করে কয়েকটি দরকারি কাজ করতে পারে এমন একটি সহজ সার্ভিস তৈরি করবেন। আপনি যদি একটি সাধারণ অ্যান্ড্রয়েড অ্যাপ লিখতে পারেন, তবে আপনি একই ধরনের একটি সার্ভিসও তৈরি করতে পারবেন।

অ্যাক্সেসিবিলিটি এপিআইটি বেশ শক্তিশালী: আপনি যে সার্ভিসটি তৈরি করবেন তার কোড মাত্র চারটি ফাইলে রয়েছে এবং এতে প্রায় ২০০ লাইন কোড ব্যবহৃত হয়েছে!

শেষ ব্যবহারকারী

আপনি একজন কাল্পনিক ব্যবহারকারীর জন্য নিম্নলিখিত বৈশিষ্ট্যসহ একটি সার্ভিস তৈরি করবেন:

  • ব্যবহারকারীর ডিভাইসের পাশের বাটনগুলোতে পৌঁছাতে অসুবিধা হয়।
  • ব্যবহারকারীর স্ক্রোল বা সোয়াইপ করতে অসুবিধা হয়।

পরিষেবার বিবরণ

আপনার পরিষেবাটি স্ক্রিনের উপর একটি গ্লোবাল অ্যাকশন বার প্রদর্শন করবে। ব্যবহারকারী এই বারের বাটনগুলোতে স্পর্শ করে নিম্নলিখিত কাজগুলো সম্পাদন করতে পারবেন:

  1. ফোনের পাশে থাকা আসল পাওয়ার বাটনে হাত না দিয়ে ডিভাইসটি বন্ধ করুন।
  2. ফোনের পাশে থাকা ভলিউম বাটনগুলো স্পর্শ না করে ভলিউম নিয়ন্ত্রণ করুন।
  3. প্রকৃতপক্ষে স্ক্রল না করেই স্ক্রল অ্যাকশন সম্পাদন করুন।
  4. সোয়াইপ জেসচার ব্যবহার না করেই সোয়াইপ করুন।

আপনার যা যা লাগবে

এই কোডল্যাবটি ধরে নিচ্ছে যে আপনি নিম্নলিখিত বিষয়গুলো ব্যবহার করবেন:

  1. অ্যান্ড্রয়েড স্টুডিও চালিত একটি কম্পিউটার।
  2. সাধারণ শেল কমান্ড চালানোর জন্য একটি টার্মিনাল।
  3. ডেভেলপমেন্টের জন্য ব্যবহৃত কম্পিউটারের সাথে সংযুক্ত অ্যান্ড্রয়েড ৭.০ (নুগাট) চালিত একটি ডিভাইস।

চলুন শুরু করা যাক!

২. প্রস্তুতি গ্রহণ

টার্মিনাল ব্যবহার করে, আপনি যেখানে কাজ করবেন সেখানে একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরিতে প্রবেশ করুন।

কোডটি ডাউনলোড করুন

আপনি এই কোডল্যাবের কোড ধারণকারী রিপোটি ক্লোন করতে পারেন:

git clone https://github.com/android/codelab-android-accessibility.git

রিপোটিতে বেশ কয়েকটি অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট রয়েছে। অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে GlobalActionBarService খুলুন।

স্টুডিও আইকনে ক্লিক করে অ্যান্ড্রয়েড স্টুডিও চালু করুন:

Logo used to launch Android Studio.

ইমপোর্ট প্রজেক্ট (Eclipse ADT, Gradle, ইত্যাদি) অপশনটি নির্বাচন করুন:

The welcome screen for Android Studio.

যেখানে আপনি সোর্সটি ক্লোন করেছেন সেই অবস্থানে যান এবং GlobalActionBarService নির্বাচন করুন।

এরপর, টার্মিনাল ব্যবহার করে রুট ডিরেক্টরিতে প্রবেশ করুন।

৩. প্রারম্ভিক কোড বোঝা

আপনার খোলা প্রকল্পটি অন্বেষণ করুন।

অ্যাক্সেসিবিলিটি সার্ভিসের প্রাথমিক কাঠামোটি আপনার জন্য ইতিমধ্যেই তৈরি করা হয়েছে। এই কোডল্যাবে আপনি যে কোড লিখবেন তা নিম্নলিখিত চারটি ফাইলের মধ্যেই সীমাবদ্ধ থাকবে:

  1. app/src/main/ AndroidManifest.xml
  2. app/src/main/res/layout/ action_bar.xml
  3. app/src/main/res/xml/ global_action_bar_service.xml
  4. app/src/main/java/com/example/android/globalactionbarservice/ GlobalActionBarService.java

এখানে প্রতিটি ফাইলের বিষয়বস্তুর একটি বিশদ বিবরণ দেওয়া হলো।

AndroidManifest.xml

অ্যাক্সেসিবিলিটি পরিষেবা সম্পর্কিত তথ্য ম্যানিফেস্টে ঘোষণা করা হয়:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.globalactionbarservice">

   <application>
       <service
           android:name=".GlobalActionBarService"
           android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
           android:exported="true">
           <intent-filter>
               <action android:name="android.accessibilityservice.AccessibilityService" />
           </intent-filter>
           <meta-data
               android:name="android.accessibilityservice"
               android:resource="@xml/global_action_bar_service" />
       </service>
   </application>
</manifest>

AndroidManifest.xml- এ নিম্নলিখিত তিনটি প্রয়োজনীয় আইটেম ঘোষণা করা হয়েছে:

  1. একটি অ্যাক্সেসিবিলিটি পরিষেবাতে সংযুক্ত করার অনুমতি:
<service
    ...
    android:permission = "android.permission.BIND_ACCESSIBILITY_SERVICE">
    ...             
</service>
  1. AccessibilityService- এর উদ্দেশ্য:
<intent-filter>
   <action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
  1. আপনি যে পরিষেবাটি তৈরি করছেন তার মেটাডেটা ধারণকারী ফাইলের অবস্থান:
<meta-data
       ...
       android:resource="@xml/global_action_bar_service" />
</service>

global_action_bar_service.xml

এই ফাইলে পরিষেবাটির মেটাডেটা রয়েছে।

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
   android:accessibilityFeedbackType="feedbackGeneric"
   android:accessibilityFlags="flagDefault"
   android:canPerformGestures="true"
   android:canRetrieveWindowContent="true" />

<accessibility-service> এলিমেন্ট ব্যবহার করে নিম্নলিখিত মেটাডেটা সংজ্ঞায়িত করা হয়েছে:

  1. এই সার্ভিসের জন্য ফিডব্যাক টাইপ (এই কোডল্যাবে feedbackGeneric ব্যবহার করা হয়েছে, যা একটি ভালো ডিফল্ট)।
  2. সার্ভিসটির জন্য অ্যাক্সেসিবিলিটি ফ্ল্যাগসমূহ (এই কোডল্যাবে ডিফল্ট ফ্ল্যাগ ব্যবহার করা হয়েছে)।
  3. পরিষেবাটির জন্য প্রয়োজনীয় সক্ষমতাগুলো হলো:
  4. সোয়াইপ করার জন্য, android:canPerformGestures-কে true সেট করা হয়।
  5. উইন্ডোর কন্টেন্ট পুনরুদ্ধার করার জন্য, android:canRetrieveWindowContent-কে true সেট করা হয়।

GlobalActionBarService.java

অ্যাক্সেসিবিলিটি সার্ভিসের বেশিরভাগ কোড GlobalActionBarService.java ফাইলে থাকে। প্রাথমিকভাবে, ফাইলটিতে একটি অ্যাক্সেসিবিলিটি সার্ভিসের জন্য একেবারে ন্যূনতম কোড থাকে:

  1. একটি ক্লাস যা AccessibilityService-কে এক্সটেন্ড করে।
  2. কয়েকটি প্রয়োজনীয় ওভাররাইড করা মেথড (এই কোডল্যাবে খালি রাখা হয়েছে)।
public class GlobalActionBarService extends AccessibilityService {

   @Override
   public void onAccessibilityEvent(AccessibilityEvent event) {

   }

   @Override
   public void onInterrupt() {

   }
}

কোডল্যাবের সময় আপনি এই ফাইলে কোড যোগ করবেন।

অ্যাকশন_বার.এক্সএমএল

সার্ভিসটি চারটি বাটনসহ একটি UI প্রদান করে, এবং action_bar.xml লেআউট ফাইলে সেই বাটনগুলো প্রদর্শনের জন্য মার্কআপ থাকে:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
</LinearLayout>

এই ফাইলটিতে আপাতত একটি খালি LinearLayout রয়েছে। কোডল্যাবের সময় আপনি বাটনগুলোর জন্য মার্কআপ যোগ করবেন।

অ্যাপ্লিকেশনটি চালু করা হচ্ছে

আপনার কম্পিউটারের সাথে একটি ডিভাইস সংযুক্ত আছে কিনা তা নিশ্চিত করুন। সবুজ প্লে আইকনটি চাপুন। Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এটি আপনার ব্যবহৃত অ্যাপটি চালু করবে।

সেটিংস > অ্যাক্সেসিবিলিটি-তে যান। আপনার ডিভাইসে গ্লোবাল অ্যাকশন বার সার্ভিসটি ইনস্টল করা আছে।

Accessibility settings screen

গ্লোবাল অ্যাকশন বার সার্ভিস- এ ক্লিক করে এটি চালু করুন। আপনি নিম্নলিখিত অনুমতি ডায়ালগটি দেখতে পাবেন:

Accessibility service permission dialog.

অ্যাক্সেসিবিলিটি পরিষেবাটি ব্যবহারকারীর কার্যকলাপ পর্যবেক্ষণ করতে, উইন্ডোর বিষয়বস্তু পুনরুদ্ধার করতে এবং ব্যবহারকারীর পক্ষ থেকে অঙ্গভঙ্গি সম্পাদন করার অনুমতি চায়! কোনো তৃতীয় পক্ষের অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহার করার সময়, নিশ্চিত করুন যে আপনি উৎসটিকে সত্যিই বিশ্বাস করেন !

সার্ভিসটি চালালে বিশেষ কিছু হয় না, কারণ আমরা এখনও কোনো কার্যকারিতা যোগ করিনি। চলুন, তা করা শুরু করা যাক।

৪. বাটনগুলো তৈরি করা

res/layout- এ থাকা action_bar.xml ফাইলটি খুলুন। বর্তমানে খালি থাকা LinearLayout- টির ভিতরে এই মার্কআপটি যোগ করুন:

<LinearLayout ...>
    <Button
        android:id="@+id/power"
        android:text="@string/power"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/volume_up"
        android:text="@string/volume"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/scroll"
        android:text="@string/scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/swipe"
        android:text="@string/swipe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

এর মাধ্যমে এমন বাটন তৈরি হয়, যেগুলো চাপলে ডিভাইসে বিভিন্ন কাজ সম্পন্ন হবে।

GlobalActionBarService.java ফাইলটি খুলুন এবং অ্যাকশন বারের লেআউট সংরক্ষণের জন্য একটি ভেরিয়েবল যোগ করুন:

public class GlobalActionBarService extends AccessibilityService {
    FrameLayout mLayout;
    ...
}

এখন একটি onServiceStarted() মেথড যোগ করুন:

public class GlobalActionBarService extends AccessibilityService {
   FrameLayout mLayout;

   @Override
   protected void onServiceConnected() {
       // Create an overlay and display the action bar
       WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
       mLayout = new FrameLayout(this);
       WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
       lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
       lp.format = PixelFormat.TRANSLUCENT;
       lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
       lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
       lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
       lp.gravity = Gravity.TOP;
       LayoutInflater inflater = LayoutInflater.from(this);
       inflater.inflate(R.layout.action_bar, mLayout);
       wm.addView(mLayout, lp);
   }
}

কোডটি লেআউটটিকে ইনফ্লেট করে এবং স্ক্রিনের উপরের দিকে অ্যাকশন বারটি যুক্ত করে।

সার্ভিসটি সংযুক্ত হলে onServiceConnected() মেথডটি রান করে। এই সময়ে, অ্যাক্সেসিবিলিটি সার্ভিসটির কার্যকর থাকার জন্য প্রয়োজনীয় সমস্ত অনুমতি থাকে। এখানে আপনি যে মূল অনুমতিটি ব্যবহার করবেন তা হলো WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY অনুমতি। এই অনুমতিটি আপনাকে কোনো জটিল অনুমতি প্রক্রিয়ার মধ্য দিয়ে না গিয়েই বিদ্যমান কন্টেন্টের উপরে সরাসরি স্ক্রিনে আঁকতে দেয়।

অ্যাক্সেসিবিলিটি পরিষেবা জীবনচক্র

একটি অ্যাক্সেসিবিলিটি পরিষেবার জীবনচক্র সম্পূর্ণরূপে সিস্টেম দ্বারা পরিচালিত হয় এবং প্রতিষ্ঠিত পরিষেবা জীবনচক্র অনুসরণ করে।

  • যখন ব্যবহারকারী ডিভাইসের সেটিংসে পরিষেবাটি স্পষ্টভাবে চালু করেন, তখন একটি অ্যাক্সেসিবিলিটি পরিষেবা চালু হয়।
  • সিস্টেমটি কোনো সার্ভিসের সাথে সংযুক্ত হওয়ার পর onServiceConnected() মেথডটি কল করে। যেসব সার্ভিস বাইন্ডিং-পরবর্তী সেটআপ করতে চায়, তারা এই মেথডটি ওভাররাইড করতে পারে।
  • যখন ব্যবহারকারী ডিভাইস সেটিংসে অ্যাক্সেসিবিলিটি সার্ভিসটি বন্ধ করে দেয় অথবা যখন এটি disableSelf() কল করে, তখন সার্ভিসটি বন্ধ হয়ে যায়।

পরিষেবাটি চালানো হচ্ছে

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে সার্ভিসটি চালু করার আগে, আপনাকে নিশ্চিত করতে হবে যে আপনার রান সেটিংস সঠিকভাবে কনফিগার করা আছে।

আপনার রান কনফিগারেশন সম্পাদনা করুন (উপরের মেনু থেকে রান ব্যবহার করে এডিট কনফিগারেশন-এ যান। তারপর, ড্রপডাউন ব্যবহার করে লঞ্চ অপশনটি 'ডিফল্ট অ্যাক্টিভিটি' থেকে 'নাথিং'-এ পরিবর্তন করুন)।

Drop down to configure run settings to launch a service using Android Studio.

এখন আপনি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে সার্ভিসটি চালু করতে পারবেন।

সবুজ প্লে আইকনটি টিপুন Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এরপর, সেটিংস > অ্যাক্সেসিবিলিটি-তে যান এবং গ্লোবাল অ্যাকশন বার সার্ভিস চালু করুন।

স্ক্রিনে প্রদর্শিত কন্টেন্টের উপরে সার্ভিস UI গঠনকারী চারটি বাটন ওভারলে হিসেবে দেখতে পাবেন।

ওভারলে.png

এখন আপনি চারটি বোতামে কার্যকারিতা যোগ করবেন, যাতে ব্যবহারকারী সেগুলোতে স্পর্শ করে প্রয়োজনীয় কাজ সম্পাদন করতে পারে।

৫. পাওয়ার বাটন কনফিগার করা

GlobalActionBarService.java- তে configurePowerButton() মেথডটি যোগ করুন:

private void configurePowerButton() {
   Button powerButton = (Button) mLayout.findViewById(R.id.power);
   powerButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           performGlobalAction(GLOBAL_ACTION_POWER_DIALOG);
       }
   });
}

পাওয়ার বাটন মেনুতে অ্যাক্সেস করার জন্য, configurePowerButton() ফাংশনটি performGlobalAction() মেথড ব্যবহার করে, যা AccessibilityService দ্বারা সরবরাহ করা হয়। আপনি এইমাত্র যে কোডটি যোগ করেছেন তা সহজ: বাটনটিতে ক্লিক করলে একটি onClickListener() ট্রিগার হয়। এটি performGlobalAction(GLOBAL_ACTION_POWER_DIALOG) ফাংশনটিকে কল করে এবং ব্যবহারকারীকে পাওয়ার ডায়ালগটি দেখায়।

মনে রাখবেন যে গ্লোবাল অ্যাকশনগুলো কোনো ভিউয়ের সাথে সংযুক্ত নয়। ব্যাক বাটন, হোম বাটন, রিসেন্টস বাটন চাপ দেওয়া হলো গ্লোবাল অ্যাকশনের আরও কিছু উদাহরণ।

এখন onServiceConnected( ) মেথডের শেষে configurePowerButton() যোগ করুন:

@Override
protected void onServiceConnected() {
   ...
   configurePowerButton();
}

সবুজ প্লে আইকনটি টিপুন Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এরপর, সেটিংস > অ্যাক্সেসিবিলিটি-তে যান এবং গ্লোবাল অ্যাকশন বার সার্ভিসটি চালু করুন।

পাওয়ার ডায়ালগ বক্সটি প্রদর্শন করতে পাওয়ার বাটনটি চাপুন।

৬. ভলিউম বাটন কনফিগার করা

GlobalActionBarService.java- তে configureVolumeButton() মেথডটি যোগ করুন:

private void configureVolumeButton() {
   Button volumeUpButton = (Button) mLayout.findViewById(R.id.volume_up);
   volumeUpButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
           audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                   AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
       }
   });
}

configureVolumeButton() মেথডটি একটি onClickListener() যোগ করে, যা ব্যবহারকারী ভলিউম বাটন চাপলে ট্রিগার হয়। এই লিসেনারের ভেতরে, configureVolumeButton() মেথডটি স্ট্রিমের ভলিউম অ্যাডজাস্ট করার জন্য একটি AudioManager ব্যবহার করে।

উল্লেখ্য যে, যে কেউ ভলিউম নিয়ন্ত্রণ করতে পারে (এর জন্য আপনাকে কোনো অ্যাক্সেসিবিলিটি পরিষেবা হতে হবে না)।

এখন onServiceConnected( ) মেথডের শেষে configureVolumeButton() যোগ করুন:

@Override
protected void onServiceConnected() {
   ...

   configureVolumeButton();
}

সবুজ প্লে আইকনটি টিপুন Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এরপর, সেটিংস > অ্যাক্সেসিবিলিটি-তে যান এবং গ্লোবাল অ্যাকশন বার সার্ভিসটি চালু করুন।

ভলিউম পরিবর্তন করতে ভলিউম বাটনটি চাপুন।

যে কাল্পনিক ব্যবহারকারী ডিভাইসের পাশে থাকা ভলিউম কন্ট্রোল পর্যন্ত পৌঁছাতে পারেন না, তিনি এখন গ্লোবাল অ্যাকশন বার সার্ভিস ব্যবহার করে ভলিউম পরিবর্তন (বাড়াতে) করতে পারবেন।

৭. স্ক্রল বাটন কনফিগার করা

এই অংশে দুটি মেথড কোড করতে হবে। প্রথম মেথডটি একটি স্ক্রলযোগ্য নোড খুঁজে বের করে এবং দ্বিতীয় মেথডটি ব্যবহারকারীর পক্ষ থেকে স্ক্রল করার কাজটি সম্পাদন করে।

GlobalActionBarService.java- তে findScrollableNode মেথডটি যোগ করুন:

private AccessibilityNodeInfo findScrollableNode(AccessibilityNodeInfo root) {
   Deque<AccessibilityNodeInfo> deque = new ArrayDeque<>();
   deque.add(root);
   while (!deque.isEmpty()) {
       AccessibilityNodeInfo node = deque.removeFirst();
       if (node.getActionList().contains(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD)) {
           return node;
       }
       for (int i = 0; i < node.getChildCount(); i++) {
           deque.addLast(node.getChild(i));
       }
   }
   return null;
}

একটি অ্যাক্সেসিবিলিটি সার্ভিসের স্ক্রিনের আসল ভিউগুলোতে অ্যাক্সেস থাকে না। এর পরিবর্তে, এটি AccessibilityNodeInfo অবজেক্ট দিয়ে তৈরি একটি ট্রি-এর আকারে স্ক্রিনে যা আছে তার একটি প্রতিচ্ছবি দেখতে পায়। এই অবজেক্টগুলোতে তাদের প্রতিনিধিত্বকারী ভিউ সম্পর্কিত তথ্য থাকে (যেমন ভিউটির অবস্থান, ভিউটির সাথে যুক্ত যেকোনো টেক্সট, অ্যাক্সেসিবিলিটির জন্য যোগ করা মেটাডেটা, ভিউ দ্বারা সমর্থিত অ্যাকশন ইত্যাদি)। findScrollableNode() মেথডটি রুট নোড থেকে শুরু করে এই ট্রি-টির একটি ব্রেডথ-ফার্স্ট ট্রাভার্সাল সম্পাদন করে। যদি এটি একটি স্ক্রলযোগ্য নোড খুঁজে পায় (অর্থাৎ, এমন একটি নোড যা AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD অ্যাকশনটি সমর্থন করে ) , তবে এটি সেই নোডটি রিটার্ন করে, অন্যথায় এটি null রিটার্ন করে।

এখন GlobalActionBarService.java- তে configureScrollButton() মেথডটি যোগ করুন:

private void configureScrollButton() {
   Button scrollButton = (Button) mLayout.findViewById(R.id.scroll);
   scrollButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           AccessibilityNodeInfo scrollable = findScrollableNode(getRootInActiveWindow());
           if (scrollable != null) {
               scrollable.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.getId());
           }
       }
   });
}

এই মেথডটি একটি onClickListener() তৈরি করে, যা স্ক্রল বাটন ক্লিক করা হলে সক্রিয় হয়। এটি একটি স্ক্রলযোগ্য নোড খুঁজে বের করার চেষ্টা করে এবং সফল হলে স্ক্রল অ্যাকশনটি সম্পাদন করে।

এখন onServiceConnect( ) এ configureScrollButton( ) যোগ করুন:

@Override
protected void onServiceConnected() {
   ...

   configureScrollButton();
}

সবুজ প্লে আইকনটি টিপুন Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এরপর, সেটিংস > অ্যাক্সেসিবিলিটি-তে যান এবং গ্লোবাল অ্যাকশন বার সার্ভিসটি চালু করুন।

সেটিংস > অ্যাক্সেসিবিলিটি-তে যেতে ব্যাক বাটনটি চাপুন। অ্যাক্সেসিবিলিটি সেটিংস অ্যাক্টিভিটির আইটেমগুলো স্ক্রল করা যায়, এবং স্ক্রল বাটনটি স্পর্শ করলে স্ক্রল অ্যাকশন সম্পন্ন হয়। আমাদের সেই কাল্পনিক ব্যবহারকারী, যিনি সহজে স্ক্রল করতে পারেন না, তিনি এখন আইটেমের তালিকার উপর স্ক্রল করার জন্য স্ক্রল বাটনটি ব্যবহার করতে পারবেন।

৮. সোয়াইপ বাটন কনফিগার করা

GlobalActionBarService.java- তে configureSwipeButton() মেথডটি যোগ করুন:

private void configureSwipeButton() {
   Button swipeButton = (Button) mLayout.findViewById(R.id.swipe);
   swipeButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           Path swipePath = new Path();
           swipePath.moveTo(1000, 1000);
           swipePath.lineTo(100, 1000);
           GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
           gestureBuilder.addStroke(new GestureDescription.StrokeDescription(swipePath, 0, 500));
           dispatchGesture(gestureBuilder.build(), null, null);
       }
   });
}

configureSwipeButton() মেথডটি N-এ যোগ করা একটি নতুন API ব্যবহার করে, যা ব্যবহারকারীর হয়ে জেসচার সম্পাদন করে। কোডটি জেসচার সম্পাদনের জন্য পাথ নির্দিষ্ট করতে একটি GestureDescription অবজেক্ট ব্যবহার করে (এই কোডল্যাবে হার্ডকোডেড ভ্যালু ব্যবহার করা হয়েছে), এবং তারপর AccessibilityService-এর dispatchGesture() মেথড ব্যবহার করে ব্যবহারকারীর হয়ে সোয়াইপ জেসচারটি ডিসপ্যাচ করে।

এখন onServiceConnected( ) এ configureSwipeButton( ) যোগ করুন:

@Override
protected void onServiceConnected() {
   ...
   configureSwipeButton();
}

সবুজ প্লে আইকনটি টিপুন Android Studio Play button used to launch the service স্ক্রিনের উপরের দিকে থাকা মেনু বার থেকে। এরপর, সেটিংস > অ্যাক্সেসিবিলিটি-তে যান এবং গ্লোবাল অ্যাকশন বার সার্ভিসটি চালু করুন।

সোয়াইপ কার্যকারিতা পরীক্ষা করার সবচেয়ে সহজ উপায় হলো আপনার ফোনে ইনস্টল করা ম্যাপস অ্যাপ্লিকেশনটি খোলা। ম্যাপটি লোড হয়ে গেলে, সোয়াইপ বোতামে স্পর্শ করলে স্ক্রিনটি ডানদিকে সোয়াইপ হবে।

৯. সারসংক্ষেপ

অভিনন্দন! আপনি একটি সহজ ও কার্যকরী প্রবেশগম্যতা পরিষেবা তৈরি করেছেন।

আপনি এই পরিষেবাটি বিভিন্ন উপায়ে প্রসারিত করতে পারেন। উদাহরণস্বরূপ:

  1. অ্যাকশন বারটিকে সচল করুন (আপাতত এটি স্ক্রিনের উপরেই থাকে)।
  2. ব্যবহারকারীকে ভলিউম বাড়ানো এবং কমানো উভয়ই করার অনুমতি দিন।
  3. ব্যবহারকারীকে বাম এবং ডান উভয় দিকে সোয়াইপ করার অনুমতি দিন।
  4. অতিরিক্ত অঙ্গভঙ্গির জন্য সমর্থন যোগ করুন, যেগুলোতে অ্যাকশন বার সাড়া দিতে পারে।

এই কোডল্যাবটি অ্যাক্সেসিবিলিটি এপিআই দ্বারা প্রদত্ত কার্যকারিতার একটি ক্ষুদ্র অংশ মাত্র। এপিআই-এর আওতায় নিম্নলিখিত বিষয়গুলোও অন্তর্ভুক্ত (আংশিক তালিকা):

  • একাধিক উইন্ডোর জন্য সমর্থন।
  • AccessibilityEvent- এর জন্য সমর্থন। যখন UI পরিবর্তিত হয়, তখন AccessibilityEvent অবজেক্ট ব্যবহার করে অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে সেই পরিবর্তনগুলি সম্পর্কে অবহিত করা হয়। এরপর পরিষেবাটি UI পরিবর্তনগুলির প্রতি যথাযথভাবে সাড়া দিতে পারে।
  • বিবর্ধন নিয়ন্ত্রণ করার ক্ষমতা।

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