অটোফিলের জন্য আপনার অ্যাপটি অপ্টিমাইজ করুন

যে অ্যাপগুলি স্ট্যান্ডার্ড ভিউ ব্যবহার করে সেগুলি বিশেষ কনফিগারেশনের প্রয়োজন ছাড়াই অটোফিল ফ্রেমওয়ার্কের সাথে কাজ করে৷ আপনি ফ্রেমওয়ার্কের সাথে আপনার অ্যাপ কীভাবে কাজ করে তা অপ্টিমাইজ করতে পারেন।

অটোফিল পরিবেশ সেট আপ করুন

এই বিভাগটি বর্ণনা করে যে কীভাবে আপনার অ্যাপের জন্য মৌলিক স্বতঃপূর্ণ কার্যকারিতা সেট আপ করবেন।

একটি অটোফিল পরিষেবা কনফিগার করুন

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

আপনি নমুনা অ্যাপ থেকে পরীক্ষা অটোফিল পরিষেবা ইনস্টল করার পরে, সেটিংস > সিস্টেম > ভাষা ও ইনপুট > উন্নত > ইনপুট সহায়তা > অটোফিল পরিষেবাতে নেভিগেট করে অটোফিল পরিষেবা সক্ষম করুন।

অটোফিল পরীক্ষা করার জন্য একটি এমুলেটর কনফিগার করার বিষয়ে আরও তথ্যের জন্য, অটোফিল দিয়ে আপনার অ্যাপ পরীক্ষা করুন দেখুন।

স্বতঃপূরণের জন্য ইঙ্গিত প্রদান করুন

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

আপনি android:autofillHints অ্যাট্রিবিউট ব্যবহার করে অটোফিল ইঙ্গিত সেট করতে পারেন। নিম্নলিখিত উদাহরণটি একটি EditText এ একটি "password" ইঙ্গিত সেট করে:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autofillHints="password" />

এছাড়াও আপনি setAutofillHints() পদ্ধতি ব্যবহার করে প্রোগ্রামগতভাবে ইঙ্গিত সেট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val password = findViewById<EditText>(R.id.password)
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD)

জাভা

EditText password = findViewById(R.id.password);
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD);

পূর্বনির্ধারিত ইঙ্গিত ধ্রুবক অন্তর্ভুক্ত করুন

অটোফিল ফ্রেমওয়ার্ক ইঙ্গিত যাচাই করে না; সেগুলি অটোফিল পরিষেবাতে পরিবর্তন বা বৈধতা ছাড়াই পাস করা হয়। আপনি যেকোনো মান ব্যবহার করতে পারলেও, View এবং অ্যান্ড্রয়েডএক্স HintConstants ক্লাসে আনুষ্ঠানিকভাবে সমর্থিত ইঙ্গিত ধ্রুবকের তালিকা থাকে।

এই ধ্রুবকগুলির সংমিশ্রণ ব্যবহার করে, আপনি সাধারণ অটোফিল পরিস্থিতিগুলির জন্য লেআউট তৈরি করতে পারেন:

অ্যাকাউন্টের শংসাপত্র

একটি লগইন ফর্মে, আপনি AUTOFILL_HINT_USERNAME এবং AUTOFILL_HINT_PASSWORD মতো অ্যাকাউন্ট শংসাপত্রের ইঙ্গিতগুলি অন্তর্ভুক্ত করতে পারেন।

একটি নতুন অ্যাকাউন্ট তৈরি করার জন্য, অথবা ব্যবহারকারীরা যখন তাদের ব্যবহারকারীর নাম এবং পাসওয়ার্ড পরিবর্তন করেন, আপনি AUTOFILL_HINT_NEW_USERNAME এবং AUTOFILL_HINT_NEW_PASSWORD ব্যবহার করতে পারেন।

ক্রেডিট কার্ডের তথ্য

ক্রেডিট কার্ডের তথ্যের অনুরোধ করার সময়, আপনি AUTOFILL_HINT_CREDIT_CARD_NUMBER এবং AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন।

ক্রেডিট কার্ডের মেয়াদ শেষ হওয়ার তারিখের জন্য, নিম্নলিখিতগুলির মধ্যে একটি করুন:

শারীরিক ঠিকানা

প্রকৃত ঠিকানা ফর্ম ক্ষেত্রগুলির জন্য, আপনি নিম্নলিখিতগুলির মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন:

মানুষের নাম

লোকেদের নাম অনুরোধ করার সময়, আপনি নিম্নলিখিতগুলির মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন:

ফোন নম্বর

ফোন নম্বরগুলির জন্য, আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

  • একক ভিউতে একটি পূর্ণ ফোন নম্বর অনুরোধ করার সময়, AUTOFILL_HINT_PHONE_NUMBER ব্যবহার করুন।
  • যদি একটি ফোন নম্বরের বিভিন্ন অংশের জন্য পৃথক দৃষ্টিভঙ্গি ব্যবহার করা হয়, তাহলে আপনি নিম্নলিখিতগুলির যেকোনো একটি ব্যবহার করতে পারেন:

এককালীন পাসওয়ার্ড (OTP)

একটি একক ভিউতে এককালীন পাসওয়ার্ডের জন্য, আপনি AUTOFILL_HINT_SMS_OTP ব্যবহার করতে পারেন।

একাধিক ভিউয়ের জন্য যেখানে প্রতিটি ভিউ OTP-এর একটি একক অঙ্কে মানচিত্র করে, আপনি generateSmsOtpHintForCharacterPosition() পদ্ধতি ব্যবহার করতে পারেন প্রতি-অক্ষরের ইঙ্গিত তৈরি করতে।

অটোফিলের জন্য ক্ষেত্রগুলিকে গুরুত্বপূর্ণ হিসাবে চিহ্নিত করুন৷

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

যাইহোক, এমন কিছু ক্ষেত্রে আছে যখন একটি ভিউ, একটি ভিউ স্ট্রাকচার বা সম্পূর্ণ কার্যকলাপ অটোফিলের জন্য গুরুত্বপূর্ণ নয়:

  • লগইন কার্যকলাপে একটি CAPTCHA ক্ষেত্র
  • একটি দৃশ্য যেখানে ব্যবহারকারী সামগ্রী তৈরি করে, যেমন একটি পাঠ্য বা স্প্রেডশীট সম্পাদক৷
  • গেমের মধ্যে কিছু কার্যকলাপের ভিউ, যেমন গেমপ্লে প্রদর্শন করে

আপনি android:importantForAutofill বৈশিষ্ট্য ব্যবহার করে অটোফিলের জন্য একটি ভিউ এর গুরুত্ব সেট করতে পারেন:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:importantForAutofill="no" />

importantForAutofill এর মান নিম্নলিখিত যেকোনও হতে পারে:

auto
ভিউটি অটোফিলের জন্য গুরুত্বপূর্ণ কিনা তা নির্ধারণ করতে Android সিস্টেমকে তার হিউরিস্টিক ব্যবহার করতে দিন।
no
অটোফিলের জন্য এই দৃশ্যটি গুরুত্বপূর্ণ নয়।
noExcludeDescendants
এই ভিউ এবং এর বাচ্চাদের অটোফিলের জন্য গুরুত্বপূর্ণ নয়।
yes
এই দৃশ্যটি স্বয়ংক্রিয়ভাবে পূরণের জন্য গুরুত্বপূর্ণ।
yesExcludeDescendants
এই ভিউটি অটোফিলের জন্য গুরুত্বপূর্ণ, কিন্তু এর বাচ্চারা অটোফিলের জন্য গুরুত্বপূর্ণ নয়৷

আপনি setImportantForAutofill() পদ্ধতিটিও ব্যবহার করতে পারেন:

কোটলিন

val captcha = findViewById<TextView>(R.id.captcha)
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO)

জাভা

TextView captcha = findViewById(R.id.captcha);
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);

আপনি নিম্নোক্তভাবে স্বয়ংক্রিয়ভাবে পূরণের জন্য পূর্ববর্তী উদাহরণ ব্যবহারের ক্ষেত্রে গুরুত্বহীন ঘোষণা করতে পারেন:

  • একটি লগইন কার্যকলাপে একটি CAPTCHA ক্ষেত্র: এই দৃশ্যটিকে গুরুত্বহীন হিসাবে চিহ্নিত করতে android:importantForAutofill="no" বা IMPORTANT_FOR_AUTOFILL_NO ব্যবহার করুন৷
  • একটি ভিউ যেখানে ব্যবহারকারী কন্টেন্ট তৈরি করে: পুরো ভিউ স্ট্রাকচারটিকে গুরুত্বহীন হিসেবে চিহ্নিত করতে android:importantForAutofill="noExcludeDescendants" বা IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS ব্যবহার করুন।
  • গেমের মধ্যে কিছু ক্রিয়াকলাপের ভিউ: পুরো ভিউ স্ট্রাকচারটিকে গুরুত্বহীন হিসেবে চিহ্নিত করতে android:importantForAutofill="noExcludeDescendants" বা IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS ব্যবহার করুন।

সহযোগী ওয়েবসাইট এবং মোবাইল অ্যাপ ডেটা

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

আপনার ওয়েবসাইটের সাথে আপনার অ্যান্ড্রয়েড অ্যাপ যুক্ত করতে, আপনার সাইটে delegate_permission/common.get_login_creds সম্পর্ক সহ একটি ডিজিটাল সম্পদ লিঙ্ক হোস্ট করুন। তারপর, আপনার অ্যাপের AndroidManifest.xml ফাইলে অ্যাসোসিয়েশন ঘোষণা করুন। আপনার অ্যান্ড্রয়েড অ্যাপের সাথে কীভাবে আপনার ওয়েবসাইট সংযুক্ত করবেন সে সম্পর্কে বিস্তারিত নির্দেশাবলীর জন্য, অ্যাপ এবং ওয়েবসাইট জুড়ে স্বয়ংক্রিয় সাইন-ইন সক্ষম করুন দেখুন।

একটি অটোফিল ওয়ার্কফ্লো সম্পূর্ণ করুন

এই বিভাগটি নির্দিষ্ট পরিস্থিতিতে বর্ণনা করে যেখানে আপনি আপনার অ্যাপের ব্যবহারকারীদের জন্য অটোফিল কার্যকারিতা উন্নত করতে পদক্ষেপ নিতে পারেন।

অটোফিল সক্ষম কিনা তা নির্ধারণ করুন

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

উদাহরণস্বরূপ, TextView ব্যবহারকারীর জন্য অটোফিল সক্ষম করা থাকলে ওভারফ্লো মেনুতে একটি অটোফিল এন্ট্রি দেখায়। ব্যবহারকারীর জন্য অটোফিল সক্ষম হয়েছে কিনা তা পরীক্ষা করতে, AutofillManager অবজেক্টের isEnabled() পদ্ধতিতে কল করুন।

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

