1. ভূমিকা
অ্যাক্সেসিবিলিটি পরিষেবাগুলি অ্যান্ড্রয়েড ফ্রেমওয়ার্কের একটি বৈশিষ্ট্য যা অ্যান্ড্রয়েড ডিভাইসে ইনস্টল করা অ্যাপ্লিকেশনগুলির পক্ষে ব্যবহারকারীকে বিকল্প নেভিগেশন প্রতিক্রিয়া প্রদানের জন্য ডিজাইন করা হয়েছে। একটি অ্যাক্সেসিবিলিটি পরিষেবা অ্যাপ্লিকেশনের পক্ষ থেকে ব্যবহারকারীর সাথে যোগাযোগ করতে পারে, উদাহরণস্বরূপ টেক্সটকে স্পিচে রূপান্তর করে অথবা যখন ব্যবহারকারী স্ক্রিনের একটি গুরুত্বপূর্ণ অংশে ঘোরাফেরা করে তখন হ্যাপটিক প্রতিক্রিয়া প্রদান করে। এই কোডল্যাব আপনাকে দেখায় কিভাবে একটি খুব সহজ অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করতে হয়।
অ্যাক্সেসিবিলিটি সার্ভিস কী?
একটি অ্যাক্সেসিবিলিটি পরিষেবা অ্যান্ড্রয়েড ডিভাইস এবং অ্যাপ ব্যবহারে প্রতিবন্ধী ব্যবহারকারীদের সহায়তা করে। এটি একটি দীর্ঘস্থায়ী বিশেষায়িত পরিষেবা যা ব্যবহারকারীদের স্ক্রিনে তথ্য প্রক্রিয়া করতে সাহায্য করে এবং তাদের ডিভাইসের সাথে অর্থপূর্ণভাবে ইন্টারঅ্যাক্ট করতে দেয়।
সাধারণ অ্যাক্সেসিবিলিটি পরিষেবার উদাহরণ
- সুইচ অ্যাক্সেস : গতিশীলতার সীমাবদ্ধতা সহ অ্যান্ড্রয়েড ব্যবহারকারীদের এক বা একাধিক সুইচ ব্যবহার করে ডিভাইসের সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয়।
- ভয়েস অ্যাক্সেস (বিটা): গতিশীলতার সীমাবদ্ধতা সহ অ্যান্ড্রয়েড ব্যবহারকারীদের কথ্য কমান্ডের মাধ্যমে একটি ডিভাইস নিয়ন্ত্রণ করতে দেয়।
- টকব্যাক : একটি স্ক্রিন রিডার যা সাধারণত দৃষ্টি প্রতিবন্ধী বা অন্ধ ব্যবহারকারীদের দ্বারা ব্যবহৃত হয়।
একটি অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করা
যদিও গুগল অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য সুইচ অ্যাক্সেস, ভয়েস অ্যাক্সেস এবং টকব্যাকের মতো পরিষেবা প্রদান করে, এই পরিষেবাগুলি সম্ভবত সমস্ত প্রতিবন্ধী ব্যবহারকারীদের পরিষেবা দিতে পারে না। যেহেতু অনেক প্রতিবন্ধী ব্যবহারকারীর অনন্য চাহিদা থাকে, তাই অ্যাক্সেসিবিলিটি পরিষেবা তৈরির জন্য অ্যান্ড্রয়েডের API গুলি উন্মুক্ত, এবং ডেভেলপাররা অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করতে এবং প্লে স্টোরের মাধ্যমে সেগুলি বিতরণ করতে স্বাধীন।
তুমি কী তৈরি করবে
এই কোডল্যাবে, আপনি একটি সহজ পরিষেবা তৈরি করবেন যা অ্যাক্সেসিবিলিটি API ব্যবহার করে কিছু কার্যকর কাজ করে। আপনি যদি একটি বেসিক অ্যান্ড্রয়েড অ্যাপ লিখতে পারেন, তাহলে আপনিও একই ধরণের পরিষেবা তৈরি করতে পারেন।
অ্যাক্সেসিবিলিটি এপিআই শক্তিশালী: আপনি যে পরিষেবাটি তৈরি করবেন তার কোডটি মাত্র চারটি ফাইলে রয়েছে এবং প্রায় ২০০ লাইন কোড ব্যবহার করে!
শেষ ব্যবহারকারী
আপনি একজন কাল্পনিক ব্যবহারকারীর জন্য নিম্নলিখিত বৈশিষ্ট্য সহ একটি পরিষেবা তৈরি করবেন:
- ব্যবহারকারীর ডিভাইসের পাশের বোতামগুলিতে পৌঁছাতে অসুবিধা হয়।
- ব্যবহারকারীর স্ক্রোল করতে বা সোয়াইপ করতে অসুবিধা হয়।
পরিষেবার বিবরণ
আপনার পরিষেবা স্ক্রিনে একটি গ্লোবাল অ্যাকশন বার ওভারলে করবে। ব্যবহারকারী নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করতে এই বারের বোতামগুলি স্পর্শ করতে পারেন:
- ফোনের পাশের আসল পাওয়ার বোতামটি না চেপেই ডিভাইসটি বন্ধ করুন।
- ফোনের পাশের ভলিউম বোতামগুলি স্পর্শ না করেই ভলিউম সামঞ্জস্য করুন।
- আসলে স্ক্রোল না করেই স্ক্রোল অ্যাকশন সম্পাদন করুন।
- সোয়াইপ অঙ্গভঙ্গি ব্যবহার না করেই সোয়াইপ করুন।
তোমার যা লাগবে
এই কোডল্যাব ধরে নিচ্ছে যে আপনি নিম্নলিখিতগুলি ব্যবহার করবেন:
- অ্যান্ড্রয়েড স্টুডিও চালিত একটি কম্পিউটার।
- সহজ শেল কমান্ড কার্যকর করার জন্য একটি টার্মিনাল।
- আপনার ডেভেলপমেন্টের জন্য ব্যবহার করা কম্পিউটারের সাথে সংযুক্ত Android 7.0 (Nougat) চালিত একটি ডিভাইস।
চল শুরু করি!
2. সেট আপ করা
টার্মিনাল ব্যবহার করে, একটি ডিরেক্টরি তৈরি করুন যেখানে আপনি কাজ করবেন। এই ডিরেক্টরিতে পরিবর্তন করুন।
কোডটি ডাউনলোড করুন
আপনি এই কোডল্যাবের কোড ধারণকারী রেপো ক্লোন করতে পারেন:
git clone https://github.com/android/codelab-android-accessibility.git
রেপোতে বেশ কিছু অ্যান্ড্রয়েড স্টুডিও প্রকল্প রয়েছে। অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে, GlobalActionBarService খুলুন।
স্টুডিও আইকনে ক্লিক করে অ্যান্ড্রয়েড স্টুডিও চালু করুন:

