1. ভূমিকা
অ্যাক্সেসিবিলিটি পরিষেবাগুলি হল Android ফ্রেমওয়ার্কের একটি বৈশিষ্ট্য যা Android ডিভাইসগুলিতে ইনস্টল করা অ্যাপ্লিকেশনগুলির পক্ষে ব্যবহারকারীকে বিকল্প নেভিগেশন প্রতিক্রিয়া প্রদান করার জন্য ডিজাইন করা হয়েছে৷ একটি অ্যাক্সেসিবিলিটি পরিষেবা অ্যাপ্লিকেশনের পক্ষ থেকে ব্যবহারকারীর সাথে যোগাযোগ করতে পারে, উদাহরণস্বরূপ, পাঠ্যকে বক্তৃতায় রূপান্তর করে বা যখন কোনও ব্যবহারকারী স্ক্রিনের একটি গুরুত্বপূর্ণ জায়গায় ঘোরাফেরা করে তখন হ্যাপটিক প্রতিক্রিয়া প্রদান করে৷ এই কোডল্যাব আপনাকে দেখায় কিভাবে একটি খুব সাধারণ অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করতে হয়।
একটি অ্যাক্সেসিবিলিটি পরিষেবা কি?
একটি অ্যাক্সেসিবিলিটি পরিষেবা অক্ষম ব্যবহারকারীদের Android ডিভাইস এবং অ্যাপ ব্যবহারে সহায়তা করে৷ এটি একটি দীর্ঘমেয়াদী সুবিধাপ্রাপ্ত পরিষেবা যা ব্যবহারকারীদের স্ক্রিনে তথ্য প্রক্রিয়া করতে সাহায্য করে এবং তাদের একটি ডিভাইসের সাথে অর্থপূর্ণভাবে ইন্টারঅ্যাক্ট করতে দেয়।
সাধারণ অ্যাক্সেসিবিলিটি পরিষেবার উদাহরণ
- স্যুইচ অ্যাক্সেস : গতিশীলতার সীমাবদ্ধতা সহ Android ব্যবহারকারীদের এক বা একাধিক সুইচ ব্যবহার করে ডিভাইসের সাথে ইন্টারঅ্যাক্ট করতে দেয়।
- ভয়েস অ্যাক্সেস (বিটা): গতিশীলতার সীমাবদ্ধতা সহ Android ব্যবহারকারীদের কথ্য কমান্ড সহ একটি ডিভাইস নিয়ন্ত্রণ করতে দেয়।
- টকব্যাক : একটি স্ক্রিন রিডার যা সাধারণত দৃষ্টি প্রতিবন্ধী বা অন্ধ ব্যবহারকারীদের দ্বারা ব্যবহৃত হয়।
একটি অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করা
যদিও Google অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য সুইচ অ্যাক্সেস, ভয়েস অ্যাক্সেস এবং টকব্যাকের মতো পরিষেবাগুলি প্রদান করে, এই পরিষেবাগুলি সম্ভবত সমস্ত প্রতিবন্ধী ব্যবহারকারীদের পরিষেবা দিতে পারে না৷ যেহেতু অনেক প্রতিবন্ধী ব্যবহারকারীর অনন্য চাহিদা রয়েছে, তাই অ্যাক্সেসিবিলিটি পরিষেবা তৈরির জন্য অ্যান্ড্রয়েডের এপিআইগুলি উন্মুক্ত, এবং বিকাশকারীরা অ্যাক্সেসিবিলিটি পরিষেবাগুলি তৈরি করতে এবং প্লে স্টোরের মাধ্যমে বিতরণ করতে বিনামূল্যে৷
আপনি কি নির্মাণ করা হবে
এই কোডল্যাবে, আপনি একটি সাধারণ পরিষেবা বিকাশ করবেন যা অ্যাক্সেসিবিলিটি API ব্যবহার করে কয়েকটি দরকারী জিনিস করে। আপনি যদি একটি বেসিক অ্যান্ড্রয়েড অ্যাপ লিখতে পারেন তবে আপনি একই ধরনের পরিষেবা বিকাশ করতে পারেন।
অ্যাক্সেসিবিলিটি API শক্তিশালী: আপনি যে পরিষেবাটি তৈরি করবেন তার কোডটি মাত্র চারটি ফাইলে রয়েছে এবং ~200 লাইনের কোড ব্যবহার করে!
শেষ ব্যবহারকারী
আপনি নিম্নলিখিত বৈশিষ্ট্য সহ একটি অনুমানমূলক ব্যবহারকারীর জন্য একটি পরিষেবা তৈরি করবেন:
- ব্যবহারকারীর একটি ডিভাইসের পাশের বোতামগুলিতে পৌঁছাতে অসুবিধা হয়৷
- ব্যবহারকারীর স্ক্রোল বা সোয়াইপ করতে অসুবিধা হয়।
পরিষেবার বিবরণ
আপনার পরিষেবা স্ক্রিনে একটি গ্লোবাল অ্যাকশন বারকে ওভারলে করবে। ব্যবহারকারী নিম্নলিখিত ক্রিয়া সম্পাদন করতে এই বারের বোতামগুলি স্পর্শ করতে পারেন:
- ফোনের পাশে থাকা প্রকৃত পাওয়ার বোতামে না পৌঁছে ডিভাইসটি বন্ধ করুন।
- ফোনের পাশের ভলিউম বোতাম স্পর্শ না করে ভলিউম সামঞ্জস্য করুন।
- আসলে স্ক্রল না করে স্ক্রোল ক্রিয়া সম্পাদন করুন।
- একটি সোয়াইপ অঙ্গভঙ্গি ব্যবহার না করেই একটি সোয়াইপ করুন৷
আপনি কি প্রয়োজন হবে
এই কোডল্যাব অনুমান করে যে আপনি নিম্নলিখিতগুলি ব্যবহার করবেন:
- অ্যান্ড্রয়েড স্টুডিও চালানোর একটি কম্পিউটার।
- সাধারণ শেল কমান্ড চালানোর জন্য একটি টার্মিনাল।
- Android 7.0 (Nougat) চালিত একটি ডিভাইস যা আপনি বিকাশের জন্য ব্যবহার করবেন এমন কম্পিউটারের সাথে সংযুক্ত।
চলুন শুরু করা যাক!
2. সেট আপ করা হচ্ছে
টার্মিনাল ব্যবহার করে, একটি ডিরেক্টরি তৈরি করুন যেখানে আপনি কাজ করবেন। এই ডিরেক্টরিতে পরিবর্তন করুন।
কোডটি ডাউনলোড করুন
আপনি এই কোডল্যাবের জন্য কোড ধারণকারী রেপো ক্লোন করতে পারেন:
git clone https://github.com/android/codelab-android-accessibility.git
রেপোতে বেশ কয়েকটি অ্যান্ড্রয়েড স্টুডিও প্রকল্প রয়েছে। অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে, GlobalActionBarService খুলুন।
স্টুডিও আইকনে ক্লিক করে অ্যান্ড্রয়েড স্টুডিও চালু করুন:
আমদানি প্রকল্প (Eclipse ADT, Gradle, ইত্যাদি) বিকল্পটি নির্বাচন করুন:
যেখানে আপনি উৎসটি ক্লোন করেছেন সেখানে নেভিগেট করুন এবং GlobalActionBarService নির্বাচন করুন।
তারপর, একটি টার্মিনাল ব্যবহার করে, রুট ডিরেক্টরিতে পরিবর্তন করুন।
3. শুরুর কোড বোঝা
আপনি যে প্রকল্পটি খুলেছেন তা অন্বেষণ করুন।
অ্যাক্সেসিবিলিটি পরিষেবার জন্য খালি-হাড়ের কঙ্কাল ইতিমধ্যে আপনার জন্য তৈরি করা হয়েছে। এই কোডল্যাবে আপনি যে সমস্ত কোড লিখবেন তা নিম্নলিখিত চারটি ফাইলের মধ্যে সীমাবদ্ধ:
- app/src/main/ AndroidManifest.xml
- app/src/main/res/layout/ action_bar.xml
- app/src/main/res/xml/ global_action_bar_service.xml
- 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- এ ঘোষণা করা হয়েছে:
- একটি অ্যাক্সেসিবিলিটি পরিষেবার সাথে আবদ্ধ করার অনুমতি:
<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>
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> উপাদান ব্যবহার করে, নিম্নলিখিত মেটাডেটা সংজ্ঞায়িত করা হয়েছে:
- এই পরিষেবার জন্য প্রতিক্রিয়ার ধরন (এই কোডল্যাব feedbackGeneric ব্যবহার করে, যা একটি ভাল ডিফল্ট)।
- পরিষেবার জন্য অ্যাক্সেসযোগ্যতা পতাকা (এই কোডল্যাব ডিফল্ট পতাকা ব্যবহার করে)।
- পরিষেবার জন্য প্রয়োজনীয় ক্ষমতা:
- সোয়াইপ করার জন্য, android:canPerformGestures সত্যে সেট করা হয়েছে।
- উইন্ডো বিষয়বস্তু পুনরুদ্ধার করার জন্য, android:canRetrieveWindowContent সত্যে সেট করা হয়েছে৷
GlobalActionBarService.java
অ্যাক্সেসিবিলিটি পরিষেবার বেশিরভাগ কোড GlobalActionBarService.java- তে থাকে। প্রাথমিকভাবে, ফাইলটিতে একটি অ্যাক্সেসিবিলিটি পরিষেবার জন্য পরম বেয়ার ন্যূনতম কোড রয়েছে:
- একটি ক্লাস যা অ্যাক্সেসিবিলিটি সার্ভিসকে প্রসারিত করে।
- প্রয়োজনীয় কিছু ওভাররাইড করা পদ্ধতি (এই কোডল্যাবে খালি বাম)।
public class GlobalActionBarService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
কোডল্যাব চলাকালীন আপনি এই ফাইলে কোড যোগ করবেন।
action_bar.xml
পরিষেবাটি চারটি বোতাম সহ একটি 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>
এই ফাইলটিতে আপাতত একটি খালি লিনিয়ার লেআউট রয়েছে৷ কোডল্যাবের সময় আপনি বোতামগুলির জন্য মার্কআপ যোগ করবেন।
অ্যাপ্লিকেশন চালু করা হচ্ছে
নিশ্চিত করুন যে একটি ডিভাইস আপনার কম্পিউটারের সাথে সংযুক্ত আছে। সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। আপনি যে অ্যাপটিতে কাজ করছেন সেটি চালু করা উচিত।
সেটিংস > অ্যাক্সেসিবিলিটিতে যান। গ্লোবাল অ্যাকশন বার সার্ভিস আপনার ডিভাইসে ইনস্টল করা আছে।
গ্লোবাল অ্যাকশন বার সার্ভিসে ক্লিক করুন এবং এটি চালু করুন। আপনি নিম্নলিখিত অনুমতি ডায়ালগ দেখতে হবে:
অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহারকারীর ক্রিয়াকলাপ পর্যবেক্ষণ, উইন্ডো সামগ্রী পুনরুদ্ধার এবং ব্যবহারকারীর পক্ষে অঙ্গভঙ্গি সম্পাদন করার অনুমতির অনুরোধ করে! তৃতীয় পক্ষের অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহার করার সময়, নিশ্চিত করুন যে আপনি সত্যিই উৎসটিকে বিশ্বাস করেন !
পরিষেবাটি চালানো খুব বেশি করে না, যেহেতু আমরা এখনও কোনও কার্যকারিতা যোগ করিনি৷ এর যে করতে শুরু করা যাক.
4. বোতাম তৈরি করা
res/লেআউটে 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() কল করে।
সেবা চালাচ্ছেন
আপনি Android স্টুডিও ব্যবহার করে পরিষেবাটি চালু করার আগে, আপনাকে নিশ্চিত করতে হবে যে আপনার রান সেটিংস সঠিকভাবে কনফিগার করা আছে।
আপনার রান কনফিগারেশন সম্পাদনা করুন (উপরের মেনু থেকে রান ব্যবহার করুন এবং কনফিগারেশন সম্পাদনা করুন এ যান। তারপর, ড্রপডাউন ব্যবহার করে, "ডিফল্ট কার্যকলাপ" থেকে "কিছুই নয়" এ লঞ্চ বিকল্পটি পরিবর্তন করুন।
আপনি এখন অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিষেবাটি চালু করতে সক্ষম হবেন।
সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপরে, সেটিংস > অ্যাক্সেসিবিলিটি দেখুন এবং গ্লোবাল অ্যাকশন বার পরিষেবা চালু করুন।
আপনি চারটি বোতাম দেখতে পাবেন যা স্ক্রীনে প্রদর্শিত বিষয়বস্তুর উপরে ওভারলে করা পরিষেবা UI গঠন করে।
আপনি এখন চারটি বোতামে কার্যকারিতা যোগ করবেন, যাতে একজন ব্যবহারকারী দরকারী ক্রিয়া সম্পাদন করতে তাদের স্পর্শ করতে পারে।
5. পাওয়ার বোতাম কনফিগার করা হচ্ছে
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() ট্রিগার করে। এটি পারফর্ম গ্লোবাল অ্যাকশন (GLOBAL_ACTION_POWER_DIALOG) কল করে এবং ব্যবহারকারীর কাছে পাওয়ার ডায়ালগ প্রদর্শন করে।
মনে রাখবেন যে বিশ্বব্যাপী ক্রিয়াকলাপগুলি কোনও দৃষ্টিভঙ্গির সাথে আবদ্ধ নয়। ব্যাক বোতাম, হোম বোতাম, রিসেন্টস বোতামে আঘাত করা হল গ্লোবাল অ্যাকশনের অন্যান্য উদাহরণ।
এখন onServiceConnected() পদ্ধতির শেষে configurePowerButton() যোগ করুন:
@Override
protected void onServiceConnected() {
...
configurePowerButton();
}
সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপরে, সেটিংস > অ্যাক্সেসিবিলিটি দেখুন এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
পাওয়ার ডায়ালগ প্রদর্শন করতে পাওয়ার বোতাম টিপুন।
6. ভলিউম বোতাম কনফিগার করা হচ্ছে
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();
}
সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপরে, সেটিংস > অ্যাক্সেসিবিলিটি দেখুন এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
ভলিউম পরিবর্তন করতে ভলিউম বোতাম টিপুন।
যে কাল্পনিক ব্যবহারকারী ডিভাইসের পাশে ভলিউম নিয়ন্ত্রণে পৌঁছাতে অক্ষম তারা এখন ভলিউম পরিবর্তন (বাড়ানো) করতে গ্লোবাল অ্যাকশন বার পরিষেবা ব্যবহার করতে পারেন।
7. স্ক্রোল বোতাম কনফিগার করা
এই বিভাগে দুটি পদ্ধতির কোডিং জড়িত। প্রথম পদ্ধতিটি একটি স্ক্রোলযোগ্য নোড খুঁজে পায় এবং দ্বিতীয় পদ্ধতিটি ব্যবহারকারীর পক্ষে স্ক্রোল ক্রিয়া সম্পাদন করে।
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 অ্যাকশনকে সমর্থন করে )
, এটি এটি ফেরত দেয়, অন্যথায় এটি শূন্য করে দেয়।
এখন 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();
}
সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপরে, সেটিংস > অ্যাক্সেসিবিলিটি দেখুন এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
সেটিংস > অ্যাক্সেসিবিলিটিতে যেতে পিছনের বোতাম টিপুন। অ্যাক্সেসিবিলিটি সেটিংস কার্যকলাপের আইটেমগুলি স্ক্রোলযোগ্য, এবং স্ক্রোল বোতামটি স্পর্শ করলে একটি স্ক্রোল ক্রিয়া সম্পাদন করে৷ আমাদের কাল্পনিক ব্যবহারকারী যারা সহজেই স্ক্রোল ক্রিয়া সম্পাদন করতে অক্ষম তারা এখন আইটেমগুলির একটি তালিকা স্ক্রোল করতে স্ক্রোল বোতাম ব্যবহার করতে পারেন।
8. সোয়াইপ বোতাম কনফিগার করা
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() পদ্ধতিটি একটি নতুন API ব্যবহার করে যা N এ যোগ করা হয়েছে যা ব্যবহারকারীর পক্ষে অঙ্গভঙ্গি সম্পাদন করে। কোডটি একটি GestureDescription অবজেক্ট ব্যবহার করে অঙ্গভঙ্গিটি সম্পাদন করার জন্য পথ নির্দিষ্ট করে (এই কোডল্যাবে হার্ডকোড করা মান ব্যবহার করা হয়), এবং তারপর অ্যাক্সেসিবিলিটি সার্ভিস ডিসপ্যাচগেসচার() পদ্ধতি ব্যবহার করে ব্যবহারকারীর পক্ষে সোয়াইপ অঙ্গভঙ্গি প্রেরণ করে।
এখন onServiceConnected() এ configureSwipeButton() যোগ করুন:
@Override
protected void onServiceConnected() {
...
configureSwipeButton();
}
সবুজ প্লে আইকন টিপুন মেনু বার থেকে স্ক্রিনের উপরের দিকে। তারপরে, সেটিংস > অ্যাক্সেসিবিলিটি দেখুন এবং গ্লোবাল অ্যাকশন বার পরিষেবা শুরু করুন।
সোয়াইপ কার্যকারিতা পরীক্ষা করার সবচেয়ে সহজ উপায় হল আপনার ফোনে ইনস্টল করা মানচিত্র অ্যাপ্লিকেশনটি খুলুন৷ মানচিত্রটি লোড হয়ে গেলে, সোয়াইপ বোতামটি স্পর্শ করলে স্ক্রীনটি ডানদিকে সোয়াইপ হয়।
9. সারাংশ
অভিনন্দন! আপনি একটি সহজ, কার্যকরী অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করেছেন৷
আপনি এই পরিষেবাটি বিভিন্ন উপায়ে প্রসারিত করতে পারেন। যেমন:
- অ্যাকশন বারটিকে চলনযোগ্য করুন (এটি আপাতত স্ক্রিনের উপরে বসে আছে)।
- ব্যবহারকারীকে ভলিউম বাড়ানো এবং হ্রাস উভয়ের অনুমতি দিন।
- ব্যবহারকারীকে বাম এবং ডান উভয় দিকে সোয়াইপ করার অনুমতি দিন।
- অ্যাকশন বার সাড়া দিতে পারে এমন অতিরিক্ত অঙ্গভঙ্গির জন্য সমর্থন যোগ করুন।
এই কোডল্যাবটি অ্যাক্সেসিবিলিটি API দ্বারা প্রদত্ত কার্যকারিতার একটি ছোট উপসেট কভার করে৷ এপিআই নিম্নলিখিতগুলিও কভার করে (আংশিক তালিকা):
- একাধিক উইন্ডোর জন্য সমর্থন.
- অ্যাক্সেসিবিলিটি ইভেন্টের জন্য সমর্থন যখন UI পরিবর্তিত হয়, অ্যাক্সেসিবিলিটি ইভেন্ট অবজেক্ট ব্যবহার করে সেই পরিবর্তনগুলি সম্পর্কে অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে অবহিত করা হয়৷ পরিষেবাটি তখন UI পরিবর্তনের জন্য উপযুক্ত হিসাবে প্রতিক্রিয়া জানাতে পারে।
- বিবর্ধন নিয়ন্ত্রণ করার ক্ষমতা।
এই কোডল্যাব আপনাকে একটি অ্যাক্সেসিবিলিটি পরিষেবা লেখার সাথে শুরু করে। আপনি যদি নির্দিষ্ট অ্যাক্সেসিবিলিটি সমস্যাগুলির সাথে এমন কোনও ব্যবহারকারীকে জানেন যা আপনি সমাধান করতে চান, আপনি এখন সেই ব্যবহারকারীকে সহায়তা করার জন্য একটি পরিষেবা তৈরি করতে পারেন৷