একটি স্বতঃপূরণ অনুরোধ জোর করুন

কখনও কখনও আপনাকে একটি ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়া হিসাবে একটি অটোফিল অনুরোধ ঘটতে বাধ্য করতে হবে৷ উদাহরণস্বরূপ, TextView একটি অটোফিল মেনু আইটেম অফার করে যখন ব্যবহারকারী ভিউতে স্পর্শ করে ধরে রাখে। নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে একটি অটোফিল অনুরোধ জোর করে:

কোটলিন

fun eventHandler(view: View) {
    val afm = requireContext().getSystemService(AutofillManager::class.java)
    afm?.requestAutofill(view)
}

জাভা

public void eventHandler(View view) {
    AutofillManager afm = context.getSystemService(AutofillManager.class);
    if (afm != null) {
        afm.requestAutofill(view);
    }
}

আপনি বর্তমান অটোফিল প্রসঙ্গ বাতিল করতে cancel() পদ্ধতি ব্যবহার করতে পারেন। আপনার যদি একটি বোতাম থাকে যা লগইন পৃষ্ঠার ক্ষেত্রগুলি সাফ করে তবে এটি কার্যকর হতে পারে।

পিকার কন্ট্রোলে ডেটার জন্য সঠিক অটোফিল টাইপ ব্যবহার করুন

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

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

আপনি যখন অটোফিল ডেটা টাইপ নির্দিষ্ট করেন, অটোফিল পরিষেবা ভিউতে প্রদর্শিত ডেটার উপযুক্ত উপস্থাপনা তৈরি করতে পারে। আরও তথ্যের জন্য, অটোফিল সহ পিকার ব্যবহার করুন দেখুন।

অটোফিল প্রসঙ্গ শেষ করুন

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

কাস্টম ভিউ জন্য সমর্থন

কাস্টম ভিউ অটোফিল API ব্যবহার করে অটোফিল ফ্রেমওয়ার্কের সাথে উন্মুক্ত হওয়া মেটাডেটা নির্দিষ্ট করতে পারে। কিছু দৃশ্য ভার্চুয়াল শিশুদের একটি ধারক হিসাবে কাজ করে, যেমন ওপেনজিএল-রেন্ডার করা UI ধারণ করে। অটোফিল ফ্রেমওয়ার্কের সাথে কাজ করার আগে এই দৃশ্যগুলিকে অ্যাপে ব্যবহৃত তথ্যের কাঠামো নির্দিষ্ট করতে API ব্যবহার করতে হবে।

আপনার অ্যাপ যদি কাস্টম ভিউ ব্যবহার করে, তাহলে নিম্নলিখিত পরিস্থিতি বিবেচনা করুন:

  • কাস্টম ভিউ একটি স্ট্যান্ডার্ড ভিউ স্ট্রাকচার বা একটি ডিফল্ট ভিউ স্ট্রাকচার প্রদান করে।
  • কাস্টম ভিউটির একটি ভার্চুয়াল স্ট্রাকচার আছে, বা একটি ভিউ স্ট্রাকচার আছে যা অটোফিল ফ্রেমওয়ার্কের জন্য উপলব্ধ নয়।

স্ট্যান্ডার্ড ভিউ স্ট্রাকচার সহ কাস্টম ভিউ

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

  • ফ্রেমওয়ার্ক আপনার অ্যাপে যে অটোফিল মান পাঠায় তা পরিচালনা করুন।
  • ফ্রেমওয়ার্কে অটোফিলের ধরন এবং মান প্রদান করুন।

যখন অটোফিল ট্রিগার হয়, তখন অটোফিল ফ্রেমওয়ার্ক আপনার ভিউতে autofill() কল করে এবং আপনার ভিউ ব্যবহার করা আবশ্যক মান পাঠায়। আপনার কাস্টম ভিউ কীভাবে অটোফিল মান পরিচালনা করে তা নির্দিষ্ট করতে autofill() প্রয়োগ করুন।

আপনার ভিউ অবশ্যই getAutofillType() এবং getAutofillValue() পদ্ধতিগুলিকে ওভাররাইড করে একটি অটোফিল প্রকার এবং মান নির্দিষ্ট করতে হবে।

পরিশেষে, অটোফিল অবশ্যই ভিউটি পূরণ করবে না যদি ব্যবহারকারী তার বর্তমান অবস্থায় ভিউটির জন্য একটি মান প্রদান করতে না পারে—উদাহরণস্বরূপ, যদি ভিউটি অক্ষম থাকে। এই ক্ষেত্রে, getAutofillType() অবশ্যই AUTOFILL_TYPE_NONE ফেরত দিতে হবে, getAutofillValue() null দিতে হবে, এবং autofill() কিছুই করতে হবে না।

নিম্নলিখিত ক্ষেত্রে কাঠামোর মধ্যে সঠিকভাবে কাজ করার জন্য অতিরিক্ত পদক্ষেপের প্রয়োজন:

  • কাস্টম ভিউ সম্পাদনাযোগ্য।
  • কাস্টম ভিউতে সংবেদনশীল ডেটা থাকে।

কাস্টম ভিউ সম্পাদনাযোগ্য

যদি ভিউটি সম্পাদনাযোগ্য হয়, তাহলে AutofillManager অবজেক্টে notifyValueChanged() কল করে পরিবর্তন সম্পর্কে স্বতঃপূর্ণ ফ্রেমওয়ার্ককে অবহিত করুন।

কাস্টম ভিউতে সংবেদনশীল ডেটা থাকে

যদি কোনো দৃশ্যে ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য (PII) যেমন ইমেল ঠিকানা, ক্রেডিট কার্ড নম্বর এবং পাসওয়ার্ড থাকে, তাহলে সেটিকে অবশ্যই সংবেদনশীল হিসেবে চিহ্নিত করতে হবে।

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

অটোফিল ফ্রেমওয়ার্ক অনুমান করে যে সমস্ত ডেটা ডিফল্টরূপে সংবেদনশীল। আপনি সংবেদনশীল নয় এমন ডেটা চিহ্নিত করতে পারেন।

একটি ভিউতে সংবেদনশীল ডেটা আছে কিনা তা চিহ্নিত করতে, onProvideAutofillStructure() প্রয়োগ করুন এবং ViewStructure অবজেক্টে setDataIsSensitive() কল করুন।

নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে সংবেদনশীল নয় হিসাবে ভিউ স্ট্রাকচারে ডেটা চিহ্নিত করতে হয়:

কোটলিন

override fun onProvideAutofillStructure(structure: ViewStructure, flags: Int) {
    super.onProvideAutofillStructure(structure, flags)

    structure.setDataIsSensitive(false)
}

জাভা

@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
    super.onProvideAutofillStructure(structure, flags);

    structure.setDataIsSensitive(false);
}

যদি একটি ভিউ শুধুমাত্র পূর্বনির্ধারিত মান গ্রহণ করে, তাহলে আপনি setAutofillOptions() পদ্ধতি ব্যবহার করে বিকল্পগুলি সেট করতে পারেন যা ভিউটি স্বয়ংক্রিয়ভাবে পূরণ করতে ব্যবহার করা যেতে পারে। বিশেষ করে, যে ভিউগুলির অটোফিল প্রকার AUTOFILL_TYPE_LIST তাদের অবশ্যই এই পদ্ধতিটি ব্যবহার করতে হবে, কারণ অটোফিল পরিষেবাটি আরও ভাল কাজ করতে পারে যদি এটি ভিউটি পূরণ করার জন্য উপলব্ধ বিকল্পগুলি জানে৷

যে ভিউগুলি অ্যাডাপ্টার ব্যবহার করে, যেমন একটি Spinner , একটি অনুরূপ কেস। উদাহরণ স্বরূপ, ক্রেডিট কার্ডের মেয়াদ শেষ হওয়ার ক্ষেত্রে ব্যবহার করার জন্য বর্তমান বছরের উপর ভিত্তি করে গতিশীলভাবে তৈরি বছর প্রদান করে এমন একটি স্পিনার বছরের তালিকা প্রদান করতে Adapter ইন্টারফেসের getAutofillOptions() পদ্ধতি প্রয়োগ করতে পারে।

যে ভিউগুলি একটি ArrayAdapter ব্যবহার করে সেগুলিও মানগুলির তালিকা প্রদান করতে পারে। ArrayAdapter স্বয়ংক্রিয়ভাবে স্ট্যাটিক রিসোর্সের জন্য অটোফিল বিকল্প সেট করে। আপনি যদি গতিশীলভাবে মান প্রদান করেন, তাহলে getAutofillOptions() ওভাররাইড করুন।

ভার্চুয়াল স্ট্রাকচার সহ কাস্টম ভিউ

অটোফিল ফ্রেমওয়ার্ক আপনার অ্যাপের UI এ তথ্য সম্পাদনা ও সংরক্ষণ করার আগে একটি ভিউ স্ট্রাকচারের প্রয়োজন। নিম্নলিখিত পরিস্থিতিতে কাঠামোর জন্য দৃশ্য কাঠামো উপলব্ধ নয়:

  • অ্যাপটি UI রেন্ডার করার জন্য একটি নিম্ন-স্তরের রেন্ডারিং ইঞ্জিন, যেমন OpenGL ব্যবহার করে।
  • অ্যাপটি UI আঁকতে Canvas একটি উদাহরণ ব্যবহার করে।

এই ক্ষেত্রে, আপনি onProvideAutofillVirtualStructure() প্রয়োগ করে এবং এই পদক্ষেপগুলি অনুসরণ করে একটি দৃশ্য কাঠামো নির্দিষ্ট করতে পারেন:

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

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে ভার্চুয়াল কাঠামোতে একটি নতুন শিশু তৈরি করতে হয়:

কোটলিন

override fun onProvideAutofillVirtualStructure(structure: ViewStructure, flags: Int) {

    super.onProvideAutofillVirtualStructure(structure, flags)

    // Create a new child in the virtual structure.
    structure.addChildCount(1)
    val child = structure.newChild(childIndex)

    // Set the autofill ID for the child.
    child.setAutofillId(structure.autofillId!!, childVirtualId)

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue)
    child.setAutofillType(childAutofillType)

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    val childAutofillOptions = arrayOf<CharSequence>("option1", "option2")
    child.setAutofillOptions(childAutofillOptions)

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    val sensitive = !contentIsSetFromResources()
    child.setDataIsSensitive(sensitive)
}

জাভা