Import project (Eclipse ADT, Gradle, ইত্যাদি) বিকল্পটি নির্বাচন করুন:

আপনি যেখানে সোর্সটি ক্লোন করেছেন সেখানে যান এবং GlobalActionBarService নির্বাচন করুন।
তারপর, একটি টার্মিনাল ব্যবহার করে, রুট ডিরেক্টরিতে পরিবর্তন করুন।
৩. শুরুর কোড বোঝা
আপনার খোলা প্রকল্পটি ঘুরে দেখুন।
অ্যাক্সেসিবিলিটি পরিষেবার জন্য খালি হাড়ের কঙ্কালটি ইতিমধ্যেই আপনার জন্য তৈরি করা হয়েছে। এই কোডল্যাবে আপনি যে সমস্ত কোড লিখবেন তা নিম্নলিখিত চারটি ফাইলের মধ্যে সীমাবদ্ধ:
- অ্যাপ/src/main/ অ্যান্ড্রয়েডম্যানিফেস্ট.এক্সএমএল
- অ্যাপ/src/main/res/layout/ action_bar.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- এ ঘোষণা করা হয়েছে:
- একটি অ্যাক্সেসিবিলিটি পরিষেবার সাথে আবদ্ধ হওয়ার অনুমতি:
<service
...
android:permission = "android.permission.BIND_ACCESSIBILITY_SERVICE">
...
</service>
- অ্যাক্সেসিবিলিটি সার্ভিসের উদ্দেশ্য:
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
- আপনার তৈরি করা পরিষেবার মেটাডেটা ধারণকারী ফাইলের অবস্থান:
<meta-data
...
android:resource="@xml/global_action_bar_service" />
</service>
গ্লোবাল_অ্যাকশন_বার_সার্ভিস.এক্সএমএল
এই ফাইলটিতে পরিষেবাটির মেটাডেটা রয়েছে।
<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> উপাদান ব্যবহার করে, নিম্নলিখিত মেটাডেটা সংজ্ঞায়িত করা হয়েছে:
- এই পরিষেবার জন্য প্রতিক্রিয়ার ধরণ (এই কোডল্যাবটি feedbackGeneric ব্যবহার করে, যা একটি ভাল ডিফল্ট)।
- পরিষেবাটির অ্যাক্সেসিবিলিটি ফ্ল্যাগগুলি (এই কোডল্যাবটি ডিফল্ট ফ্ল্যাগ ব্যবহার করে)।
- পরিষেবার জন্য প্রয়োজনীয় ক্ষমতা:
- সোয়াইপ করার জন্য, android:canPerformGestures কে true তে সেট করা আছে।
- উইন্ডোর কন্টেন্ট পুনরুদ্ধার করার জন্য, android:canRetrieveWindowContent কে true তে সেট করা আছে।
গ্লোবালঅ্যাকশনবারসার্ভিস.জাভা
অ্যাক্সেসিবিলিটি সার্ভিসের বেশিরভাগ কোড GlobalActionBarService.java তে থাকে। প্রাথমিকভাবে, ফাইলটিতে অ্যাক্সেসিবিলিটি সার্ভিসের জন্য সর্বনিম্ন কোড থাকে:
- একটি ক্লাস যা AccessibilityService প্রসারিত করে।
- কয়েকটি প্রয়োজনীয় ওভাররাইড পদ্ধতি (এই কোডল্যাবে খালি রাখা হয়েছে)।
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 আছে। কোডল্যাবের সময় আপনি বোতামগুলির জন্য মার্কআপ যোগ করবেন।
অ্যাপ্লিকেশন চালু করা হচ্ছে
নিশ্চিত করুন যে আপনার কম্পিউটারের সাথে একটি ডিভাইস সংযুক্ত আছে। সবুজ প্লে আইকন টিপুন।
মেনু বার থেকে স্ক্রিনের উপরের দিকে। এটি আপনার কাজ করা অ্যাপটি চালু করবে।
সেটিংস > অ্যাক্সেসিবিলিটিতে যান। আপনার ডিভাইসে গ্লোবাল অ্যাকশন বার পরিষেবা ইনস্টল করা আছে।

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

অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহারকারীর ক্রিয়াকলাপ পর্যবেক্ষণ করতে, উইন্ডোর বিষয়বস্তু পুনরুদ্ধার করতে এবং ব্যবহারকারীর পক্ষ থেকে অঙ্গভঙ্গি সম্পাদন করার জন্য অনুমতি চায়! তৃতীয় পক্ষের অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহার করার সময়, নিশ্চিত করুন যে আপনি উৎসটি সত্যিই বিশ্বাস করেন !
পরিষেবাটি চালালে খুব বেশি কিছু হয় না, কারণ আমরা এখনও কোনও কার্যকারিতা যোগ করিনি। চলুন শুরু করা যাক।
৪. বোতাম তৈরি করা
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() কল করে তখন একটি অ্যাক্সেসিবিলিটি পরিষেবা বন্ধ হয়ে যায়।
পরিষেবাটি পরিচালনা করা হচ্ছে
অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিষেবাটি চালু করার আগে, আপনাকে নিশ্চিত করতে হবে যে আপনার রান সেটিংস সঠিকভাবে কনফিগার করা আছে।
আপনার রান কনফিগারেশন সম্পাদনা করুন (উপরের মেনু থেকে রান ব্যবহার করুন এবং কনফিগারেশন সম্পাদনা করুন এ যান। তারপর, ড্রপডাউন ব্যবহার করে, "ডিফল্ট অ্যাক্টিভিটি" থেকে "কিছুই না" লঞ্চ অপশনটি পরিবর্তন করুন।

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

এখন আপনি চারটি বোতামে কার্যকারিতা যোগ করবেন, যাতে ব্যবহারকারীরা কার্যকর ক্রিয়া সম্পাদনের জন্য সেগুলি স্পর্শ করতে পারেন।
৫. পাওয়ার বোতাম কনফিগার করা
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();
}
সবুজ প্লে আইকন টিপুন
মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপর, সেটিংস > অ্যাক্সেসিবিলিটি এ যান এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
পাওয়ার ডায়ালগ প্রদর্শন করতে পাওয়ার বোতাম টিপুন।
৬. ভলিউম বোতাম কনফিগার করা
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();
}
সবুজ প্লে আইকন টিপুন
মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপর, সেটিংস > অ্যাক্সেসিবিলিটি এ যান এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
ভলিউম পরিবর্তন করতে ভলিউম বোতাম টিপুন।
যে কাল্পনিক ব্যবহারকারী ডিভাইসের পাশের ভলিউম নিয়ন্ত্রণগুলিতে পৌঁছাতে অক্ষম, তিনি এখন ভলিউম পরিবর্তন (বৃদ্ধি) করতে গ্লোবাল অ্যাকশন বার পরিষেবা ব্যবহার করতে পারেন।
৭. স্ক্রোল বোতাম কনফিগার করা
এই অংশে দুটি পদ্ধতি কোডিং করা হয়। প্রথম পদ্ধতিটি একটি স্ক্রোলযোগ্য নোড খুঁজে বের করে এবং দ্বিতীয় পদ্ধতিটি ব্যবহারকারীর পক্ষে স্ক্রোল ক্রিয়া সম্পাদন করে।
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() তৈরি করে যা স্ক্রোল বোতামে ক্লিক করলে সক্রিয় হয়। এটি একটি স্ক্রোলযোগ্য নোড খুঁজে বের করার চেষ্টা করে এবং সফল হলে, স্ক্রোল ক্রিয়া সম্পাদন করে।
এখন onServiceConnected( ) তে configureScrollButton( ) যোগ করুন:
@Override
protected void onServiceConnected() {
...
configureScrollButton();
}
সবুজ প্লে আইকন টিপুন
মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপর, সেটিংস > অ্যাক্সেসিবিলিটি এ যান এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
সেটিংস > অ্যাক্সেসিবিলিটিতে যেতে পিছনের বোতাম টিপুন। অ্যাক্সেসিবিলিটি সেটিংস অ্যাক্টিভিটির আইটেমগুলি স্ক্রোলযোগ্য, এবং স্ক্রোল বোতামটি স্পর্শ করলে একটি স্ক্রোল অ্যাকশন সম্পন্ন হয়। আমাদের কাল্পনিক ব্যবহারকারী যিনি সহজেই স্ক্রোল অ্যাকশন সম্পাদন করতে অক্ষম, তিনি এখন আইটেমগুলির তালিকা স্ক্রোল করতে স্ক্রোল বোতামটি ব্যবহার করতে পারেন।
৮. সোয়াইপ বোতাম কনফিগার করা
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();
}
সবুজ প্লে আইকন টিপুন
মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপর, সেটিংস > অ্যাক্সেসিবিলিটি এ যান এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
সোয়াইপ কার্যকারিতা পরীক্ষা করার সবচেয়ে সহজ উপায় হল আপনার ফোনে ইনস্টল করা ম্যাপ অ্যাপ্লিকেশনটি খোলা। ম্যাপ লোড হয়ে গেলে, সোয়াইপ বোতামটি স্পর্শ করলে স্ক্রিনটি ডানদিকে সোয়াইপ হয়ে যায়।
9. সারাংশ
অভিনন্দন! আপনি একটি সহজ, কার্যকরী অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করেছেন।
আপনি বিভিন্ন উপায়ে এই পরিষেবাটি প্রসারিত করতে পারেন। উদাহরণস্বরূপ:
- অ্যাকশন বারটি সরানোর যোগ্য করে তুলুন (এটি আপাতত কেবল স্ক্রিনের উপরেই থাকবে)।
- ব্যবহারকারীকে ভলিউম বাড়াতে এবং কমাতে উভয়ই অনুমতি দিন।
- ব্যবহারকারীকে বাম এবং ডান উভয় দিকেই সোয়াইপ করার অনুমতি দিন।
- অ্যাকশন বার সাড়া দিতে পারে এমন অতিরিক্ত অঙ্গভঙ্গির জন্য সমর্থন যোগ করুন।
এই কোডল্যাবটি অ্যাক্সেসিবিলিটি API গুলির দ্বারা প্রদত্ত কার্যকারিতার একটি ছোট উপসেটকে কভার করে। API নিম্নলিখিতগুলিও কভার করে (আংশিক তালিকা):
- একাধিক উইন্ডোর জন্য সমর্থন।
- AccessibilityEvent এর জন্য সমর্থন। যখন UI পরিবর্তন হয়, তখন AccessibilityEvent অবজেক্ট ব্যবহার করে অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে সেই পরিবর্তনগুলি সম্পর্কে অবহিত করা হয়। পরিষেবাটি তখন UI পরিবর্তনের জন্য যথাযথভাবে প্রতিক্রিয়া জানাতে পারে।
- বিবর্ধন নিয়ন্ত্রণ করার ক্ষমতা।
এই কোডল্যাবটি আপনাকে একটি অ্যাক্সেসিবিলিটি পরিষেবা লেখার সাথে শুরু করতে সাহায্য করবে। যদি আপনি এমন কোনও ব্যবহারকারীকে চেনেন যার নির্দিষ্ট অ্যাক্সেসিবিলিটি সমস্যা রয়েছে এবং আপনি যা সমাধান করতে চান, তাহলে আপনি এখন সেই ব্যবহারকারীকে সাহায্য করার জন্য একটি পরিষেবা তৈরি করতে পারেন।