সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্ক অনুমান করে যে আপনার সিঙ্ক অ্যাডাপ্টার একটি অ্যাকাউন্টের সাথে যুক্ত ডিভাইস স্টোরেজ এবং সার্ভার স্টোরেজের মধ্যে ডেটা স্থানান্তর করে যার জন্য লগইন অ্যাক্সেস প্রয়োজন। এই কারণে, ফ্রেমওয়ার্ক আপনার সিঙ্ক অ্যাডাপ্টারের অংশ হিসাবে একটি প্রমাণীকরণকারী নামক একটি উপাদান প্রদান করার আশা করে৷ এই উপাদানটি অ্যান্ড্রয়েড অ্যাকাউন্ট এবং প্রমাণীকরণ কাঠামোতে প্লাগ করে এবং লগইন তথ্যের মতো ব্যবহারকারীর শংসাপত্রগুলি পরিচালনা করার জন্য একটি আদর্শ ইন্টারফেস সরবরাহ করে।
এমনকি আপনার অ্যাপ অ্যাকাউন্ট ব্যবহার না করলেও, আপনাকে এখনও একটি প্রমাণীকরণকারী উপাদান প্রদান করতে হবে। আপনি অ্যাকাউন্ট বা সার্ভার লগইন ব্যবহার না করলে, প্রমাণীকরণকারীর দ্বারা পরিচালিত তথ্য উপেক্ষা করা হয়, তাই আপনি একটি প্রমাণীকরণকারী উপাদান প্রদান করতে পারেন যাতে স্টাব পদ্ধতি বাস্তবায়ন রয়েছে। আপনাকে একটি আবদ্ধ Service
প্রদান করতে হবে যা সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্ককে প্রমাণীকরণকারীর পদ্ধতিগুলিকে কল করার অনুমতি দেয়৷
এই পাঠটি আপনাকে দেখায় কিভাবে একটি স্টাব প্রমাণীকরণকারীর সমস্ত অংশগুলিকে সংজ্ঞায়িত করতে হয় যা আপনাকে সিঙ্ক অ্যাডাপ্টার কাঠামোর প্রয়োজনীয়তাগুলি পূরণ করতে হবে৷ ব্যবহারকারীর অ্যাকাউন্টগুলি পরিচালনা করে এমন একটি প্রকৃত প্রমাণীকরণকারী প্রদান করতে হলে, AbstractAccountAuthenticator
এর জন্য রেফারেন্স ডকুমেন্টেশন পড়ুন।
একটি স্টাব প্রমাণীকরণকারী উপাদান যোগ করুন
আপনার অ্যাপে একটি স্টাব প্রমাণীকরণকারী উপাদান যুক্ত করতে, একটি ক্লাস তৈরি করুন যা AbstractAccountAuthenticator
প্রসারিত করে এবং তারপরে প্রয়োজনীয় পদ্ধতিগুলি বাদ দিন, হয় null
ফিরিয়ে দিয়ে বা একটি ব্যতিক্রম ছুঁড়ে দিয়ে।
নিচের স্নিপেটটি একটি স্টাব প্রমাণীকরণকারী শ্রেণীর একটি উদাহরণ দেখায়:
কোটলিন
/* * Implement AbstractAccountAuthenticator and stub out all * of its methods */ class Authenticator(context: Context) // Simple constructor : AbstractAccountAuthenticator(context) { // Editing properties is not supported override fun editProperties(r: AccountAuthenticatorResponse, s: String): Bundle { throw UnsupportedOperationException() } // Don't add additional accounts @Throws(NetworkErrorException::class) override fun addAccount( r: AccountAuthenticatorResponse, s: String, s2: String, strings: Array<String>, bundle: Bundle ): Bundle? = null // Ignore attempts to confirm credentials @Throws(NetworkErrorException::class) override fun confirmCredentials( r: AccountAuthenticatorResponse, account: Account, bundle: Bundle ): Bundle? = null // Getting an authentication token is not supported @Throws(NetworkErrorException::class) override fun getAuthToken( r: AccountAuthenticatorResponse, account: Account, s: String, bundle: Bundle ): Bundle { throw UnsupportedOperationException() } // Getting a label for the auth token is not supported override fun getAuthTokenLabel(s: String): String { throw UnsupportedOperationException() } // Updating user credentials is not supported @Throws(NetworkErrorException::class) override fun updateCredentials( r: AccountAuthenticatorResponse, account: Account, s: String, bundle: Bundle ): Bundle { throw UnsupportedOperationException() } // Checking features for the account is not supported @Throws(NetworkErrorException::class) override fun hasFeatures( r: AccountAuthenticatorResponse, account: Account, strings: Array<String> ): Bundle { throw UnsupportedOperationException() } }
জাভা
/* * Implement AbstractAccountAuthenticator and stub out all * of its methods */ public class Authenticator extends AbstractAccountAuthenticator { // Simple constructor public Authenticator(Context context) { super(context); } // Editing properties is not supported @Override public Bundle editProperties( AccountAuthenticatorResponse r, String s) { throw new UnsupportedOperationException(); } // Don't add additional accounts @Override public Bundle addAccount( AccountAuthenticatorResponse r, String s, String s2, String[] strings, Bundle bundle) throws NetworkErrorException { return null; } // Ignore attempts to confirm credentials @Override public Bundle confirmCredentials( AccountAuthenticatorResponse r, Account account, Bundle bundle) throws NetworkErrorException { return null; } // Getting an authentication token is not supported @Override public Bundle getAuthToken( AccountAuthenticatorResponse r, Account account, String s, Bundle bundle) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Getting a label for the auth token is not supported @Override public String getAuthTokenLabel(String s) { throw new UnsupportedOperationException(); } // Updating user credentials is not supported @Override public Bundle updateCredentials( AccountAuthenticatorResponse r, Account account, String s, Bundle bundle) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Checking features for the account is not supported @Override public Bundle hasFeatures( AccountAuthenticatorResponse r, Account account, String[] strings) throws NetworkErrorException { throw new UnsupportedOperationException(); } }
ফ্রেমওয়ার্কের সাথে প্রমাণীকরণকারীকে আবদ্ধ করুন
আপনার প্রমাণীকরণকারী অ্যাক্সেস করার জন্য সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্কের জন্য, আপনাকে এটির জন্য একটি আবদ্ধ পরিষেবা তৈরি করতে হবে। এই পরিষেবাটি একটি অ্যান্ড্রয়েড বাইন্ডার অবজেক্ট প্রদান করে যা ফ্রেমওয়ার্ককে আপনার প্রমাণীকরণকারীকে কল করতে এবং প্রমাণীকরণকারী এবং ফ্রেমওয়ার্কের মধ্যে ডেটা পাস করার অনুমতি দেয়।
নিম্নলিখিত স্নিপেট আপনাকে দেখায় কিভাবে আবদ্ধ Service
সংজ্ঞায়িত করতে হয়:
কোটলিন
/** * A bound Service that instantiates the authenticator * when started. */ class AuthenticatorService : Service() { // Instance field that stores the authenticator object private lateinit var mAuthenticator: Authenticator override fun onCreate() { // Create a new authenticator object mAuthenticator = Authenticator(getApplicationContext()) } /* * When the system binds to this Service to make the RPC call * return the authenticator's IBinder. */ override fun onBind(intent: Intent?): IBinder = mAuthenticator.iBinder }
জাভা
/** * A bound Service that instantiates the authenticator * when started. */ public class AuthenticatorService extends Service { ... // Instance field that stores the authenticator object private Authenticator mAuthenticator; @Override public void onCreate() { // Create a new authenticator object mAuthenticator = new Authenticator(getApplicationContext()); } /* * When the system binds to this Service to make the RPC call * return the authenticator's IBinder. */ @Override public IBinder onBind(Intent intent) { return mAuthenticator.getIBinder(); } }
প্রমাণীকরণকারী মেটাডেটা ফাইল যোগ করুন
সিঙ্ক অ্যাডাপ্টার এবং অ্যাকাউন্ট ফ্রেমওয়ার্কগুলিতে আপনার প্রমাণীকরণকারী উপাদানটি প্লাগ করতে, আপনাকে মেটাডেটা সহ এই কাঠামো প্রদান করতে হবে যা উপাদানটির বর্ণনা দেয়। এই মেটাডেটা আপনার সিঙ্ক অ্যাডাপ্টারের জন্য আপনার তৈরি করা অ্যাকাউন্টের ধরণ ঘোষণা করে এবং ব্যবহারকারীর ইন্টারফেস উপাদানগুলি ঘোষণা করে যা সিস্টেমটি প্রদর্শন করে যদি আপনি আপনার অ্যাকাউন্টের ধরন ব্যবহারকারীর কাছে দৃশ্যমান করতে চান। আপনার অ্যাপ প্রকল্পের /res/xml/
ডিরেক্টরিতে সংরক্ষিত একটি XML ফাইলে এই মেটাডেটা ঘোষণা করুন। আপনি ফাইলটিকে যেকোনো নাম দিতে পারেন, যদিও এটিকে সাধারণত authenticator.xml
বলা হয়।
এই XML ফাইলটিতে একটি একক উপাদান <account-authenticator>
রয়েছে যার নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
-
android:accountType
- সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্কের জন্য প্রতিটি সিঙ্ক অ্যাডাপ্টারের একটি ডোমেন নামের আকারে একটি অ্যাকাউন্টের ধরন থাকা প্রয়োজন৷ ফ্রেমওয়ার্ক সিঙ্ক অ্যাডাপ্টারের অভ্যন্তরীণ সনাক্তকরণের অংশ হিসাবে অ্যাকাউন্টের ধরন ব্যবহার করে। যে সার্ভারগুলির জন্য লগইন প্রয়োজন, লগইন শংসাপত্রের অংশ হিসাবে একটি ব্যবহারকারীর অ্যাকাউন্ট সহ অ্যাকাউন্টের ধরন সার্ভারে পাঠানো হয়।
আপনার সার্ভারের লগইন প্রয়োজন না হলে, আপনাকে এখনও একটি অ্যাকাউন্টের ধরন প্রদান করতে হবে। মানটির জন্য, আপনি নিয়ন্ত্রণ করেন এমন একটি ডোমেন নাম ব্যবহার করুন। যদিও ফ্রেমওয়ার্ক আপনার সিঙ্ক অ্যাডাপ্টার পরিচালনা করতে এটি ব্যবহার করে, মানটি আপনার সার্ভারে পাঠানো হয় না।
-
android:icon
- একটি আইকন ধারণকারী একটি অঙ্কনযোগ্য সম্পদ নির্দেশক. আপনি যদি
res/xml/syncadapter.xml
এandroid:userVisible="true"
অ্যাট্রিবিউটটি নির্দিষ্ট করে সিঙ্ক অ্যাডাপ্টারটিকে দৃশ্যমান করেন, তাহলে আপনাকে অবশ্যই এই আইকন সংস্থানটি প্রদান করতে হবে৷ এটি সিস্টেমের সেটিংস অ্যাপের অ্যাকাউন্ট বিভাগে প্রদর্শিত হয়। -
android:smallIcon
- আইকনের একটি ছোট সংস্করণ ধারণকারী একটি অঙ্কনযোগ্য সম্পদের দিকে নির্দেশক৷ স্ক্রীনের আকারের উপর নির্ভর করে সিস্টেমের সেটিংস অ্যাপের অ্যাকাউন্ট বিভাগে
android:icon
এর পরিবর্তে এই সংস্থানটি ব্যবহার করা যেতে পারে। -
android:label
- স্থানীয়করণযোগ্য স্ট্রিং যা ব্যবহারকারীদের অ্যাকাউন্টের ধরন সনাক্ত করে। আপনি যদি
res/xml/syncadapter.xml
এandroid:userVisible="true"
অ্যাট্রিবিউটটি নির্দিষ্ট করে সিঙ্ক অ্যাডাপ্টারটিকে দৃশ্যমান করেন, তাহলে আপনার এই স্ট্রিংটি প্রদান করা উচিত। এটি সিস্টেমের সেটিংস অ্যাপের অ্যাকাউন্টস বিভাগে প্রদর্শিত হয়, আপনি প্রমাণীকরণকারীর জন্য সংজ্ঞায়িত আইকনের পাশে।
নিম্নলিখিত স্নিপেটটি আপনার পূর্বে তৈরি করা প্রমাণীকরণকারীর জন্য XML ফাইল দেখায়:
<?xml version="1.0" encoding="utf-8"?> <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="example.com" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@string/app_name"/>
ম্যানিফেস্টে প্রমাণীকরণকারী ঘোষণা করুন
পূর্ববর্তী ধাপে, আপনি একটি আবদ্ধ Service
তৈরি করেছেন যা প্রমাণীকরণকারীকে সিঙ্ক অ্যাডাপ্টার ফ্রেমওয়ার্কের সাথে লিঙ্ক করে। সিস্টেমে এই পরিষেবাটি সনাক্ত করতে, <application>
-এর একটি চাইল্ড এলিমেন্ট হিসাবে নিম্নলিখিত <service>
উপাদানটি যোগ করে আপনার অ্যাপ ম্যানিফেস্টে এটি ঘোষণা করুন:
<service android:name="com.example.android.syncadapter.AuthenticatorService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator"/> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
<intent-filter>
> উপাদানটি একটি ফিল্টার সেট আপ করে যা ইন্টেন্ট অ্যাকশন android.accounts.AccountAuthenticator
দ্বারা ট্রিগার হয়, যা প্রমাণীকরণকারী চালানোর জন্য সিস্টেম দ্বারা পাঠানো হয়। ফিল্টারটি ট্রিগার করা হলে, সিস্টেমটি AuthenticatorService
শুরু করে, আপনি প্রমাণীকরণকারীকে মোড়ানোর জন্য যে আবদ্ধ Service
প্রদান করেছেন।
<meta-data>
উপাদানটি প্রমাণীকরণকারীর জন্য মেটাডেটা ঘোষণা করে। android:name
অ্যাট্রিবিউট মেটা-ডেটাকে প্রমাণীকরণ কাঠামোর সাথে লিঙ্ক করে। android:resource
উপাদানটি আপনার পূর্বে তৈরি করা প্রমাণীকরণকারী মেটাডেটা ফাইলের নাম উল্লেখ করে।
একটি প্রমাণীকরণকারী ছাড়াও, একটি সিঙ্ক অ্যাডাপ্টারের জন্য একটি সামগ্রী প্রদানকারীরও প্রয়োজন৷ যদি আপনার অ্যাপটি ইতিমধ্যেই একটি বিষয়বস্তু প্রদানকারী ব্যবহার না করে, তাহলে কীভাবে একটি অসম্পূর্ণ সামগ্রী প্রদানকারী তৈরি করবেন তা শিখতে পরবর্তী পাঠে যান; অন্যথায়, একটি সিঙ্ক অ্যাডাপ্টার তৈরি করা পাঠে যান।