@Override
public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {

    super.onProvideAutofillVirtualStructure(structure, flags);

    // Create a new child in the virtual structure.
    structure.addChildCount(1);
    ViewStructure child =
            structure.newChild(childIndex);

    // Set the autofill ID for the child.
    child.setAutofillId(structure.getAutofillId(), childVirtualId);

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue);
    child.setAutofillType(childAutofillType);

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    CharSequence childAutofillOptions[] = { "option1", "option2" };
    child.setAutofillOptions(childAutofillOptions);

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    boolean sensitive = !contentIsSetFromResources();
    child.setDataIsSensitive(sensitive);
}

ভার্চুয়াল কাঠামোর উপাদানগুলি পরিবর্তন হলে, নিম্নলিখিত কাজগুলি সম্পাদন করে কাঠামোটিকে অবহিত করুন:

  • বাচ্চাদের ভিতরে ফোকাস পরিবর্তন হলে, AutofillManager অবজেক্টে notifyViewEntered() এবং notifyViewExited() কল করুন।
  • যদি একটি শিশুর মান পরিবর্তন হয়, AutofillManager অবজেক্টে notifyValueChanged() কল করুন।
  • যদি ভিউ হায়ারার্কি আর উপলভ্য না থাকে কারণ ব্যবহারকারী ওয়ার্কফ্লোতে একটি ধাপ সম্পন্ন করেছে, যেমন যখন তারা লগইন ফর্ম ব্যবহার করে সাইন ইন করে, AutofillManager অবজেক্টে commit() কল করুন।
  • যদি ভিউ হায়ারার্কি বৈধ না হয় কারণ ব্যবহারকারী ওয়ার্কফ্লোতে একটি ধাপ বাতিল করেছে, যেমন ব্যবহারকারী যখন একটি বাটনে ট্যাপ করে যা একটি লগইন ফর্ম সাফ করে, তাহলে AutofillManager অবজেক্টে cancel() কল করুন।

অটোফিল ইভেন্টে কলব্যাক ব্যবহার করুন

যদি আপনার অ্যাপটি তার নিজস্ব স্বয়ংসম্পূর্ণ দৃশ্য প্রদান করে, তাহলে আপনার এমন একটি ব্যবস্থার প্রয়োজন যা অ্যাপটিকে UI অটোফিল সামর্থ্যের পরিবর্তনের প্রতিক্রিয়া হিসাবে দৃশ্যগুলি সক্ষম বা অক্ষম করতে বলে। অটোফিল ফ্রেমওয়ার্ক AutofillCallback আকারে এই প্রক্রিয়াটি প্রদান করে।

এই শ্রেণীটি onAutofillEvent(View, int) পদ্ধতি প্রদান করে, যা একটি দৃশ্যের সাথে যুক্ত স্বতঃপূর্ণ অবস্থার পরিবর্তনের পরে অ্যাপটি কল করে। এই পদ্ধতির একটি ওভারলোডেড সংস্করণ রয়েছে যাতে একটি childId প্যারামিটার রয়েছে যা আপনার অ্যাপ ভার্চুয়াল ভিউয়ের সাথে ব্যবহার করতে পারে। উপলব্ধ রাজ্যগুলিকে কলব্যাকে ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়।

আপনি AutofillManager ক্লাসের registerCallback() পদ্ধতি ব্যবহার করে একটি কলব্যাক নিবন্ধন করতে পারেন। নিম্নোক্ত কোড উদাহরণ দেখায় কিভাবে স্বতঃপূর্ণ ইভেন্টের জন্য একটি কলব্যাক ঘোষণা করতে হয়:

কোটলিন

val afm = context.getSystemService(AutofillManager::class.java)

afm?.registerCallback(object : AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    override fun onAutofillEvent(view: View, event: Int) {
        super.onAutofillEvent(view, event)
        when (event) {
            EVENT_INPUT_HIDDEN -> {
                // The autofill affordance associated with the view was hidden.
            }
            EVENT_INPUT_SHOWN -> {
                // The autofill affordance associated with the view was shown.
            }
            EVENT_INPUT_UNAVAILABLE -> {
                // Autofill isn't available.
            }
        }

    }
})

জাভা

AutofillManager afm = getContext().getSystemService(AutofillManager.class);

afm.registerCallback(new AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    @Override
    public void onAutofillEvent(@NonNull View view, int event) {
        super.onAutofillEvent(view, event);
        switch (event) {
            case EVENT_INPUT_HIDDEN:
                // The autofill affordance associated with the view was hidden.
                break;
            case EVENT_INPUT_SHOWN:
                // The autofill affordance associated with the view was shown.
                break;
            case EVENT_INPUT_UNAVAILABLE:
                // Autofill isn't available.
                break;
        }
    }
});

কলব্যাক অপসারণের সময় হলে, unregisterCallback() পদ্ধতি ব্যবহার করুন।

অটোফিল হাইলাইট করা অঙ্কনযোগ্য কাস্টমাইজ করুন

যখন একটি দৃশ্য স্বয়ংক্রিয়ভাবে পূরণ করা হয়, তখন প্ল্যাটফর্মটি দৃশ্যের বিষয়বস্তুগুলি স্বয়ংক্রিয়ভাবে পূরণ হয়েছে তা নির্দেশ করার জন্য ভিউটির উপরে একটি Drawable রেন্ডার করে। ডিফল্টরূপে, এই অঙ্কনযোগ্য একটি স্বচ্ছ রঙ সহ একটি কঠিন আয়তক্ষেত্র যা ব্যাকগ্রাউন্ড আঁকতে ব্যবহৃত থিমের রঙের চেয়ে সামান্য গাঢ়। অঙ্কনযোগ্য পরিবর্তন করার প্রয়োজন নেই, তবে অ্যাপ্লিকেশন বা কার্যকলাপ দ্বারা ব্যবহৃত থিমের android:autofilledHighlight আইটেমটিকে ওভাররাইড করে এটি কাস্টমাইজ করা যেতে পারে, যেমন এই উদাহরণে দেখানো হয়েছে:

res/values/styles.xml

<resources>
    <style name="MyAutofilledHighlight" parent="...">
        <item name="android:autofilledHighlight">@drawable/my_drawable</item>
    </style>
</resources>

res/drawable/my_drawable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#4DFF0000" />
</shape>

AndroidManifest.xml

<application ...
    android:theme="@style/MyAutofilledHighlight">
<!-- or -->
<activity ...
    android:theme="@style/MyAutofilledHighlight">

স্বয়ংক্রিয়ভাবে পূরণের জন্য প্রমাণীকরণ করুন

একটি অটোফিল পরিষেবার জন্য পরিষেবাটি আপনার অ্যাপের ক্ষেত্রগুলি সম্পূর্ণ করার আগে ব্যবহারকারীকে প্রমাণীকরণের প্রয়োজন হতে পারে, এই ক্ষেত্রে Android সিস্টেম আপনার কার্যকলাপের স্ট্যাকের অংশ হিসাবে পরিষেবাটির প্রমাণীকরণ কার্যকলাপ চালু করে৷

প্রমাণীকরণ সমর্থন করার জন্য আপনাকে আপনার অ্যাপ আপডেট করার দরকার নেই, কারণ প্রমাণীকরণ পরিষেবার মধ্যেই ঘটে। যাইহোক, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাক্টিভিটি রিস্টার্ট করার সময় ক্রিয়াকলাপের ভিউ স্ট্রাকচার সংরক্ষণ করা হয়েছে, যেমন onCreate() এ ভিউ স্ট্রাকচার তৈরি করে, onStart() বা onResume() এ নয়।

অটোফিল ফ্রেমওয়ার্ক নমুনা থেকে HeuristicsService ব্যবহার করে এবং ফিল রেসপন্স প্রমাণীকরণের প্রয়োজনের জন্য কনফিগার করে একটি অটোফিল পরিষেবার জন্য প্রমাণীকরণের প্রয়োজন হলে আপনার অ্যাপ কীভাবে আচরণ করে তা আপনি যাচাই করতে পারেন। আপনি এই সমস্যাটি অনুকরণ করতে BadViewStructureCreationSignInActivity নমুনাও ব্যবহার করতে পারেন।

পুনর্ব্যবহৃত দৃশ্যগুলিতে অটোফিল আইডি বরাদ্দ করুন

যে কন্টেনারগুলি ভিউ রিসাইকেল করে, যেমন RecyclerView ক্লাস, সেই অ্যাপগুলির জন্য দরকারী যেগুলি বড় ডেটা সেটের উপর ভিত্তি করে উপাদানগুলির স্ক্রলিং তালিকা প্রদর্শন করতে হবে৷ কন্টেইনার স্ক্রোল করার সাথে সাথে, সিস্টেম লেআউটে ভিউ পুনঃব্যবহার করে, কিন্তু ভিউতে নতুন কন্টেন্ট থাকে।

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

Android 9 (API লেভেল 28) এবং উচ্চতর চলমান ডিভাইসগুলিতে এই সমস্যাটি সমাধান করতে, এই পদ্ধতিগুলি ব্যবহার করে RecyclerView দ্বারা ব্যবহৃত ভিউগুলির স্বতঃপূর্ণ আইডি স্পষ্টভাবে পরিচালনা করুন:

  • getNextAutofillId() পদ্ধতি একটি নতুন অটোফিল আইডি পায় যা কার্যকলাপের জন্য অনন্য।
  • setAutofillId() পদ্ধতিটি কার্যকলাপে এই দৃশ্যের অনন্য, যৌক্তিক অটোফিল আইডি সেট করে।

পরিচিত সমস্যা সমাধান করুন

এই বিভাগটি অটোফিল ফ্রেমওয়ার্কের মধ্যে পরিচিত সমস্যাগুলির সমাধান উপস্থাপন করে।

অটোফিলের কারণে অ্যাপ্লিকেশানগুলি Android 8.0, 8.1-এ ক্র্যাশ হয়ে যায়৷

Android 8.0 (API লেভেল 26) এবং 8.1 (API লেভেল 27) এ, অটোফিল নির্দিষ্ট পরিস্থিতিতে আপনার অ্যাপ ক্র্যাশ করতে পারে। সম্ভাব্য সমস্যার সমাধান করার জন্য, importantForAutofill=no দিয়ে স্বয়ংক্রিয়ভাবে পূরণ করা নয় এমন যেকোনো ভিউ ট্যাগ করুন। এছাড়াও আপনি importantForAutofill=noExcludeDescendants দিয়ে পুরো কার্যকলাপকে ট্যাগ করতে পারেন।

রিসাইজ করা ডায়ালগ অটোফিলের জন্য বিবেচনা করা হয় না

অ্যান্ড্রয়েড 8.1 (এপিআই লেভেল 27) এবং তার নিচে, যদি একটি ডায়ালগের একটি ভিউ ইতিমধ্যে প্রদর্শিত হওয়ার পরে পুনরায় আকার দেওয়া হয়, তাহলে ভিউটি স্বয়ংক্রিয়ভাবে পূরণের জন্য বিবেচনা করা হয় না। এই ভিউগুলি AssistStructure অবজেক্টে অন্তর্ভুক্ত নয় যা Android সিস্টেম স্বতঃপূর্ণ পরিষেবাতে পাঠায়। ফলস্বরূপ, পরিষেবাটি দর্শনগুলি পূরণ করতে পারে না।

এই সমস্যাটি সমাধান করার জন্য, ডায়ালগ উইন্ডো প্যারামিটারের token প্রপার্টিটিকে সেই কার্যকলাপের token প্রপার্টির সাথে প্রতিস্থাপন করুন যা ডায়ালগ তৈরি করে। অটোফিল সক্ষম করা হয়েছে তা যাচাই করার পরে, Dialog থেকে উত্তরাধিকারসূত্রে পাওয়া ক্লাসের onWindowAttributesChanged() পদ্ধতিতে উইন্ডো প্যারামিটারগুলি সংরক্ষণ করুন। তারপর, onAttachedToWindow() পদ্ধতিতে প্যারেন্ট কার্যকলাপের token সম্পত্তির সাথে সংরক্ষিত প্যারামিটারের token সম্পত্তি প্রতিস্থাপন করুন।

নিম্নলিখিত কোড স্নিপেটটি একটি ক্লাস দেখায় যা এই সমাধানটি প্রয়োগ করে:

কোটলিন

class MyDialog(context: Context) : Dialog(context) {

    // Used to store the dialog window parameters.
    private var token: IBinder? = null

    private val isDialogResizedWorkaroundRequired: Boolean
        get() {
            if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
                return false
            }
            val autofillManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                context.getSystemService(AutofillManager::class.java)
            } else {
                null
            }
            return autofillManager?.isEnabled ?: false
        }

    override fun onWindowAttributesChanged(params: WindowManager.LayoutParams) {
        if (params.token == null && token != null) {
            params.token = token
        }

        super.onWindowAttributesChanged(params)
    }

    override fun onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired) {
            token = ownerActivity!!.window.attributes.token
        }

        super.onAttachedToWindow()
    }

}

জাভা

public class MyDialog extends Dialog {

    public MyDialog(Context context) {
        super(context);
    }

    // Used to store the dialog window parameters.
    private IBinder token;

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
        if (params.token == null && token != null) {
            params.token = token;
        }

        super.onWindowAttributesChanged(params);
    }

    @Override
    public void onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired()) {
            token = getOwnerActivity().getWindow().getAttributes().token;
        }

        super.onAttachedToWindow();
    }

    private boolean isDialogResizedWorkaroundRequired() {
        if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O
                || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
            return false;
        }
        AutofillManager autofillManager =
                null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            autofillManager = getContext().getSystemService(AutofillManager.class);
        }
        return autofillManager != null && autofillManager.isEnabled();
    }

}

অপ্রয়োজনীয় ক্রিয়াকলাপ এড়াতে, নিম্নলিখিত কোড স্নিপেটটি ডিভাইসে স্বয়ংক্রিয়ভাবে পূরণ করা সমর্থিত এবং বর্তমান ব্যবহারকারীর জন্য সক্ষম কিনা এবং এই সমাধানের প্রয়োজন কিনা তা কীভাবে পরীক্ষা করা যায় তা দেখায়:

কোটলিন

// AutofillExtensions.kt

fun Context.isDialogResizedWorkaroundRequired(): Boolean {
    // After the issue is resolved on Android, check whether the
    // workaround is still required for the current device.
    return isAutofillAvailable()
}

fun Context.isAutofillAvailable(): Boolean {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        // The autofill framework is available on Android 8.0
        // or higher.
        return false
    }

    val afm = getSystemService(AutofillManager::class.java)
    // Return true if autofill is supported by the device and enabled
    // for the current user.
    return afm != null && afm.isEnabled
}

জাভা

public class AutofillHelper {

    public static boolean isDialogResizedWorkaroundRequired(Context context) {
        // After the issue is resolved on Android, check whether the
        // workaround is still required for the current device.
        return isAutofillAvailable(context);
    }

    public static boolean isAutofillAvailable(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            // The autofill framework is available on Android 8.0
            // or higher.
            return false;
        }

        AutofillManager afm = context.getSystemService(AutofillManager.class);
        // Return true if autofill is supported by the device and enabled
        // for the current user.
        return afm != null && afm.isEnabled();
    }
}

অটোফিল দিয়ে আপনার অ্যাপ পরীক্ষা করুন

আপনি অটোফিল পরিষেবাগুলির সাথে কাজ করার জন্য আপনার অ্যাপটি অপ্টিমাইজ করার পরে, এটি অটোফিল পরিষেবাগুলির সাথে কাজ করে কিনা তা পরীক্ষা করুন৷

আপনার অ্যাপ পরীক্ষা করতে একটি এমুলেটর বা Android 8.0 (API লেভেল 26) বা উচ্চতর চলমান একটি ফিজিক্যাল ডিভাইস ব্যবহার করুন। কিভাবে একটি এমুলেটর তৈরি করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, ভার্চুয়াল ডিভাইস তৈরি এবং পরিচালনা দেখুন।

একটি অটোফিল পরিষেবা ইনস্টল করুন৷

আপনি অটোফিল দিয়ে আপনার অ্যাপ পরীক্ষা করার আগে, আপনাকে অটোফিল পরিষেবা প্রদান করে এমন অন্য অ্যাপ ইনস্টল করতে হবে। আপনি এই উদ্দেশ্যে একটি তৃতীয় পক্ষের অ্যাপ ব্যবহার করতে পারেন, তবে একটি নমুনা স্বয়ংক্রিয় পূরণ পরিষেবা ব্যবহার করা সহজ যাতে আপনাকে তৃতীয় পক্ষের পরিষেবাগুলির জন্য সাইন আপ করতে না হয়৷

আপনি জাভাতে Android অটোফিল ফ্রেমওয়ার্ক নমুনা ব্যবহার করতে পারেন অটোফিল পরিষেবাগুলির সাথে আপনার অ্যাপটি পরীক্ষা করতে৷ নমুনা অ্যাপটি একটি অটোফিল পরিষেবা এবং ক্লায়েন্ট Activity ক্লাস সরবরাহ করে যা আপনি আপনার অ্যাপের সাথে ব্যবহার করার আগে ওয়ার্কফ্লো পরীক্ষা করতে ব্যবহার করতে পারেন। এই পৃষ্ঠাটি android-AutofillFramework নমুনা অ্যাপের উল্লেখ করে।

আপনি অ্যাপটি ইনস্টল করার পরে, সেটিংস > সিস্টেম > ভাষা ও ইনপুট > উন্নত > ইনপুট সহায়তা > অটোফিল পরিষেবাতে নেভিগেট করে এমুলেটরের সিস্টেম সেটিংসে অটোফিল পরিষেবা সক্ষম করুন।

ডেটা প্রয়োজনীয়তা বিশ্লেষণ করুন

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

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

আপনার পরীক্ষা চালান

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

পরিষেবাতে ডেটা সংরক্ষণ করুন

বর্তমানে সক্রিয় অটোফিল পরিষেবাতে ডেটা সংরক্ষণ করতে, নিম্নলিখিতগুলি করুন:

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

যদি অ্যান্ড্রয়েড অনুমতি ডায়ালগ প্রদর্শন না করে, অথবা যদি পরিষেবাটি এমন না হয় যা আপনি আপনার পরীক্ষায় ব্যবহার করতে চান, তাহলে চেক করুন যে পরিষেবাটি বর্তমানে সিস্টেম সেটিংসে সক্রিয় আছে।

আপনার অ্যাপে অটোফিল ট্রিগার করুন

আপনার অ্যাপে অটোফিল ট্রিগার করতে, নিম্নলিখিতগুলি করুন:

  1. আপনার অ্যাপ খুলুন এবং আপনি পরীক্ষা করতে চান এমন ভিউ আছে এমন কার্যকলাপে যান।
  2. যে ভিউটি পূরণ করতে হবে সেটিতে ট্যাপ করুন।
  3. সিস্টেমটি অটোফিল UI প্রদর্শন করে, এতে ডেটাসেট রয়েছে যা ভিউটি পূরণ করতে পারে, যেমন চিত্র 1-এ দেখানো হয়েছে।
  4. আপনি যে ডেটা ব্যবহার করতে চান সেই ডেটাসেটে ট্যাপ করুন। ভিউটি পরিষেবাতে পূর্বে সংরক্ষিত ডেটা প্রদর্শন করে।
অটোফিল UI একটি উপলব্ধ ডেটাসেট হিসাবে "ডেটাসেট-2" প্রদর্শন করছে
চিত্র 1. অটোফিল UI উপলব্ধ ডেটাসেটগুলি প্রদর্শন করছে।

যদি অ্যান্ড্রয়েড অটোফিল UI প্রদর্শন না করে, আপনি নিম্নলিখিত সমস্যা সমাধানের বিকল্পগুলি চেষ্টা করতে পারেন:

  • আপনার অ্যাপের ভিউগুলি android:autofillHints অ্যাট্রিবিউটে সঠিক মান ব্যবহার করছে কিনা তা পরীক্ষা করুন। অ্যাট্রিবিউটের সম্ভাব্য মানের তালিকার জন্য, View ক্লাসে AUTOFILL_HINT এর সাথে উপসর্গযুক্ত ধ্রুবকগুলি দেখুন।
  • দেখুন যে android:importantForAutofill অ্যাট্রিবিউটটি পূরণ করতে হবে এমন ভিউতে no ছাড়া অন্য কোনো মান সেট করা আছে অথবা ভিউতে বা এর পিতামাতার একজনের noExcludeDescendants ছাড়া অন্য কোনো মান সেট করা আছে।
,

যে অ্যাপগুলি স্ট্যান্ডার্ড ভিউ ব্যবহার করে সেগুলি বিশেষ কনফিগারেশনের প্রয়োজন ছাড়াই অটোফিল ফ্রেমওয়ার্কের সাথে কাজ করে৷ আপনি ফ্রেমওয়ার্কের সাথে আপনার অ্যাপ কীভাবে কাজ করে তা অপ্টিমাইজ করতে পারেন।

অটোফিল পরিবেশ সেট আপ করুন

এই বিভাগটি বর্ণনা করে যে কীভাবে আপনার অ্যাপের জন্য মৌলিক স্বতঃপূর্ণ কার্যকারিতা সেট আপ করবেন।

একটি অটোফিল পরিষেবা কনফিগার করুন

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

আপনি নমুনা অ্যাপ থেকে পরীক্ষা অটোফিল পরিষেবা ইনস্টল করার পরে, সেটিংস > সিস্টেম > ভাষা ও ইনপুট > উন্নত > ইনপুট সহায়তা > অটোফিল পরিষেবাতে নেভিগেট করে অটোফিল পরিষেবা সক্ষম করুন।

অটোফিল পরীক্ষা করার জন্য একটি এমুলেটর কনফিগার করার বিষয়ে আরও তথ্যের জন্য, অটোফিল দিয়ে আপনার অ্যাপ পরীক্ষা করুন দেখুন।

স্বতঃপূরণের জন্য ইঙ্গিত প্রদান করুন

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

আপনি android:autofillHints অ্যাট্রিবিউট ব্যবহার করে অটোফিল ইঙ্গিত সেট করতে পারেন। নিম্নলিখিত উদাহরণটি একটি EditText এ একটি "password" ইঙ্গিত সেট করে:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autofillHints="password" />

এছাড়াও আপনি setAutofillHints() পদ্ধতি ব্যবহার করে প্রোগ্রামগতভাবে ইঙ্গিত সেট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val password = findViewById<EditText>(R.id.password)
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD)

জাভা

EditText password = findViewById(R.id.password);
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD);

পূর্বনির্ধারিত ইঙ্গিত ধ্রুবক অন্তর্ভুক্ত করুন

অটোফিল ফ্রেমওয়ার্ক ইঙ্গিত যাচাই করে না; সেগুলি অটোফিল পরিষেবাতে পরিবর্তন বা বৈধতা ছাড়াই পাস করা হয়। আপনি যেকোনো মান ব্যবহার করতে পারলেও, View এবং অ্যান্ড্রয়েডএক্স HintConstants ক্লাসে আনুষ্ঠানিকভাবে সমর্থিত ইঙ্গিত ধ্রুবকের তালিকা থাকে।

এই ধ্রুবকগুলির সংমিশ্রণ ব্যবহার করে, আপনি সাধারণ অটোফিল পরিস্থিতিগুলির জন্য লেআউট তৈরি করতে পারেন:

অ্যাকাউন্টের শংসাপত্র

একটি লগইন ফর্মে, আপনি AUTOFILL_HINT_USERNAME এবং AUTOFILL_HINT_PASSWORD মতো অ্যাকাউন্ট শংসাপত্রের ইঙ্গিতগুলি অন্তর্ভুক্ত করতে পারেন।

একটি নতুন অ্যাকাউন্ট তৈরি করার জন্য, অথবা ব্যবহারকারীরা যখন তাদের ব্যবহারকারীর নাম এবং পাসওয়ার্ড পরিবর্তন করেন, আপনি AUTOFILL_HINT_NEW_USERNAME এবং AUTOFILL_HINT_NEW_PASSWORD ব্যবহার করতে পারেন।

ক্রেডিট কার্ডের তথ্য

ক্রেডিট কার্ডের তথ্যের অনুরোধ করার সময়, আপনি AUTOFILL_HINT_CREDIT_CARD_NUMBER এবং AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন।

ক্রেডিট কার্ডের মেয়াদ শেষ হওয়ার তারিখের জন্য, নিম্নলিখিতগুলির মধ্যে একটি করুন:

শারীরিক ঠিকানা

প্রকৃত ঠিকানা ফর্ম ক্ষেত্রগুলির জন্য, আপনি নিম্নলিখিতগুলির মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন:

মানুষের নাম

লোকেদের নাম অনুরোধ করার সময়, আপনি নিম্নলিখিতগুলির মতো ইঙ্গিতগুলি ব্যবহার করতে পারেন:

ফোন নম্বর

ফোন নম্বরগুলির জন্য, আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

  • একক ভিউতে একটি পূর্ণ ফোন নম্বর অনুরোধ করার সময়, AUTOFILL_HINT_PHONE_NUMBER ব্যবহার করুন।
  • যদি একটি ফোন নম্বরের বিভিন্ন অংশের জন্য পৃথক দৃষ্টিভঙ্গি ব্যবহার করা হয়, তাহলে আপনি নিম্নলিখিতগুলির যেকোনো একটি ব্যবহার করতে পারেন:

এককালীন পাসওয়ার্ড (OTP)

একটি একক ভিউতে এককালীন পাসওয়ার্ডের জন্য, আপনি AUTOFILL_HINT_SMS_OTP ব্যবহার করতে পারেন।

একাধিক ভিউয়ের জন্য যেখানে প্রতিটি ভিউ OTP-এর একটি একক অঙ্কে মানচিত্র করে, আপনি generateSmsOtpHintForCharacterPosition() পদ্ধতি ব্যবহার করতে পারেন প্রতি-অক্ষরের ইঙ্গিত তৈরি করতে।

অটোফিলের জন্য ক্ষেত্রগুলিকে গুরুত্বপূর্ণ হিসাবে চিহ্নিত করুন৷

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

যাইহোক, এমন কিছু ক্ষেত্রে আছে যখন একটি ভিউ, একটি ভিউ স্ট্রাকচার বা সম্পূর্ণ কার্যকলাপ অটোফিলের জন্য গুরুত্বপূর্ণ নয়:

  • লগইন কার্যকলাপে একটি CAPTCHA ক্ষেত্র
  • একটি দৃশ্য যেখানে ব্যবহারকারী সামগ্রী তৈরি করে, যেমন একটি পাঠ্য বা স্প্রেডশীট সম্পাদক৷
  • গেমের মধ্যে কিছু কার্যকলাপের ভিউ, যেমন গেমপ্লে প্রদর্শন করে

আপনি android:importantForAutofill বৈশিষ্ট্য ব্যবহার করে অটোফিলের জন্য একটি ভিউ এর গুরুত্ব সেট করতে পারেন:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:importantForAutofill="no" />

importantForAutofill এর মান নিম্নলিখিত যেকোনও হতে পারে:

auto
ভিউটি অটোফিলের জন্য গুরুত্বপূর্ণ কিনা তা নির্ধারণ করতে Android সিস্টেমকে তার হিউরিস্টিক ব্যবহার করতে দিন।
no
অটোফিলের জন্য এই দৃশ্যটি গুরুত্বপূর্ণ নয়।
noExcludeDescendants
এই ভিউ এবং এর বাচ্চাদের অটোফিলের জন্য গুরুত্বপূর্ণ নয়।
yes
এই দৃশ্যটি স্বয়ংক্রিয়ভাবে পূরণের জন্য গুরুত্বপূর্ণ।
yesExcludeDescendants
এই ভিউটি অটোফিলের জন্য গুরুত্বপূর্ণ, কিন্তু এর বাচ্চারা অটোফিলের জন্য গুরুত্বপূর্ণ নয়৷

আপনি setImportantForAutofill() পদ্ধতিটিও ব্যবহার করতে পারেন:

কোটলিন

val captcha = findViewById<TextView>(R.id.captcha)
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO)

জাভা

TextView captcha = findViewById(R.id.captcha);
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);

আপনি নিম্নোক্তভাবে স্বয়ংক্রিয়ভাবে পূরণের জন্য পূর্ববর্তী উদাহরণ ব্যবহারের ক্ষেত্রে গুরুত্বহীন ঘোষণা করতে পারেন:

  • একটি লগইন কার্যকলাপে একটি CAPTCHA ক্ষেত্র: এই দৃশ্যটিকে গুরুত্বহীন হিসাবে চিহ্নিত করতে android:importantForAutofill="no" বা IMPORTANT_FOR_AUTOFILL_NO ব্যবহার করুন৷
  • একটি ভিউ যেখানে ব্যবহারকারী কন্টেন্ট তৈরি করে: পুরো ভিউ স্ট্রাকচারটিকে গুরুত্বহীন হিসেবে চিহ্নিত করতে android:importantForAutofill="noExcludeDescendants" বা IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS ব্যবহার করুন।
  • গেমের মধ্যে কিছু ক্রিয়াকলাপের ভিউ: পুরো ভিউ স্ট্রাকচারটিকে গুরুত্বহীন হিসেবে চিহ্নিত করতে android:importantForAutofill="noExcludeDescendants" বা IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS ব্যবহার করুন।

সহযোগী ওয়েবসাইট এবং মোবাইল অ্যাপ ডেটা

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

আপনার ওয়েবসাইটের সাথে আপনার অ্যান্ড্রয়েড অ্যাপ যুক্ত করতে, আপনার সাইটে delegate_permission/common.get_login_creds সম্পর্ক সহ একটি ডিজিটাল সম্পদ লিঙ্ক হোস্ট করুন। তারপর, আপনার অ্যাপের AndroidManifest.xml ফাইলে অ্যাসোসিয়েশন ঘোষণা করুন। আপনার অ্যান্ড্রয়েড অ্যাপের সাথে কীভাবে আপনার ওয়েবসাইট সংযুক্ত করবেন সে সম্পর্কে বিস্তারিত নির্দেশাবলীর জন্য, অ্যাপ এবং ওয়েবসাইট জুড়ে স্বয়ংক্রিয় সাইন-ইন সক্ষম করুন দেখুন।

একটি অটোফিল ওয়ার্কফ্লো সম্পূর্ণ করুন

এই বিভাগটি নির্দিষ্ট পরিস্থিতিতে বর্ণনা করে যেখানে আপনি আপনার অ্যাপের ব্যবহারকারীদের জন্য অটোফিল কার্যকারিতা উন্নত করতে পদক্ষেপ নিতে পারেন।

অটোফিল সক্ষম কিনা তা নির্ধারণ করুন

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

উদাহরণস্বরূপ, TextView ব্যবহারকারীর জন্য অটোফিল সক্ষম করা থাকলে ওভারফ্লো মেনুতে একটি অটোফিল এন্ট্রি দেখায়। ব্যবহারকারীর জন্য অটোফিল সক্ষম হয়েছে কিনা তা পরীক্ষা করতে, AutofillManager অবজেক্টের isEnabled() পদ্ধতিতে কল করুন।

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

একটি স্বতঃপূরণ অনুরোধ জোর করুন

কখনও কখনও আপনাকে একটি ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়া হিসাবে একটি অটোফিল অনুরোধ ঘটতে বাধ্য করতে হবে৷ উদাহরণস্বরূপ, TextView একটি অটোফিল মেনু আইটেম অফার করে যখন ব্যবহারকারী ভিউতে স্পর্শ করে ধরে রাখে। নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে একটি অটোফিল অনুরোধ জোর করতে হয়:

কোটলিন

fun eventHandler(view: View) {
    val afm = requireContext().getSystemService(AutofillManager::class.java)
    afm?.requestAutofill(view)
}

জাভা

public void eventHandler(View view) {
    AutofillManager afm = context.getSystemService(AutofillManager.class);
    if (afm != null) {
        afm.requestAutofill(view);
    }
}

আপনি বর্তমান অটোফিল প্রসঙ্গটি বাতিল করতে cancel() পদ্ধতিটিও ব্যবহার করতে পারেন। এটি কার্যকর হতে পারে যদি আপনার কাছে এমন একটি বোতাম থাকে যা কোনও লগইন পৃষ্ঠায় ক্ষেত্রগুলি সাফ করে।

পিকার নিয়ন্ত্রণগুলিতে ডেটার জন্য সঠিক অটোফিল প্রকারটি ব্যবহার করুন

পিকাররা এমন একটি ইউআই সরবরাহ করে অটোফিলের সাথে কার্যকর হতে পারে যা ব্যবহারকারীদের তারিখ বা সময়ের ডেটা সঞ্চয় করে এমন কোনও ক্ষেত্রের মান পরিবর্তন করতে দেয়। উদাহরণস্বরূপ, একটি ক্রেডিট কার্ড আকারে, একটি তারিখ পিকার ব্যবহারকারীদের তাদের ক্রেডিট কার্ডের মেয়াদোত্তীর্ণের তারিখ প্রবেশ করতে বা পরিবর্তন করতে দেয়। তবে, যখন বাছাইকারী দৃশ্যমান না হয় তখন ডেটা প্রদর্শন করতে আপনাকে অবশ্যই একটি EditText হিসাবে অন্য ভিউ ব্যবহার করতে হবে।

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

আপনি যখন অটোফিল ডেটা প্রকারটি নির্দিষ্ট করেন, অটোফিল পরিষেবা ভিউতে প্রদর্শিত ডেটার উপযুক্ত উপস্থাপনা তৈরি করতে পারে। আরও তথ্যের জন্য, অটোফিল সহ পিকারগুলি ব্যবহার করুন দেখুন।

অটোফিল প্রসঙ্গটি শেষ করুন

অটোফিল ফ্রেমওয়ার্ক "অটোফিলের জন্য সংরক্ষণ করুন" দেখিয়ে ভবিষ্যতের ব্যবহারের জন্য ব্যবহারকারীর ইনপুট সংরক্ষণ করে? অটোফিল প্রসঙ্গ শেষ হওয়ার পরে ডায়ালগ। সাধারণত, কোনও ক্রিয়াকলাপ শেষ হয়ে গেলে অটোফিল প্রসঙ্গটি শেষ হয়। যাইহোক, এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনাকে কাঠামোটি স্পষ্টভাবে অবহিত করতে হবে - উদাহরণস্বরূপ, আপনি যদি একই ক্রিয়াকলাপটি ব্যবহার করছেন তবে আপনার লগইন এবং সামগ্রীর স্ক্রিন উভয়ের জন্য আলাদা টুকরো। এই পরিস্থিতিতে, আপনি AutofillManager.commit() কল করে স্পষ্টভাবে প্রসঙ্গটি শেষ করতে পারেন।

কাস্টম ভিউগুলির জন্য সমর্থন

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

যদি আপনার অ্যাপ্লিকেশনটি কাস্টম ভিউ ব্যবহার করে তবে নিম্নলিখিত পরিস্থিতিগুলি বিবেচনা করুন:

  • কাস্টম ভিউ একটি স্ট্যান্ডার্ড ভিউ কাঠামো , বা একটি ডিফল্ট ভিউ কাঠামো সরবরাহ করে।
  • কাস্টম ভিউতে একটি ভার্চুয়াল কাঠামো বা একটি ভিউ কাঠামো রয়েছে যা অটোফিল কাঠামোর জন্য উপলভ্য নয়।

স্ট্যান্ডার্ড ভিউ স্ট্রাকচার সহ কাস্টম ভিউ

কাস্টম ভিউগুলি মেটাডেটা সংজ্ঞায়িত করতে পারে যা অটোফিলের কাজ করা প্রয়োজন। নিশ্চিত হয়ে নিন যে আপনার কাস্টম ভিউটি অটোফিল ফ্রেমওয়ার্কের সাথে কাজ করার জন্য যথাযথভাবে মেটাডেটা পরিচালনা করে। আপনার কাস্টম ভিউ অবশ্যই নিম্নলিখিত ক্রিয়াগুলি গ্রহণ করতে হবে:

  • ফ্রেমওয়ার্কটি আপনার অ্যাপ্লিকেশনটিতে প্রেরণ করে এমন অটোফিল মানটি পরিচালনা করুন।
  • কাঠামোর জন্য অটোফিল প্রকার এবং মান সরবরাহ করুন।

যখন অটোফিল ট্রিগার করা হয়, অটোফিল ফ্রেমওয়ার্কটি আপনার দৃষ্টিতে autofill() কল করে এবং আপনার দৃষ্টিভঙ্গি অবশ্যই ব্যবহার করতে হবে এমন মানটি প্রেরণ করে। আপনার কাস্টম ভিউ কীভাবে অটোফিল মানটি পরিচালনা করে তা নির্দিষ্ট করতে autofill() প্রয়োগ করুন।

আপনার দৃষ্টিভঙ্গিটি যথাক্রমে getAutofillType() এবং getAutofillValue() পদ্ধতিগুলি ওভাররাইড করে একটি অটোফিল প্রকার এবং মান নির্দিষ্ট করতে হবে।

শেষ অবধি, ব্যবহারকারী যদি তার বর্তমান অবস্থায় ভিউয়ের জন্য কোনও মান সরবরাহ করতে না পারে তবে অটোফিলকে অবশ্যই ভিউটি পূরণ করা উচিত নয় - উদাহরণস্বরূপ, যদি ভিউটি অক্ষম থাকে। এই ক্ষেত্রে, getAutofillType() অবশ্যই AUTOFILL_TYPE_NONE ফিরিয়ে দিতে হবে, getAutofillValue() অবশ্যই null ফিরে আসতে হবে, এবং autofill() অবশ্যই কিছুই করতে হবে না।

নিম্নলিখিত কেসগুলির কাঠামোর মধ্যে সঠিকভাবে কাজ করার জন্য অতিরিক্ত পদক্ষেপের প্রয়োজন:

  • কাস্টম ভিউ সম্পাদনাযোগ্য।
  • কাস্টম ভিউতে সংবেদনশীল ডেটা রয়েছে।

কাস্টম ভিউ সম্পাদনাযোগ্য

যদি ভিউটি সম্পাদনাযোগ্য হয় তবে AutofillManager অবজেক্টে notifyValueChanged() কল করে পরিবর্তনগুলি সম্পর্কে অটোফিল কাঠামোকে অবহিত করুন।

কাস্টম ভিউতে সংবেদনশীল ডেটা রয়েছে

যদি কোনও ভিউতে ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য (পিআইআই) যেমন ইমেল ঠিকানা, ক্রেডিট কার্ড নম্বর এবং পাসওয়ার্ড থাকে তবে এটি অবশ্যই সংবেদনশীল হিসাবে চিহ্নিত করা উচিত।

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

অটোফিল ফ্রেমওয়ার্ক ধরে নিয়েছে যে সমস্ত ডেটা ডিফল্টরূপে সংবেদনশীল। আপনি সংবেদনশীল নয় এমন ডেটা চিহ্নিত করতে পারেন।

কোনও ভিউতে সংবেদনশীল ডেটা রয়েছে কিনা তা চিহ্নিত করতে, onProvideAutofillStructure() প্রয়োগ করুন এবং ViewStructure অবজেক্টে setDataIsSensitive() কল করুন।

নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে দৃশ্যের কাঠামোর ডেটা সংবেদনশীল হিসাবে চিহ্নিত করবেন:

কোটলিন

override fun onProvideAutofillStructure(structure: ViewStructure, flags: Int) {
    super.onProvideAutofillStructure(structure, flags)

    structure.setDataIsSensitive(false)
}

জাভা

@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
    super.onProvideAutofillStructure(structure, flags);

    structure.setDataIsSensitive(false);
}

যদি কোনও ভিউ কেবল পূর্বনির্ধারিত মানগুলি গ্রহণ করে তবে আপনি ভিউটি অটোফিল করতে ব্যবহার করা যেতে পারে এমন বিকল্পগুলি সেট করতে setAutofillOptions() পদ্ধতিটি ব্যবহার করতে পারেন। বিশেষত, যাদের অটোফিল টাইপটি AUTOFILL_TYPE_LIST তাদের অবশ্যই এই পদ্ধতিটি ব্যবহার করতে হবে, কারণ অটোফিল পরিষেবা যদি ভিউ পূরণ করার জন্য উপলব্ধ বিকল্পগুলি জানে তবে এটি আরও ভাল কাজ করতে পারে।

Spinner হিসাবে অ্যাডাপ্টার ব্যবহার করে এমন দর্শনগুলি একই রকম কেস। উদাহরণস্বরূপ, একটি স্পিনার যা বর্তমান বছরের উপর ভিত্তি করে গতিশীলভাবে নির্মিত বছরগুলি সরবরাহ করে, ক্রেডিট কার্ডের মেয়াদোত্তীর্ণ ক্ষেত্রগুলিতে ব্যবহার করতে বছরের একটি তালিকা সরবরাহ করতে Adapter ইন্টারফেসের getAutofillOptions() পদ্ধতি প্রয়োগ করতে পারে।

ArrayAdapter ব্যবহার করে এমন দর্শনগুলি মানগুলির তালিকাও সরবরাহ করতে পারে। ArrayAdapter স্বয়ংক্রিয়ভাবে স্থির সংস্থানগুলির জন্য অটোফিল বিকল্পগুলি সেট করে। আপনি যদি মানগুলি গতিশীলভাবে সরবরাহ করেন তবে getAutofillOptions() ওভাররাইড করুন।

ভার্চুয়াল কাঠামো সহ কাস্টম ভিউ

অটোফিল কাঠামোর জন্য আপনার অ্যাপের ইউআইতে তথ্য সম্পাদনা এবং সংরক্ষণ করতে পারার আগে একটি ভিউ কাঠামো প্রয়োজন। নিম্নলিখিত পরিস্থিতিতে কাঠামোর জন্য ভিউ কাঠামোটি উপলব্ধ নয়:

  • অ্যাপ্লিকেশনটি ইউআই রেন্ডার করতে ওপেনজিএল-এর মতো একটি নিম্ন-স্তরের রেন্ডারিং ইঞ্জিন ব্যবহার করে।
  • অ্যাপটি ইউআই আঁকতে Canvas একটি উদাহরণ ব্যবহার করে।

এই ক্ষেত্রে, আপনি onProvideAutofillVirtualStructure() প্রয়োগ করে এবং এই পদক্ষেপগুলি অনুসরণ করে একটি ভিউ কাঠামো নির্দিষ্ট করতে পারেন:

  1. addChildCount() কল করে ভিউ কাঠামোর শিশু গণনা বাড়ান।
  2. newChild() কল করে একটি শিশুকে যুক্ত করুন।
  3. setAutofillId() কল করে সন্তানের জন্য অটোফিল আইডি সেট করুন।
  4. প্রাসঙ্গিক বৈশিষ্ট্যগুলি সেট করুন, যেমন অটোফিল মান এবং প্রকার।
  5. ভার্চুয়াল সন্তানের ডেটা যদি সংবেদনশীল হয় তবে setDataIsSensitive() এর সাথে true পাস করুন; অন্যথায়, false পাস।

নিম্নলিখিত কোড স্নিপেটটি দেখায় যে ভার্চুয়াল কাঠামোতে কীভাবে একটি নতুন শিশু তৈরি করা যায়:

কোটলিন

override fun onProvideAutofillVirtualStructure(structure: ViewStructure, flags: Int) {

    super.onProvideAutofillVirtualStructure(structure, flags)

    // Create a new child in the virtual structure.
    structure.addChildCount(1)
    val child = structure.newChild(childIndex)

    // Set the autofill ID for the child.
    child.setAutofillId(structure.autofillId!!, childVirtualId)

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue)
    child.setAutofillType(childAutofillType)

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    val childAutofillOptions = arrayOf<CharSequence>("option1", "option2")
    child.setAutofillOptions(childAutofillOptions)

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    val sensitive = !contentIsSetFromResources()
    child.setDataIsSensitive(sensitive)
}

জাভা

@Override
public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {

    super.onProvideAutofillVirtualStructure(structure, flags);

    // Create a new child in the virtual structure.
    structure.addChildCount(1);
    ViewStructure child =
            structure.newChild(childIndex);

    // Set the autofill ID for the child.
    child.setAutofillId(structure.getAutofillId(), childVirtualId);

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue);
    child.setAutofillType(childAutofillType);

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    CharSequence childAutofillOptions[] = { "option1", "option2" };
    child.setAutofillOptions(childAutofillOptions);

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    boolean sensitive = !contentIsSetFromResources();
    child.setDataIsSensitive(sensitive);
}

ভার্চুয়াল কাঠামোর উপাদানগুলি যখন পরিবর্তিত হয়, তখন নিম্নলিখিত কাজগুলি সম্পাদন করে কাঠামোটি অবহিত করুন:

  • যদি বাচ্চাদের ভিতরে ফোকাস পরিবর্তন হয়, তবে AutofillManager অবজেক্টে notifyViewEntered() এবং notifyViewExited() কল করুন।
  • যদি কোনও শিশুর মান পরিবর্তন হয় তবে AutofillManager অবজেক্টে notifyValueChanged() কল করুন।
  • যদি ভিউ হায়ারার্কি আর উপলভ্য না হয় কারণ ব্যবহারকারী কর্মপ্রবাহে একটি পদক্ষেপ সম্পন্ন করে, যেমন তারা যখন লগইন ফর্ম ব্যবহার করে সাইন ইন করে, AutofillManager অবজেক্টে commit() কল করুন।
  • যদি ভিউ হায়ারার্কি বৈধ না হয় কারণ ব্যবহারকারী ওয়ার্কফ্লোতে একটি পদক্ষেপ বাতিল করে দেয়, যেমন ব্যবহারকারী যখন একটি লগইন ফর্ম সাফ করে এমন একটি বোতাম ট্যাপ করে, তখন AutofillManager অবজেক্টে কল cancel() কল করুন।

অটোফিল ইভেন্টগুলিতে কলব্যাকগুলি ব্যবহার করুন

যদি আপনার অ্যাপ্লিকেশনটি তার নিজস্ব স্বতঃপূরী দর্শন সরবরাহ করে তবে আপনার এমন একটি প্রক্রিয়া দরকার যা অ্যাপটিকে ইউআই অটোফিল সাশ্রয়ী পরিবর্তনের প্রতিক্রিয়ায় ভিউগুলি সক্ষম বা অক্ষম করতে অ্যাপ্লিকেশনটিকে বলে। অটোফিল ফ্রেমওয়ার্কটি AutofillCallback আকারে এই প্রক্রিয়াটি সরবরাহ করে।

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

আপনি AutofillManager ক্লাসের registerCallback() পদ্ধতি ব্যবহার করে একটি কলব্যাক নিবন্ধন করতে পারেন। নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে অটোফিল ইভেন্টগুলির জন্য কলব্যাক ঘোষণা করা যায়:

কোটলিন

val afm = context.getSystemService(AutofillManager::class.java)

afm?.registerCallback(object : AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    override fun onAutofillEvent(view: View, event: Int) {
        super.onAutofillEvent(view, event)
        when (event) {
            EVENT_INPUT_HIDDEN -> {
                // The autofill affordance associated with the view was hidden.
            }
            EVENT_INPUT_SHOWN -> {
                // The autofill affordance associated with the view was shown.
            }
            EVENT_INPUT_UNAVAILABLE -> {
                // Autofill isn't available.
            }
        }

    }
})

জাভা

AutofillManager afm = getContext().getSystemService(AutofillManager.class);

afm.registerCallback(new AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    @Override
    public void onAutofillEvent(@NonNull View view, int event) {
        super.onAutofillEvent(view, event);
        switch (event) {
            case EVENT_INPUT_HIDDEN:
                // The autofill affordance associated with the view was hidden.
                break;
            case EVENT_INPUT_SHOWN:
                // The autofill affordance associated with the view was shown.
                break;
            case EVENT_INPUT_UNAVAILABLE:
                // Autofill isn't available.
                break;
        }
    }
});

যখন কলব্যাকটি সরানোর সময় হয়, তখন unregisterCallback() পদ্ধতিটি ব্যবহার করুন।

অটোফিল হাইলাইটযুক্ত অঙ্কনযোগ্য কাস্টমাইজ করুন

যখন কোনও ভিউ অটোফিল্ড হয়, প্ল্যাটফর্মটি ভিউয়ের সামগ্রীগুলি অটোফিল্ড রয়েছে তা নির্দেশ করার জন্য ভিউয়ের উপরে একটি Drawable রেন্ডার করে। ডিফল্টরূপে, এই অঙ্কনযোগ্য একটি স্বচ্ছ রঙযুক্ত একটি শক্ত আয়তক্ষেত্র যা ব্যাকগ্রাউন্ড আঁকতে ব্যবহৃত থিমের রঙের চেয়ে কিছুটা গা er ়। অঙ্কনযোগ্য পরিবর্তন করার দরকার নেই, তবে এটি android:autofilledHighlight অ্যাপ্লিকেশন বা ক্রিয়াকলাপ দ্বারা ব্যবহৃত থিমের অটোফিল্ডহাইটলাইট আইটেম, যেমন এই উদাহরণে দেখানো হয়েছে:

রেস/মান/স্টাইলস.এক্সএমএল

<resources>
    <style name="MyAutofilledHighlight" parent="...">
        <item name="android:autofilledHighlight">@drawable/my_drawable</item>
    </style>
</resources>

রেস/অঙ্কনযোগ্য/আমার_ড্রাবেবল.এক্সএমএল

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#4DFF0000" />
</shape>

AndroidManifest.xml

<application ...
    android:theme="@style/MyAutofilledHighlight">
<!-- or -->
<activity ...
    android:theme="@style/MyAutofilledHighlight">

অটোফিলের জন্য প্রমাণীকরণ

একটি অটোফিল পরিষেবা আপনার অ্যাপ্লিকেশনটিতে পরিষেবাগুলি সম্পূর্ণ করার আগে ব্যবহারকারীকে প্রমাণীকরণের প্রয়োজন হতে পারে, সেক্ষেত্রে অ্যান্ড্রয়েড সিস্টেমটি আপনার ক্রিয়াকলাপের স্ট্যাকের অংশ হিসাবে পরিষেবার প্রমাণীকরণ ক্রিয়াকলাপটি চালু করে।

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

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

পুনর্ব্যবহারযোগ্য ভিউগুলিতে অটোফিল আইডি নির্ধারণ করুন

পুনর্ব্যবহারযোগ্য ভিউগুলি যেমন RecyclerView ক্লাস, এমন অ্যাপ্লিকেশনগুলির জন্য দরকারী যেগুলি বড় ডেটা সেটগুলির উপর ভিত্তি করে উপাদানগুলির স্ক্রোলিং তালিকাগুলি প্রদর্শন করতে হবে এমন অ্যাপ্লিকেশনগুলির জন্য দরকারী। ধারক স্ক্রোল হিসাবে, সিস্টেমটি বিন্যাসে পুনরায় ব্যবহার করে তবে দৃশ্যগুলিতে নতুন সামগ্রী রয়েছে।

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

অ্যান্ড্রয়েড 9 (এপিআই স্তর 28) এবং উচ্চতর চালিত ডিভাইসগুলিতে এই সমস্যাটি সমাধান করতে, এই পদ্ধতিগুলি ব্যবহার করে RecyclerView দ্বারা ব্যবহৃত ভিউগুলির অটোফিল আইডি স্পষ্টভাবে পরিচালনা করুন:

  • getNextAutofillId() পদ্ধতিটি একটি নতুন অটোফিল আইডি পায় যা ক্রিয়াকলাপের জন্য অনন্য।
  • setAutofillId() পদ্ধতিটি ক্রিয়াকলাপে এই দৃশ্যের অনন্য, লজিকাল অটোফিল আইডি সেট করে।

জ্ঞাত বিষয়গুলি ঠিকানা

এই বিভাগটি অটোফিল ফ্রেমওয়ার্কের মধ্যে জ্ঞাত সমস্যাগুলির কাজগুলি উপস্থাপন করে।

অটোফিল অ্যান্ড্রয়েড 8.0, 8.1 এ অ্যাপ্লিকেশনগুলি ক্র্যাশ করে তোলে

অ্যান্ড্রয়েড 8.0 (এপিআই স্তর 26) এবং 8.1 (এপিআই স্তর 27) এ, অটোফিল আপনার অ্যাপ্লিকেশনটিকে নির্দিষ্ট পরিস্থিতিতে ক্র্যাশ করতে পারে। সম্ভাব্য সমস্যাগুলির আশেপাশে কাজ করার জন্য, importantForAutofill=no দিয়ে অটোফিল্ড নয় এমন কোনও ভিউ ট্যাগ করুন। আপনি পুরো ক্রিয়াকলাপটি importantForAutofill=noExcludeDescendants সাথে ট্যাগ করতে পারেন।

রেজাইজড ডায়ালগগুলি অটোফিলের জন্য বিবেচনা করা হয় না

অ্যান্ড্রয়েড 8.1 (এপিআই স্তর 27) এবং লোয়ার, যদি এটি ইতিমধ্যে প্রদর্শিত হওয়ার পরে কোনও ডায়ালগের কোনও ভিউকে পুনরায় আকার দেওয়া হয় তবে ভিউটি অটোফিলের জন্য বিবেচনা করা হয় না। অ্যান্ড্রয়েড সিস্টেমটি অটোফিল পরিষেবাটিতে প্রেরণ করে এমন AssistStructure অবজেক্টে এই মতামতগুলি অন্তর্ভুক্ত নয়। ফলস্বরূপ, পরিষেবাটি ভিউগুলি পূরণ করতে পারে না।

এই সমস্যাটি ঘিরে কাজ করার জন্য, ডায়ালগটি তৈরি করে এমন ক্রিয়াকলাপের token সম্পত্তি সহ ডায়ালগ উইন্ডো পরামিতিগুলির token সম্পত্তি প্রতিস্থাপন করুন। আপনি যে অটোফিলটি সক্ষম করেছেন তা বৈধ করার পরে, Dialog থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসের onWindowAttributesChanged() পদ্ধতিতে উইন্ডো পরামিতিগুলি সংরক্ষণ করুন। তারপরে, সংরক্ষিত প্যারামিটারগুলির token সম্পত্তিটি onAttachedToWindow() পদ্ধতিতে পিতামাতার ক্রিয়াকলাপের token সম্পত্তি সহ প্রতিস্থাপন করুন।

নিম্নলিখিত কোড স্নিপেট এমন একটি শ্রেণি দেখায় যা এই কাজের প্রয়োগ করে:

কোটলিন

class MyDialog(context: Context) : Dialog(context) {

    // Used to store the dialog window parameters.
    private var token: IBinder? = null

    private val isDialogResizedWorkaroundRequired: Boolean
        get() {
            if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
                return false
            }
            val autofillManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                context.getSystemService(AutofillManager::class.java)
            } else {
                null
            }
            return autofillManager?.isEnabled ?: false
        }

    override fun onWindowAttributesChanged(params: WindowManager.LayoutParams) {
        if (params.token == null && token != null) {
            params.token = token
        }

        super.onWindowAttributesChanged(params)
    }

    override fun onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired) {
            token = ownerActivity!!.window.attributes.token
        }

        super.onAttachedToWindow()
    }

}

জাভা

public class MyDialog extends Dialog {

    public MyDialog(Context context) {
        super(context);
    }

    // Used to store the dialog window parameters.
    private IBinder token;

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
        if (params.token == null && token != null) {
            params.token = token;
        }

        super.onWindowAttributesChanged(params);
    }

    @Override
    public void onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired()) {
            token = getOwnerActivity().getWindow().getAttributes().token;
        }

        super.onAttachedToWindow();
    }

    private boolean isDialogResizedWorkaroundRequired() {
        if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O
                || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
            return false;
        }
        AutofillManager autofillManager =
                null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            autofillManager = getContext().getSystemService(AutofillManager.class);
        }
        return autofillManager != null && autofillManager.isEnabled();
    }

}

অপ্রয়োজনীয় ক্রিয়াকলাপগুলি এড়াতে, নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে ডিভাইসে অটোফিল সমর্থিত এবং বর্তমান ব্যবহারকারীর জন্য সক্ষম করা হয়েছে কিনা তা পরীক্ষা করা যায় এবং এই কাজের প্রয়োজন কিনা:

কোটলিন

// AutofillExtensions.kt

fun Context.isDialogResizedWorkaroundRequired(): Boolean {
    // After the issue is resolved on Android, check whether the
    // workaround is still required for the current device.
    return isAutofillAvailable()
}

fun Context.isAutofillAvailable(): Boolean {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        // The autofill framework is available on Android 8.0
        // or higher.
        return false
    }

    val afm = getSystemService(AutofillManager::class.java)
    // Return true if autofill is supported by the device and enabled
    // for the current user.
    return afm != null && afm.isEnabled
}

জাভা

public class AutofillHelper {

    public static boolean isDialogResizedWorkaroundRequired(Context context) {
        // After the issue is resolved on Android, check whether the
        // workaround is still required for the current device.
        return isAutofillAvailable(context);
    }

    public static boolean isAutofillAvailable(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            // The autofill framework is available on Android 8.0
            // or higher.
            return false;
        }

        AutofillManager afm = context.getSystemService(AutofillManager.class);
        // Return true if autofill is supported by the device and enabled
        // for the current user.
        return afm != null && afm.isEnabled();
    }
}

অটোফিল দিয়ে আপনার অ্যাপ্লিকেশন পরীক্ষা করুন

আপনি অটোফিল পরিষেবাগুলির সাথে কাজ করার জন্য আপনার অ্যাপ্লিকেশনটিকে অনুকূল করার পরে, এটি অটোফিল পরিষেবাগুলির সাথে উদ্দেশ্য হিসাবে কাজ করে কিনা তা পরীক্ষা করুন।

আপনার অ্যাপ্লিকেশনটি পরীক্ষা করতে একটি এমুলেটর বা একটি শারীরিক ডিভাইস অ্যান্ড্রয়েড 8.0 (এপিআই স্তর 26) বা উচ্চতর ব্যবহার করুন। কীভাবে এমুলেটর তৈরি করবেন সে সম্পর্কে আরও তথ্যের জন্য, ভার্চুয়াল ডিভাইসগুলি তৈরি এবং পরিচালনা করুন

একটি অটোফিল পরিষেবা ইনস্টল করুন

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

আপনি জাভাতে অ্যান্ড্রয়েড অটোফিল ফ্রেমওয়ার্ক নমুনা ব্যবহার করতে পারেন আপনার অ্যাপ্লিকেশনটি অটোফিল পরিষেবাগুলির সাথে পরীক্ষা করতে। নমুনা অ্যাপ্লিকেশনটি একটি অটোফিল পরিষেবা এবং ক্লায়েন্ট Activity ক্লাস সরবরাহ করে যা আপনি আপনার অ্যাপ্লিকেশনটি ব্যবহার করার আগে ওয়ার্কফ্লোটি পরীক্ষা করতে ব্যবহার করতে পারেন। এই পৃষ্ঠাটি অ্যান্ড্রয়েড-অটোফিলফ্রেমওয়ার্ক নমুনা অ্যাপ্লিকেশনটিকে উল্লেখ করে।

আপনি অ্যাপটি ইনস্টল করার পরে, সেটিংস > সিস্টেম > ভাষা এবং ইনপুট > উন্নত > ইনপুট সহায়তা > অটোফিল পরিষেবাতে নেভিগেট করে এমুলেটরের সিস্টেম সেটিংসে অটোফিল পরিষেবাটি সক্ষম করুন।

ডেটা প্রয়োজনীয়তা বিশ্লেষণ করুন

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

android:autofillHints অ্যাট্রিবিউট সেট করে আপনার দৃষ্টিভঙ্গিতে কী ধরণের ডেটা প্রত্যাশিত তা পরিষেবাটিকে বলুন। কিছু পরিষেবা ডেটা ধরণের নির্ধারণের জন্য পরিশীলিত হিউরিস্টিক ব্যবহার করে তবে অন্যরা, যেমন নমুনা অ্যাপ্লিকেশন, এই তথ্য সরবরাহ করতে বিকাশকারীর উপর নির্ভর করে। আপনার অ্যাপ্লিকেশনটি অটোফিল পরিষেবাগুলির সাথে আরও ভাল কাজ করে যদি আপনি android:autofillHints বৈশিষ্ট্য।

আপনার পরীক্ষা চালান

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

পরিষেবাতে ডেটা সংরক্ষণ করুন

বর্তমানে সক্রিয় থাকা অটোফিল পরিষেবাতে ডেটা সংরক্ষণ করতে নিম্নলিখিতগুলি করুন:

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

যদি অ্যান্ড্রয়েড অনুমতি ডায়ালগটি প্রদর্শন না করে, বা পরিষেবাটি যদি আপনি আপনার পরীক্ষায় ব্যবহার করতে চান তবে তা না হলে পরিষেবাটি বর্তমানে সিস্টেম সেটিংসে সক্রিয় রয়েছে কিনা তা পরীক্ষা করে দেখুন।

আপনার অ্যাপে ট্রিগার অটোফিল

আপনার অ্যাপ্লিকেশনটিতে অটোফিল ট্রিগার করতে, নিম্নলিখিতগুলি করুন:

  1. আপনার অ্যাপ্লিকেশনটি খুলুন এবং আপনি পরীক্ষা করতে চান এমন মতামত রয়েছে এমন ক্রিয়াকলাপে যান।
  2. ভিউটি ট্যাপ করুন যা পূরণ করা দরকার।
  3. সিস্টেমটি অটোফিল ইউআই প্রদর্শন করে, এতে চিত্র 1 -এ দেখানো হয়েছে এমন ডেটাসেটগুলি রয়েছে যা ভিউ পূরণ করতে পারে।
  4. আপনি যে ডেটা ব্যবহার করতে চান তা সমন্বিত ডেটাসেটটি আলতো চাপুন। ভিউটি পরিষেবাতে পূর্বে সঞ্চিত ডেটা প্রদর্শন করে।
অটোফিল ইউআই উপলব্ধ ডেটাসেট হিসাবে "ডেটাসেট -2" প্রদর্শন করছে
চিত্র 1। অটোফিল ইউআই উপলভ্য ডেটাসেটগুলি প্রদর্শন করছে।

যদি অ্যান্ড্রয়েড অটোফিল ইউআই প্রদর্শন না করে তবে আপনি নিম্নলিখিত সমস্যা সমাধানের বিকল্পগুলি চেষ্টা করতে পারেন:

  • আপনার অ্যাপের দর্শনগুলি android:autofillHints অ্যাট্রিবিউটে সঠিক মান ব্যবহার করে কিনা তা পরীক্ষা করে দেখুন। বৈশিষ্ট্যের জন্য সম্ভাব্য মানগুলির তালিকার জন্য, View ক্লাসে AUTOFILL_HINT সহ উপসর্গযুক্ত ধ্রুবকগুলি দেখুন।
  • android:importantForAutofill অ্যাট্রিবিউটটি পূরণ করা দরকার এমন ভিউ no অন্য কোনও মান হিসাবে সেট করা আছে, বা ভিউ বা তার পিতামাতার কোনও একটিতে noExcludeDescendants ব্যতীত অন্য কোনও মান সেট করা আছে।