অ্যান্ড্রয়েড 4.3 API

API স্তর: 18

Android 4.3 ( JELLY_BEAN_MR2 ) হল জেলি বিন রিলিজের একটি আপডেট যা ব্যবহারকারী এবং অ্যাপ বিকাশকারীদের জন্য নতুন বৈশিষ্ট্যগুলি অফার করে৷ এই নথিটি সবচেয়ে উল্লেখযোগ্য নতুন APIগুলির একটি ভূমিকা প্রদান করে৷

একজন অ্যাপ ডেভেলপার হিসেবে, আপনার যত তাড়াতাড়ি সম্ভব SDK ম্যানেজার থেকে Android 4.3 সিস্টেম ইমেজ এবং SDK প্ল্যাটফর্ম ডাউনলোড করা উচিত। আপনার অ্যাপটি পরীক্ষা করার জন্য Android 4.3 চালিত কোনো ডিভাইস না থাকলে, Android এমুলেটরে আপনার অ্যাপটি পরীক্ষা করতে Android 4.3 সিস্টেম ইমেজ ব্যবহার করুন। তারপরে সর্বশেষ এপিআই ব্যবহার শুরু করতে Android 4.3 প্ল্যাটফর্মের বিপরীতে আপনার অ্যাপস তৈরি করুন।

আপনার লক্ষ্য API স্তর আপডেট করুন

Android 4.3 চালিত ডিভাইসগুলির জন্য আপনার অ্যাপটিকে আরও ভালভাবে অপ্টিমাইজ করতে, আপনার targetSdkVersion "18" এ সেট করা উচিত, এটি একটি Android 4.3 সিস্টেম ইমেজে ইনস্টল করুন, এটি পরীক্ষা করুন, তারপর এই পরিবর্তনের সাথে একটি আপডেট প্রকাশ করুন৷

আপনি অ্যান্ড্রয়েড 4.3-এ APIগুলি ব্যবহার করতে পারেন এবং আপনার কোডে শর্ত যুক্ত করে পুরানো সংস্করণগুলিকে সমর্থন করতে পারেন যা আপনার minSdkVersion দ্বারা সমর্থিত নয় এমন APIগুলি চালানোর আগে সিস্টেম API স্তর পরীক্ষা করে। পশ্চাৎপদ সামঞ্জস্য বজায় রাখার বিষয়ে আরও জানতে, বিভিন্ন প্ল্যাটফর্ম সংস্করণ সমর্থনকারী পড়ুন।

অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরিতে বিভিন্ন API পাওয়া যায় যা আপনাকে প্ল্যাটফর্মের পুরানো সংস্করণগুলিতে নতুন বৈশিষ্ট্যগুলি প্রয়োগ করতে দেয়৷

API স্তরগুলি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য, পড়ুন API স্তর কী?

গুরুত্বপূর্ণ আচরণ পরিবর্তন

আপনি যদি আগে Android এর জন্য একটি অ্যাপ প্রকাশ করে থাকেন, তাহলে জেনে রাখুন যে আপনার অ্যাপটি Android 4.3-এর পরিবর্তনের দ্বারা প্রভাবিত হতে পারে।

যদি আপনার অ্যাপ অন্তর্নিহিত উদ্দেশ্য ব্যবহার করে...

আপনার অ্যাপ একটি সীমাবদ্ধ প্রোফাইল পরিবেশে খারাপ আচরণ করতে পারে।

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

একটি অন্তর্নিহিত অভিপ্রায় ব্যবহার করার সময়, আপনার সর্বদা যাচাই করা উচিত যে কোনো অ্যাপটি ইন্টেন্ট পরিচালনা করার জন্য উপলব্ধ আছে resolveActivity() বা queryIntentActivities() কল করে৷ যেমন:

কোটলিন

val intent = Intent(Intent.ACTION_SEND)
...
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show()
}

জাভা

Intent intent = new Intent(Intent.ACTION_SEND);
...
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show();
}

যদি আপনার অ্যাপ অ্যাকাউন্টের উপর নির্ভর করে...

আপনার অ্যাপ একটি সীমাবদ্ধ প্রোফাইল পরিবেশে খারাপ আচরণ করতে পারে।

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

আপনি যদি সীমাবদ্ধ প্রোফাইলগুলিকে সম্পূর্ণরূপে আপনার অ্যাপ ব্যবহার করা থেকে আটকাতে চান কারণ আপনার অ্যাপটি সংবেদনশীল অ্যাকাউন্ট তথ্যের উপর নির্ভর করে, তাহলে আপনার ম্যানিফেস্টের <application> উপাদানে android:requiredAccountType বৈশিষ্ট্যটি নির্দিষ্ট করুন।

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

যদি আপনার অ্যাপ ভিডিও ভিউ ব্যবহার করে...

Android 4.3 এ আপনার ভিডিও ছোট দেখাতে পারে।

Android-এর পূর্ববর্তী সংস্করণগুলিতে, VideoView উইজেট ভুলভাবে layout_height এবং layout_width এর জন্য "wrap_content" মানকে "match_parent" এর মতই গণনা করেছে। তাই উচ্চতা বা প্রস্থের জন্য "wrap_content" ব্যবহার করার সময় আপনার পছন্দসই ভিডিও লেআউট দেওয়া থাকতে পারে, এটি করার ফলে Android 4.3 এবং উচ্চতর সংস্করণে অনেক ছোট ভিডিও হতে পারে। সমস্যাটি সমাধান করতে, "wrap_content" কে "match_parent" দিয়ে প্রতিস্থাপন করুন এবং আপনার ভিডিওটি Android 4.3 এর পাশাপাশি পুরানো সংস্করণে প্রত্যাশিতভাবে প্রদর্শিত হবে তা যাচাই করুন।

সীমাবদ্ধ প্রোফাইল

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

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

আপনার BroadcastReceiver এর onReceive() পদ্ধতিতে, আপনার অ্যাপ প্রদান করে প্রতিটি সীমাবদ্ধতার জন্য আপনাকে অবশ্যই একটি RestrictionEntry তৈরি করতে হবে। প্রতিটি RestrictionEntry একটি সীমাবদ্ধতা শিরোনাম, বিবরণ এবং নিম্নলিখিত ডেটা প্রকারগুলির মধ্যে একটিকে সংজ্ঞায়িত করে:

  • TYPE_BOOLEAN একটি সীমাবদ্ধতার জন্য যা হয় সত্য বা মিথ্যা।
  • TYPE_CHOICE একটি সীমাবদ্ধতার জন্য যাতে একাধিক পছন্দ রয়েছে যা পারস্পরিকভাবে একচেটিয়া (রেডিও বোতাম পছন্দ)।
  • TYPE_MULTI_SELECT একটি সীমাবদ্ধতার জন্য যাতে একাধিক পছন্দ রয়েছে যা পারস্পরিকভাবে একচেটিয়া নয় (চেকবক্স পছন্দ)।

তারপর আপনি একটি ArrayList এ সমস্ত RestrictionEntry অবজেক্ট রাখুন এবং এটিকে সম্প্রচার রিসিভারের ফলাফলে EXTRA_RESTRICTIONS_LIST অতিরিক্তের মান হিসেবে রাখুন।

সিস্টেমটি সেটিংস অ্যাপে আপনার অ্যাপের সীমাবদ্ধতার জন্য UI তৈরি করে এবং প্রতিটি RestrictionEntry অবজেক্টের জন্য আপনার দেওয়া অনন্য কী দিয়ে প্রতিটি সীমাবদ্ধতা সংরক্ষণ করে। যখন ব্যবহারকারী আপনার অ্যাপটি খোলে, আপনি getApplicationRestrictions() কল করে যেকোনো বর্তমান বিধিনিষেধের জন্য প্রশ্ন করতে পারেন। এটি আপনাকে RestrictionEntry অবজেক্টের সাথে সংজ্ঞায়িত প্রতিটি সীমাবদ্ধতার জন্য কী-মানের জোড়া সমন্বিত একটি Bundle প্রদান করে।

আপনি যদি আরও নির্দিষ্ট বিধিনিষেধ প্রদান করতে চান যা বুলিয়ান, একক পছন্দ এবং বহু-পছন্দের মান দ্বারা পরিচালনা করা যায় না, তাহলে আপনি একটি কার্যকলাপ তৈরি করতে পারেন যেখানে ব্যবহারকারী সীমাবদ্ধতাগুলি নির্দিষ্ট করতে পারে এবং ব্যবহারকারীদের বিধিনিষেধ সেটিংস থেকে সেই কার্যকলাপটি খুলতে দেয় . আপনার ব্রডকাস্ট রিসিভারে, ফলাফল Bundle অতিরিক্ত EXTRA_RESTRICTIONS_INTENT অন্তর্ভুক্ত করুন। এই অতিরিক্তটি অবশ্যই একটি Intent নির্দিষ্ট করতে হবে যেটি চালু করার জন্য Activity ক্লাস নির্দেশ করে (উদ্দেশ্য সহ EXTRA_RESTRICTIONS_INTENT পাস করতে putParcelable() পদ্ধতি ব্যবহার করুন)। যখন প্রাথমিক ব্যবহারকারী কাস্টম বিধিনিষেধ সেট করতে আপনার কার্যকলাপে প্রবেশ করে, তখন আপনার কার্যকলাপকে অবশ্যই EXTRA_RESTRICTIONS_LIST বা EXTRA_RESTRICTIONS_BUNDLE কী ব্যবহার করে একটি অতিরিক্ত সীমাবদ্ধতা মান সমন্বিত ফলাফল প্রদান করতে হবে, আপনি যথাক্রমে RestrictionEntry অবজেক্ট বা কী-মান জোড়া নির্দিষ্ট করেছেন কিনা তার উপর নির্ভর করে।

একটি সীমাবদ্ধ প্রোফাইলে সমর্থনকারী অ্যাকাউন্ট

প্রাথমিক ব্যবহারকারীর সাথে যোগ করা যেকোনো অ্যাকাউন্ট একটি সীমাবদ্ধ প্রোফাইলে উপলব্ধ, কিন্তু অ্যাকাউন্টগুলি ডিফল্টরূপে AccountManager API থেকে অ্যাক্সেসযোগ্য নয়। আপনি যদি একটি সীমাবদ্ধ প্রোফাইলে থাকাকালীন AccountManager এর সাথে একটি অ্যাকাউন্ট যোগ করার চেষ্টা করেন, তাহলে আপনি একটি ব্যর্থতার ফলাফল পাবেন৷ এই সীমাবদ্ধতার কারণে, আপনার কাছে নিম্নলিখিত তিনটি বিকল্প রয়েছে:

  • একটি সীমাবদ্ধ প্রোফাইল থেকে মালিকের অ্যাকাউন্টগুলিতে অ্যাক্সেসের অনুমতি দিন৷

    একটি সীমাবদ্ধ প্রোফাইল থেকে একটি অ্যাকাউন্টে অ্যাক্সেস পেতে, আপনাকে অবশ্যই <application> ট্যাগে android:restrictedAccountType অ্যাট্রিবিউট যোগ করতে হবে:

    <application ...
        android:restrictedAccountType="com.example.account.type" >
    

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

  • অ্যাকাউন্টগুলি সংশোধন করতে অক্ষম হলে নির্দিষ্ট কার্যকারিতা অক্ষম করুন৷

    আপনি যদি অ্যাকাউন্টগুলি ব্যবহার করতে চান, কিন্তু আসলে আপনার অ্যাপের প্রাথমিক কার্যকারিতার জন্য সেগুলির প্রয়োজন না হয়, আপনি অ্যাকাউন্টের উপলব্ধতা পরীক্ষা করতে পারেন এবং উপলব্ধ না থাকলে বৈশিষ্ট্যগুলি অক্ষম করতে পারেন৷ আপনার আগে চেক করা উচিত একটি বিদ্যমান অ্যাকাউন্ট আছে কিনা। যদি তা না হয়, তাহলে getUserRestrictions() কল করে একটি নতুন অ্যাকাউন্ট তৈরি করা সম্ভব কিনা তা জিজ্ঞাসা করুন এবং ফলাফলে অতিরিক্ত DISALLOW_MODIFY_ACCOUNTS চেক করুন৷ যদি এটি true হয়, তাহলে আপনার অ্যাপ্লিকেশানের যে কোনও কার্যকারিতার জন্য অ্যাকাউন্টগুলিতে অ্যাক্সেস প্রয়োজন তা অক্ষম করা উচিত৷ যেমন:

    কোটলিন

    val um = context.getSystemService(Context.USER_SERVICE) as UserManager
    val restrictions: Bundle = um.userRestrictions
    if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) {
        // cannot add accounts, disable some functionality
    }
    

    জাভা

    UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
    Bundle restrictions = um.getUserRestrictions();
    if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) {
        // cannot add accounts, disable some functionality
    }
    

    দ্রষ্টব্য: এই পরিস্থিতিতে, আপনার ম্যানিফেস্ট ফাইলে কোনো নতুন বৈশিষ্ট্য ঘোষণা করা উচিত নয়

  • ব্যক্তিগত অ্যাকাউন্ট অ্যাক্সেস করতে অক্ষম হলে আপনার অ্যাপ অক্ষম করুন।

    যদি এটি গুরুত্বপূর্ণ হয় যে আপনার অ্যাপটি সীমাবদ্ধ প্রোফাইলগুলিতে উপলব্ধ না হওয়া উচিত কারণ আপনার অ্যাপটি একটি অ্যাকাউন্টের সংবেদনশীল ব্যক্তিগত তথ্যের উপর নির্ভর করে (এবং যেহেতু সীমাবদ্ধ প্রোফাইলগুলি বর্তমানে নতুন অ্যাকাউন্ট যোগ করতে পারে না), <application> ট্যাগে android:requiredAccountType অ্যাট্রিবিউট যোগ করুন:

    <application ...
        android:requiredAccountType="com.example.account.type" >
    

    উদাহরণস্বরূপ, Gmail অ্যাপটি সীমাবদ্ধ প্রোফাইলগুলির জন্য নিজেকে অক্ষম করতে এই বৈশিষ্ট্যটি ব্যবহার করে, কারণ মালিকের ব্যক্তিগত ইমেল সীমাবদ্ধ প্রোফাইলগুলিতে উপলব্ধ হওয়া উচিত নয়৷

  • ওয়্যারলেস এবং সংযোগ

    ব্লুটুথ লো এনার্জি (স্মার্ট রেডি)

    Android এখন android.bluetooth এ নতুন API সহ Bluetooth Low Energy (LE) সমর্থন করে৷ নতুন API-এর সাহায্যে, আপনি Android অ্যাপ তৈরি করতে পারেন যা ব্লুটুথ লো এনার্জি পেরিফেরাল যেমন হার্ট রেট মনিটর এবং পেডোমিটারের সাথে যোগাযোগ করে।

    যেহেতু ব্লুটুথ LE একটি হার্ডওয়্যার বৈশিষ্ট্য যা সমস্ত অ্যান্ড্রয়েড-চালিত ডিভাইসে উপলব্ধ নয়, আপনাকে অবশ্যই আপনার ম্যানিফেস্ট ফাইলে "android.hardware.bluetooth_le" এর জন্য একটি <uses-feature> উপাদান ঘোষণা করতে হবে:

    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
    

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

    কোটলিন

    val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    bluetoothAdapter = bluetoothManager.adapter
    

    জাভা

    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    bluetoothAdapter = bluetoothManager.getAdapter();
    

    ব্লুটুথ LE পেরিফেরালগুলি আবিষ্কার করতে, BluetoothAdapterstartLeScan() কল করুন, এটিকে BluetoothAdapter.LeScanCallback ইন্টারফেসের একটি বাস্তবায়ন পাস করুন৷ যখন ব্লুটুথ অ্যাডাপ্টার একটি ব্লুটুথ LE পেরিফেরাল সনাক্ত করে, তখন আপনার BluetoothAdapter.LeScanCallback বাস্তবায়ন onLeScan() পদ্ধতিতে একটি কল পায়৷ এই পদ্ধতিটি আপনাকে একটি BluetoothDevice অবজেক্ট প্রদান করে যা সনাক্ত করা ডিভাইসের প্রতিনিধিত্ব করে, ডিভাইসের জন্য RSSI মান এবং ডিভাইসের বিজ্ঞাপন রেকর্ড ধারণকারী একটি বাইট অ্যারে।

    আপনি যদি শুধুমাত্র নির্দিষ্ট ধরণের পেরিফেরালগুলির জন্য স্ক্যান করতে চান তবে আপনি পরিবর্তে startLeScan() কল করতে পারেন এবং আপনার অ্যাপ সমর্থন করে এমন GATT পরিষেবাগুলি নির্দিষ্ট করে এমন UUID অবজেক্টগুলির একটি অ্যারে অন্তর্ভুক্ত করতে পারেন।

    দ্রষ্টব্য: আপনি শুধুমাত্র ব্লুটুথ LE ডিভাইসগুলির জন্য স্ক্যান করতে পারেন বা পূর্ববর্তী API ব্যবহার করে ক্লাসিক ব্লুটুথ ডিভাইসগুলির জন্য স্ক্যান করতে পারেন৷ আপনি একবারে LE এবং ক্লাসিক ব্লুটুথ ডিভাইস উভয়ের জন্য স্ক্যান করতে পারবেন না।

    তারপরে একটি ব্লুটুথ LE পেরিফেরালের সাথে সংযোগ করতে, সংশ্লিষ্ট BluetoothDevice অবজেক্টে connectGatt() কল করুন, এটিকে BluetoothGattCallback এর একটি বাস্তবায়ন পাস করুন৷ আপনার BluetoothGattCallback এর বাস্তবায়ন ডিভাইসের সাথে কানেক্টিভিটি অবস্থা এবং অন্যান্য ইভেন্টের বিষয়ে কলব্যাক গ্রহণ করে। এটি onConnectionStateChange() কলব্যাকের সময় যে পদ্ধতিটি নতুন অবস্থা হিসাবে STATE_CONNECTED পাস করলে আপনি ডিভাইসের সাথে যোগাযোগ শুরু করতে পারেন৷

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

    Wi-Fi স্ক্যান-শুধু মোড

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

    আপনি যদি ব্যবহারকারীর অবস্থান অর্জন করতে চান কিন্তু ওয়াই-ফাই বর্তমানে বন্ধ আছে, আপনি ব্যবহারকারীকে ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE অ্যাকশন সহ startActivity() কল করে Wi-Fi স্ক্যান-শুধু মোড সক্ষম করার জন্য অনুরোধ করতে পারেন।

    Wi-Fi কনফিগারেশন

    নতুন WifiEnterpriseConfig APIগুলি এন্টারপ্রাইজ-ভিত্তিক পরিষেবাগুলিকে পরিচালিত ডিভাইসগুলির জন্য Wi-Fi কনফিগারেশন স্বয়ংক্রিয় করার অনুমতি দেয়৷

    ইনকামিং কলের জন্য দ্রুত প্রতিক্রিয়া

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

    যখন ব্যবহারকারী দ্রুত প্রতিক্রিয়া সহ একটি ইনকামিং কলে সাড়া দেয়, তখন ফোন অ্যাপটি ACTION_RESPOND_VIA_MESSAGE ইন্টেন্ট পাঠায় একটি URI সহ প্রাপককে (কলার) বর্ণনা করে এবং ব্যবহারকারী যে বার্তা পাঠাতে চান তার সাথে অতিরিক্ত EXTRA_TEXT । যখন আপনার পরিষেবাটি অভিপ্রায় গ্রহণ করে, তখন এটি বার্তা প্রদান করে এবং অবিলম্বে নিজেকে বন্ধ করে দেয় (আপনার অ্যাপটি কোনও কার্যকলাপ দেখাবে না)।

    এই অভিপ্রায় পাওয়ার জন্য, আপনাকে অবশ্যই SEND_RESPOND_VIA_MESSAGE অনুমতি ঘোষণা করতে হবে৷

    মাল্টিমিডিয়া

    MediaExtractor এবং MediaCodec বর্ধিতকরণ

    Android এখন MediaCodec এবং MediaExtractor বিদ্যমান API ব্যবহার করে ISO/IEC 23009-1 মান অনুযায়ী HTTP (DASH) প্লেয়ারের উপর আপনার নিজস্ব ডায়নামিক অ্যাডাপ্টিভ স্ট্রিমিং লেখা সহজ করে তোলে। এই APIগুলির অন্তর্নিহিত কাঠামোটি খণ্ডিত MP4 ফাইলগুলির পার্সিংকে সমর্থন করার জন্য আপডেট করা হয়েছে, কিন্তু আপনার অ্যাপ এখনও MPD মেটাডেটা পার্স করার জন্য এবং পৃথক স্ট্রীমগুলিকে MediaExtractor এ পাস করার জন্য দায়ী৷

    আপনি যদি এনক্রিপ্ট করা সামগ্রীর সাথে DASH ব্যবহার করতে চান তবে লক্ষ্য করুন যে getSampleCryptoInfo() পদ্ধতিটি MediaCodec.CryptoInfo মেটাডেটা প্রদান করে যা প্রতিটি এনক্রিপ্ট করা মিডিয়া নমুনার গঠন বর্ণনা করে। এছাড়াও, getPsshInfo() পদ্ধতিটি MediaExtractor এ যোগ করা হয়েছে যাতে আপনি আপনার DASH মিডিয়ার জন্য PSSH মেটাডেটা অ্যাক্সেস করতে পারেন। এই পদ্ধতিটি UUID বস্তুর একটি মানচিত্র বাইটে ফেরত দেয়, UUID ক্রিপ্টো স্কিম নির্দিষ্ট করে এবং বাইটগুলি সেই স্কিমের জন্য নির্দিষ্ট ডেটা।

    মিডিয়া ডিআরএম

    নতুন MediaDrm ক্লাস মিডিয়া প্লেব্যাক থেকে DRM উদ্বেগগুলিকে আলাদা করে আপনার মিডিয়া বিষয়বস্তুর সাথে ডিজিটাল রাইটস ম্যানেজমেন্ট (DRM) এর জন্য একটি মডুলার সমাধান প্রদান করে। উদাহরণস্বরূপ, এই API বিচ্ছেদ আপনাকে Widevine-এনক্রিপ্ট করা সামগ্রীকে Widevine মিডিয়া ফর্ম্যাট ব্যবহার না করেই প্লে ব্যাক করার অনুমতি দেয়। এই DRM সমাধানটি DASH কমন এনক্রিপশনকেও সমর্থন করে যাতে আপনি আপনার স্ট্রিমিং বিষয়বস্তুর সাথে বিভিন্ন ধরনের DRM স্কিম ব্যবহার করতে পারেন।

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

    MediaDrm API গুলি Android 4.1 (API স্তর 16) এ প্রবর্তিত MediaCodec APIগুলির সাথে একত্রে ব্যবহার করার উদ্দেশ্যে, যার মধ্যে রয়েছে আপনার সামগ্রী এনকোডিং এবং ডিকোড করার জন্য MediaCodec , এনক্রিপ্ট করা সামগ্রী পরিচালনার জন্য MediaCrypto এবং আপনার সামগ্রী নিষ্কাশন এবং ডিমাক্স করার জন্য MediaExtractor

    আপনাকে প্রথমে MediaExtractor এবং MediaCodec অবজেক্ট তৈরি করতে হবে। তারপরে আপনি DRM-স্কিম-শনাক্তকারী UUID অ্যাক্সেস করতে পারেন, সাধারণত বিষয়বস্তুর মেটাডেটা থেকে, এবং এটির কনস্ট্রাক্টরের সাথে একটি MediaDrm অবজেক্টের একটি উদাহরণ তৈরি করতে এটি ব্যবহার করতে পারেন।

    একটি সারফেস থেকে ভিডিও এনকোডিং

    Android 4.1 (API স্তর 16) মিডিয়া কন্টেন্টের নিম্ন-স্তরের এনকোডিং এবং ডিকোডিংয়ের জন্য MediaCodec ক্লাস যুক্ত করেছে। ভিডিও এনকোড করার সময়, Android 4.1-এর প্রয়োজন হয় যে আপনি একটি ByteBuffer অ্যারে সহ মিডিয়া সরবরাহ করুন, কিন্তু Android 4.3 এখন আপনাকে একটি এনকোডারে ইনপুট হিসাবে একটি Surface ব্যবহার করতে দেয়৷ উদাহরণস্বরূপ, এটি আপনাকে একটি বিদ্যমান ভিডিও ফাইল থেকে বা OpenGL ES থেকে তৈরি ফ্রেম ব্যবহার করে ইনপুট এনকোড করতে দেয়।

    আপনার এনকোডারে ইনপুট হিসাবে একটি Surface ব্যবহার করতে, প্রথমে আপনার MediaCodec জন্য configure() কল করুন। তারপরে আপনি আপনার মিডিয়া স্ট্রিম করতে পারেন এমন Surface পেতে createInputSurface() এ কল করুন।

    উদাহরণস্বরূপ, আপনি প্রদত্ত Surface eglCreateWindowSurface() এ পাস করে একটি OpenGL প্রসঙ্গের জন্য উইন্ডো হিসাবে ব্যবহার করতে পারেন। তারপর পৃষ্ঠটি রেন্ডার করার সময়, MediaCodec ফ্রেমটি পাস করতে eglSwapBuffers() কল করুন।

    এনকোডিং শুরু করতে, MediaCodecstart() কল করুন। হয়ে গেলে, এনকোডিং বন্ধ করতে signalEndOfInputStream() কে কল করুন এবং Surface release() কল করুন।

    মিডিয়া মিক্সিং

    নতুন MediaMuxer ক্লাস একটি অডিও স্ট্রিম এবং একটি ভিডিও স্ট্রিমের মধ্যে মাল্টিপ্লেক্সিং সক্ষম করে৷ এই APIগুলি ডি-মাল্টিপ্লেক্সিং (ডিমক্সিং) মিডিয়ার জন্য অ্যান্ড্রয়েড 4.2-এ যোগ করা MediaExtractor ক্লাসের প্রতিরূপ হিসাবে কাজ করে।

    সমর্থিত আউটপুট ফরম্যাট MediaMuxer.OutputFormat এ সংজ্ঞায়িত করা হয়েছে। বর্তমানে, MP4 একমাত্র সমর্থিত আউটপুট ফরম্যাট এবং MediaMuxer বর্তমানে শুধুমাত্র একটি অডিও স্ট্রীম এবং/অথবা একটি ভিডিও স্ট্রীম সমর্থন করে।

    MediaMuxer বেশিরভাগ ক্ষেত্রে MediaCodec এর সাথে কাজ করার জন্য ডিজাইন করা হয়েছে যাতে আপনি MediaCodec মাধ্যমে ভিডিও প্রক্রিয়াকরণ করতে পারেন তারপর MediaMuxer মাধ্যমে একটি MP4 ফাইলে আউটপুট সংরক্ষণ করতে পারেন। আপনি এনকোড বা ডিকোড করার প্রয়োজন ছাড়াই মিডিয়া সম্পাদনা সম্পাদন করতে MediaExtractor এর সংমিশ্রণে MediaMuxer ব্যবহার করতে পারেন।

    RemoteControlClient-এর জন্য প্লেব্যাক অগ্রগতি এবং স্ক্রাবিং

    অ্যান্ড্রয়েড 4.0 (API স্তর 14) এ, RemoteControlClient রিমোট কন্ট্রোল ক্লায়েন্ট যেমন লক স্ক্রিনে উপলব্ধ নিয়ন্ত্রণগুলি থেকে মিডিয়া প্লেব্যাক নিয়ন্ত্রণগুলি সক্ষম করতে যোগ করা হয়েছিল৷ অ্যান্ড্রয়েড 4.3 এখন এই ধরনের কন্ট্রোলারদের প্লেব্যাক অবস্থান এবং প্লেব্যাক স্ক্রাব করার জন্য নিয়ন্ত্রণগুলি প্রদর্শন করার ক্ষমতা প্রদান করে। আপনি যদি RemoteControlClient API-এর মাধ্যমে আপনার মিডিয়া অ্যাপের জন্য রিমোট কন্ট্রোল সক্ষম করে থাকেন, তাহলে আপনি দুটি নতুন ইন্টারফেস প্রয়োগ করে প্লেব্যাক স্ক্রাবিংয়ের অনুমতি দিতে পারেন।

    প্রথমে, আপনাকে অবশ্যই FLAG_KEY_MEDIA_POSITION_UPDATE পতাকা setTransportControlsFlags() এ পাস করে সক্ষম করতে হবে।

    তারপর নিম্নলিখিত দুটি নতুন ইন্টারফেস বাস্তবায়ন করুন:

    RemoteControlClient.OnGetPlaybackPositionListener
    এর মধ্যে কলব্যাক onGetPlaybackPosition() অন্তর্ভুক্ত রয়েছে, যা আপনার মিডিয়ার বর্তমান অবস্থানের জন্য অনুরোধ করে যখন রিমোট কন্ট্রোলের UI এর অগ্রগতি আপডেট করার প্রয়োজন হয়।
    RemoteControlClient.OnPlaybackPositionUpdateListener
    এর মধ্যে রয়েছে কলব্যাক onPlaybackPositionUpdate() , যা আপনার অ্যাপটিকে আপনার মিডিয়ার জন্য নতুন টাইম কোড বলে যখন ব্যবহারকারী রিমোট কন্ট্রোল UI দিয়ে প্লেব্যাক স্ক্রাব করে।

    একবার আপনি নতুন অবস্থানের সাথে আপনার প্লেব্যাক আপডেট করলে, নতুন প্লেব্যাকের অবস্থা, অবস্থান এবং গতি নির্দেশ করতে setPlaybackState() কল করুন।

    এই ইন্টারফেসগুলিকে সংজ্ঞায়িত করে, আপনি যথাক্রমে setOnGetPlaybackPositionListener() এবং setPlaybackPositionUpdateListener() এ কল করে আপনার RemoteControlClient এর জন্য সেট করতে পারেন।

    গ্রাফিক্স

    OpenGL ES 3.0 এর জন্য সমর্থন

    Android 4.3 জাভা ইন্টারফেস এবং OpenGL ES 3.0 এর জন্য নেটিভ সমর্থন যোগ করে। OpenGL ES 3.0-তে দেওয়া মূল নতুন কার্যকারিতা অন্তর্ভুক্ত:

    • উন্নত ভিজ্যুয়াল এফেক্টের ত্বরণ
    • একটি আদর্শ বৈশিষ্ট্য হিসাবে উচ্চ মানের ETC2/EAC টেক্সচার কম্প্রেশন
    • পূর্ণসংখ্যা এবং 32-বিট ফ্লোটিং পয়েন্ট সমর্থন সহ GLSL ES শেডিং ভাষার একটি নতুন সংস্করণ
    • উন্নত টেক্সচার রেন্ডারিং
    • টেক্সচারের আকার এবং রেন্ডার-বাফার ফরম্যাটের বিস্তৃত প্রমিতকরণ

    Android-এ OpenGL ES 3.0-এর জন্য জাভা ইন্টারফেস GLES30 এর সাথে দেওয়া হয়েছে। OpenGL ES 3.0 ব্যবহার করার সময়, নিশ্চিত হোন যে আপনি আপনার ম্যানিফেস্ট ফাইলে <uses-feature> ট্যাগ এবং android:glEsVersion অ্যাট্রিবিউট দিয়ে ঘোষণা করেছেন। যেমন:

    <manifest>
        <uses-feature android:glEsVersion="0x00030000" />
        ...
    </manifest>
    

    এবং setEGLContextClientVersion() কল করে, 3 সংস্করণ হিসাবে পাস করে OpenGL ES প্রসঙ্গ নির্দিষ্ট করতে ভুলবেন না।

    রানটাইমে ডিভাইসের সমর্থিত OpenGL ES সংস্করণটি কীভাবে পরীক্ষা করবেন তা সহ OpenGL ES ব্যবহার সম্পর্কে আরও তথ্যের জন্য, OpenGL ES API নির্দেশিকা দেখুন।

    অঙ্কনযোগ্যদের জন্য মিপম্যাপিং

    আপনার বিটম্যাপের উৎস হিসেবে একটি মিপম্যাপ ব্যবহার করা বা অঙ্কনযোগ্য একটি মানসম্পন্ন চিত্র এবং বিভিন্ন চিত্র স্কেল প্রদান করার একটি সহজ উপায়, যা বিশেষভাবে কার্যকর হতে পারে যদি আপনি একটি অ্যানিমেশনের সময় আপনার ছবিটি স্কেল করার আশা করেন।

    Android 4.2 (API লেভেল 17) Bitmap ক্লাসে মিপম্যাপের জন্য সমর্থন যোগ করেছে—অ্যান্ড্রয়েড আপনার Bitmap মিপ ইমেজগুলিকে অদলবদল করে যখন আপনি একটি মিপম্যাপ উৎস সরবরাহ করেন এবং setHasMipMap() সক্ষম করেন। এখন অ্যান্ড্রয়েড 4.3-এ, আপনি একটি বিটম্যাপ অ্যাসেট প্রদান করে এবং একটি বিটম্যাপ রিসোর্স ফাইলে android:mipMap অ্যাট্রিবিউট সেট করে বা hasMipMap() কল করে একটি BitmapDrawable অবজেক্টের জন্য মিপম্যাপ সক্ষম করতে পারেন।

    ইউজার ইন্টারফেস

    ওভারলে দেখুন

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

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

    আপনি যখন একটি Button মতো উইজেট ভিউয়ের জন্য একটি ওভারলে তৈরি করেন, তখন আপনি add(Drawable) কল করে ওভারলেতে Drawable বস্তু যোগ করতে পারেন। আপনি যদি একটি লেআউট ভিউ, যেমন RelativeLayout এর জন্য getOverlay() কল করেন, তাহলে যে বস্তুটি ফেরত দেওয়া হয় সেটি হল একটি ViewGroupOverlayViewGroupOverlay ক্লাস হল ViewOverlay এর একটি সাবক্লাস যা আপনাকে add(View) কল করে View অবজেক্ট যোগ করতে দেয়।

    দ্রষ্টব্য: সমস্ত অঙ্কনযোগ্য এবং দৃশ্যগুলি যা আপনি একটি ওভারলেতে যুক্ত করেন শুধুমাত্র ভিজ্যুয়াল৷ তারা ফোকাস বা ইনপুট ইভেন্টগুলি গ্রহণ করতে পারে না।

    উদাহরণস্বরূপ, নিম্নলিখিত কোডটি প্যারেন্ট ভিউয়ের ওভারলেতে ভিউ স্থাপন করে ডানদিকে স্লাইডিং একটি ভিউকে অ্যানিমেট করে, তারপর সেই ভিউতে একটি অনুবাদ অ্যানিমেশন সম্পাদন করে:

    কোটলিন

    val view: View? = findViewById(R.id.view_to_remove)
    val container: ViewGroup? = view?.parent as ViewGroup
    
    container?.apply {
        overlay.add(view)
        ObjectAnimator.ofFloat(view, "translationX", right.toFloat())
                .start()
    }
    

    জাভা

    View view = findViewById(R.id.view_to_remove);
    ViewGroup container = (ViewGroup) view.getParent();
    container.getOverlay().add(view);
    ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight());
    anim.start();
    

    অপটিক্যাল বাউন্ড লেআউট

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

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

    দ্রষ্টব্য: চিত্র 1 এবং 2-এর স্ক্রিনশটটিতে "লেআউট সীমা দেখান" বিকাশকারী সেটিং সক্ষম করা আছে৷ প্রতিটি দৃশ্যের জন্য, লাল রেখাগুলি অপটিক্যাল সীমা নির্দেশ করে, নীল রেখাগুলি ক্লিপ সীমা নির্দেশ করে এবং গোলাপী মার্জিন নির্দেশ করে৷

    চিত্র 1. ক্লিপ বাউন্ড ব্যবহার করে লেআউট (ডিফল্ট)।

    চিত্র 2. অপটিক্যাল বাউন্ড ব্যবহার করে লেআউট।

    তাদের অপটিক্যাল বাউন্ডের উপর ভিত্তি করে ভিউগুলি সারিবদ্ধ করতে, android:layoutMode অ্যাট্রিবিউটটিকে প্যারেন্ট লেআউটগুলির একটিতে "opticalBounds" -এ সেট করুন। যেমন:

    <LinearLayout android:layoutMode="opticalBounds" ... >
    

    চিত্র 3. অপটিক্যাল বাউন্ড সহ Holo বোতাম নাইন-প্যাচের জুম করা দৃশ্য।

    এটি কাজ করার জন্য, আপনার দৃশ্যের পটভূমিতে প্রয়োগ করা নয়-প্যাচ চিত্রগুলি অবশ্যই নয়-প্যাচ ফাইলের নীচে এবং ডানদিকে লাল লাইন ব্যবহার করে অপটিক্যাল সীমা নির্দিষ্ট করতে হবে (চিত্র 3 এ দেখানো হয়েছে)। লাল রেখাগুলি সেই অঞ্চলকে নির্দেশ করে যা ক্লিপ সীমা থেকে বিয়োগ করা উচিত, চিত্রের অপটিক্যাল সীমানা বাদ দিয়ে৷

    আপনি যখন আপনার লেআউটে একটি ViewGroup জন্য অপটিক্যাল বাউন্ডস সক্ষম করেন, তখন সমস্ত ডিসেন্ডেন্ট ভিউ অপটিক্যাল বাউন্ড লেআউট মোডের উত্তরাধিকারী হয় যদি না আপনি android:layoutMode কে "clipBounds" এ সেট করে একটি গ্রুপের জন্য এটিকে ওভাররাইড করেন। সমস্ত লেআউট উপাদানগুলি তাদের শিশুর দৃষ্টিভঙ্গির অপটিক্যাল সীমাকেও সম্মান করে, তাদের মধ্যে থাকা দৃষ্টিভঙ্গির অপটিক্যাল সীমার উপর ভিত্তি করে তাদের নিজস্ব সীমানাকে মানিয়ে নেয়। যাইহোক, লেআউট উপাদানগুলি ( ViewGroup সাবক্লাসগুলি) বর্তমানে তাদের নিজস্ব পটভূমিতে প্রয়োগ করা নয়-প্যাচ চিত্রগুলির জন্য অপটিক্যাল বাউন্ড সমর্থন করে না।

    আপনি যদি View , ViewGroup , বা এর যেকোনো সাবক্লাস করে একটি কাস্টম ভিউ তৈরি করেন, তাহলে আপনার ভিউ এই অপটিক্যাল আবদ্ধ আচরণের উত্তরাধিকারী হবে।

    দ্রষ্টব্য: হোলো থিম দ্বারা সমর্থিত সমস্ত উইজেটগুলি অপটিক্যাল বাউন্ড সহ আপডেট করা হয়েছে, যার মধ্যে রয়েছে Button , Spinner , EditText এবং অন্যান্য। তাই আপনি অবিলম্বে android:layoutMode বৈশিষ্ট্যটিকে "opticalBounds" -এ সেট করে উপকৃত হতে পারেন যদি আপনার অ্যাপটি Holo থিম ( Theme.Holo , Theme.Holo.Light , ইত্যাদি) প্রয়োগ করে।

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

    Rect মানগুলির জন্য অ্যানিমেশন

    আপনি এখন নতুন RectEvaluator দিয়ে দুটি Rect মানের মধ্যে অ্যানিমেট করতে পারেন। এই নতুন ক্লাসটি TypeEvaluator এর একটি বাস্তবায়ন যা আপনি ValueAnimator.setEvaluator() এ পাস করতে পারেন।

    উইন্ডো সংযুক্ত এবং ফোকাস শ্রোতা

    পূর্বে, আপনি যদি শুনতে চান কখন আপনার ভিউ উইন্ডোতে সংযুক্ত/বিচ্ছিন্ন হয়েছে বা কখন এটির ফোকাস পরিবর্তিত হয়েছে, আপনাকে যথাক্রমে onAttachedToWindow() এবং onDetachedFromWindow() , অথবা onWindowFocusChanged() প্রয়োগ করতে View ক্লাসটি ওভাররাইড করতে হবে।

    এখন, সংযুক্তি এবং বিচ্ছিন্ন ইভেন্টগুলি পেতে আপনি পরিবর্তে ViewTreeObserver.OnWindowAttachListener প্রয়োগ করতে পারেন এবং addOnWindowAttachListener() এর সাথে একটি ভিউতে সেট করতে পারেন। এবং ফোকাস ইভেন্টগুলি পেতে, আপনি ViewTreeObserver.OnWindowFocusChangeListener প্রয়োগ করতে পারেন এবং addOnWindowFocusChangeListener() এর সাথে একটি ভিউতে সেট করতে পারেন।

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

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

    স্ক্রীন অভিযোজন

    <activity> ট্যাগের screenOrientation অ্যাট্রিবিউট এখন স্বয়ংক্রিয় ঘূর্ণনের জন্য ব্যবহারকারীর পছন্দকে সম্মান করতে অতিরিক্ত মান সমর্থন করে:

    "userLandscape"
    "sensorLandscape" এর মতোই আচরণ করে, যদি ব্যবহারকারী স্বয়ংক্রিয়-ঘোরানো অক্ষম করে তবে এটি স্বাভাবিক ল্যান্ডস্কেপ অভিযোজনে লক হয়ে যায় এবং ফ্লিপ হবে না।
    "userPortrait"
    "sensorPortrait" এর মতোই আচরণ করে, যদি ব্যবহারকারী স্বয়ংক্রিয়-ঘোরানো অক্ষম করে তবে এটি স্বাভাবিক প্রতিকৃতি অভিযোজনে লক হয়ে যায় এবং ফ্লিপ হবে না৷
    "fullUser"
    "fullSensor" এর মতোই আচরণ করে এবং চারটি দিকে ঘোরানোর অনুমতি দেয়, ব্যবহারকারী যদি স্বয়ংক্রিয়-ঘোরানো অক্ষম করে তবে এটি ব্যবহারকারীর পছন্দের অভিযোজনে লক করে।

    উপরন্তু, আপনি এখন স্ক্রিনের বর্তমান অভিযোজনে আপনার অ্যাপের অভিযোজন লক করতে "locked" ঘোষণা করতে পারেন।

    ঘূর্ণন অ্যানিমেশন

    WindowManager এ নতুন rotationAnimation ক্ষেত্র আপনাকে তিনটি অ্যানিমেশনের মধ্যে একটি নির্বাচন করতে দেয় যা আপনি ব্যবহার করতে চান যখন সিস্টেমটি স্ক্রিন অভিযোজন পরিবর্তন করে। তিনটি অ্যানিমেশন হল:

    দ্রষ্টব্য: এই অ্যানিমেশনগুলি শুধুমাত্র তখনই পাওয়া যায় যদি আপনি "পূর্ণস্ক্রীন" মোড ব্যবহার করার জন্য আপনার কার্যকলাপ সেট করেন, যা আপনি Theme.Holo.NoActionBar.Fullscreen এর মতো থিমগুলির সাথে সক্ষম করতে পারেন৷

    উদাহরণস্বরূপ, এখানে আপনি কিভাবে "ক্রসফেড" অ্যানিমেশন সক্ষম করতে পারেন:

    কোটলিন

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val params: WindowManager.LayoutParams = window.attributes
        params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE
        window.attributes = params
        ...
    }
    

    জাভা

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
        getWindow().setAttributes(params);
        ...
    }
    

    ব্যবহারকারীর ইনপুট

    নতুন সেন্সর প্রকার

    নতুন TYPE_GAME_ROTATION_VECTOR সেন্সর আপনাকে চৌম্বকীয় হস্তক্ষেপ সম্পর্কে চিন্তা না করেই ডিভাইসের ঘূর্ণন সনাক্ত করতে দেয়৷ TYPE_ROTATION_VECTOR সেন্সরের বিপরীতে, TYPE_GAME_ROTATION_VECTOR চৌম্বকীয় উত্তরের উপর ভিত্তি করে নয়।

    নতুন TYPE_GYROSCOPE_UNCALIBRATED এবং TYPE_MAGNETIC_FIELD_UNCALIBRATED সেন্সরগুলি পক্ষপাতের অনুমানের বিবেচনা ছাড়াই কাঁচা সেন্সর ডেটা প্রদান করে৷ অর্থাৎ, বিদ্যমান TYPE_GYROSCOPE এবং TYPE_MAGNETIC_FIELD সেন্সরগুলি সেন্সর ডেটা সরবরাহ করে যা ডিভাইসে যথাক্রমে গাইরো-ড্রিফট এবং হার্ড আয়রন থেকে আনুমানিক পক্ষপাতকে বিবেচনা করে। যেখানে এই সেন্সরগুলির নতুন "আনক্যালিব্রেটেড" সংস্করণগুলি পরিবর্তে কাঁচা সেন্সর ডেটা সরবরাহ করে এবং আনুমানিক পক্ষপাতের মানগুলি আলাদাভাবে অফার করে৷ এই সেন্সরগুলি আপনাকে বাহ্যিক ডেটার সাথে আনুমানিক পক্ষপাত বাড়িয়ে সেন্সর ডেটার জন্য আপনার নিজস্ব কাস্টম ক্রমাঙ্কন প্রদান করার অনুমতি দেয়৷

    বিজ্ঞপ্তি শ্রোতা

    Android 4.3 একটি নতুন পরিষেবা শ্রেণী, NotificationListenerService যোগ করে, যা আপনার অ্যাপকে সিস্টেম দ্বারা পোস্ট করা নতুন বিজ্ঞপ্তিগুলি সম্পর্কে তথ্য পেতে অনুমতি দেয়৷

    যদি আপনার অ্যাপ বর্তমানে সিস্টেম বিজ্ঞপ্তিগুলি অ্যাক্সেস করার জন্য অ্যাক্সেসিবিলিটি পরিষেবা API ব্যবহার করে, তাহলে এই APIগুলি ব্যবহার করার জন্য আপনার অ্যাপ আপডেট করা উচিত।

    পরিচিতি প্রদানকারী

    "যোগাযোগযোগ্য" জন্য ক্যোয়ারী

    নতুন পরিচিতি প্রদানকারী ক্যোয়ারী, Contactables.CONTENT_URI , একটি Cursor পাওয়ার একটি কার্যকর উপায় প্রদান করে যাতে নির্দিষ্ট ক্যোয়ারির সাথে মিলে যাওয়া সমস্ত পরিচিতির সাথে সম্পর্কিত সমস্ত ইমেল ঠিকানা এবং ফোন নম্বর রয়েছে৷

    পরিচিতি ডেল্টা জন্য ক্যোয়ারী

    পরিচিতি সরবরাহকারীতে নতুন API যোগ করা হয়েছে যা আপনাকে পরিচিতি ডেটাতে সাম্প্রতিক পরিবর্তনগুলি দক্ষতার সাথে অনুসন্ধান করতে দেয়৷ পূর্বে, পরিচিতি ডেটার মধ্যে কিছু পরিবর্তন হলে আপনার অ্যাপকে অবহিত করা যেত, কিন্তু আপনি ঠিক কী পরিবর্তিত হয়েছে তা জানতে পারবেন না এবং সমস্ত পরিচিতি পুনরুদ্ধার করতে হবে তারপর পরিবর্তনটি আবিষ্কার করতে তাদের মাধ্যমে পুনরাবৃত্তি করতে হবে।

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

    কোন পরিচিতিগুলি মুছে ফেলা হয়েছে তা ট্র্যাক করতে, নতুন টেবিল ContactsContract.DeletedContacts মুছে ফেলা পরিচিতিগুলির একটি লগ প্রদান করে (তবে মুছে ফেলা প্রতিটি পরিচিতি সীমিত সময়ের জন্য এই টেবিলে রাখা হয়)৷ CONTACT_LAST_UPDATED_TIMESTAMP এর মতো, আপনি শেষবার প্রদানকারীকে জিজ্ঞাসা করার পর থেকে কোন পরিচিতিগুলি মুছে ফেলা হয়েছে তা পরীক্ষা করতে আপনি নতুন নির্বাচন প্যারামিটার, CONTACT_DELETED_TIMESTAMP ব্যবহার করতে পারেন৷ সারণীতে ধ্রুবক DAYS_KEPT_MILLISECONDS ও রয়েছে যেখানে লগটি রাখা হবে এমন দিনের সংখ্যা (মিলিসেকেন্ডে)।

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

    পরিচিতিগুলিতে পরিবর্তনগুলি পরীক্ষা করতে এই APIগুলি ব্যবহার করে নমুনা কোডের জন্য, SDK নমুনা ডাউনলোডে উপলব্ধ ApiDemos নমুনাটি দেখুন৷

    স্থানীয়করণ

    দ্বি-মুখী পাঠ্যের জন্য উন্নত সমর্থন

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

    উদাহরণস্বরূপ, যখন আপনি একটি স্ট্রিং ভেরিয়েবল দিয়ে একটি বাক্য তৈরি করতে চান, যেমন "আপনি কি 15 বে স্ট্রিট, লরেল, CA বলতে চান?", আপনি সাধারণত একটি স্থানীয় স্ট্রিং রিসোর্স এবং ভেরিয়েবলটিকে String.format() এ পাস করেন :

    কোটলিন

    val suggestion = String.format(resources.getString(R.string.did_you_mean), address)
    

    জাভা

    Resources res = getResources();
    String suggestion = String.format(res.getString(R.string.did_you_mean), address);
    

    যাইহোক, যদি লোকেলটি হিব্রু হয়, তাহলে ফর্ম্যাট করা স্ট্রিংটি এভাবে বেরিয়ে আসে:

    האם התכוונת ל 15 বে স্ট্রিট, লরেল, CA?

    এটা ভুল কারণ "15" কে "বে স্ট্রিট" ছেড়ে দেওয়া উচিত। সমাধান হল BidiFormatter এবং এর unicodeWrap() পদ্ধতি ব্যবহার করা। উদাহরণস্বরূপ, উপরের কোডটি হয়ে যায়:

    কোটলিন

    val bidiFormatter = BidiFormatter.getInstance()
    val suggestion = String.format(
            resources.getString(R.string.did_you_mean),
            bidiFormatter.unicodeWrap(address)
    )
    

    জাভা

    Resources res = getResources();
    BidiFormatter bidiFormatter = BidiFormatter.getInstance();
    String suggestion = String.format(res.getString(R.string.did_you_mean),
            bidiFormatter.unicodeWrap(address));
    

    ডিফল্টরূপে, unicodeWrap() প্রথম-দৃঢ় দিকনির্দেশনা অনুমান হিউরিস্টিক ব্যবহার করে, যা কিছু ভুল হতে পারে যদি পাঠ্য দিকনির্দেশের প্রথম সংকেতটি সামগ্রিকভাবে বিষয়বস্তুর জন্য উপযুক্ত দিক নির্দেশ না করে। প্রয়োজনে, আপনি TextDirectionHeuristics থেকে unicodeWrap()TextDirectionHeuristic ধ্রুবকগুলির একটি পাস করে একটি ভিন্ন হিউরিস্টিক নির্দিষ্ট করতে পারেন।

    দ্রষ্টব্য: এই নতুন APIগুলি Android এর পূর্ববর্তী সংস্করণগুলির জন্য Android সমর্থন লাইব্রেরির মাধ্যমে, BidiFormatter ক্লাস এবং সম্পর্কিত APIগুলির সাথে উপলব্ধ৷

    অ্যাক্সেসিবিলিটি পরিষেবা

    মূল ঘটনাগুলি পরিচালনা করুন

    একটি AccessibilityService এখন onKeyEvent() কলব্যাক পদ্ধতির সাথে কী ইনপুট ইভেন্টের জন্য একটি কলব্যাক পেতে পারে। এটি আপনার অ্যাক্সেসিবিলিটি পরিষেবাটি কী-ভিত্তিক ইনপুট ডিভাইসের জন্য ইনপুট পরিচালনা করতে এবং কীবোর্ডের মতো ইনপুট পরিচালনা করতে দেয় এবং সেই ইভেন্টগুলিকে বিশেষ ক্রিয়ায় অনুবাদ করে যা পূর্বে কেবল স্পর্শ ইনপুট বা ডিভাইসের দিকনির্দেশক প্যাড দিয়ে সম্ভব হতে পারে।

    পাঠ্য নির্বাচন করুন এবং অনুলিপি/পেস্ট করুন

    AccessibilityNodeInfo এখন এপিআই সরবরাহ করে যা AccessibilityService নোডে পাঠ্য নির্বাচন, কাটা, অনুলিপি এবং পেস্ট করার অনুমতি দেয়।

    কাটা বা অনুলিপি করার জন্য পাঠ্যের নির্বাচন নির্দিষ্ট করতে, আপনার অ্যাক্সেসিবিলিটি পরিষেবাটি নতুন অ্যাকশন, ACTION_SET_SELECTION ব্যবহার করতে পারে, এর সাথে ACTION_ARGUMENT_SELECTION_START_INT এবং ACTION_ARGUMENT_SELECTION_END_INT দিয়ে নির্বাচন শুরু এবং শেষ অবস্থানটি ব্যবহার করতে পারে। বিকল্পভাবে আপনি বিদ্যমান ক্রিয়া, ACTION_NEXT_AT_MOVEMENT_GRANULARITY (পূর্বে কেবল কার্সার অবস্থানটি সরিয়ে নেওয়ার জন্য) ব্যবহার করে কার্সার পজিশনের ম্যানিপুলেট করে পাঠ্য নির্বাচন করতে পারেন এবং আর্গুমেন্টটি ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN যুক্ত করে।

    তারপরে আপনি ACTION_CUT , ACTION_COPY দিয়ে কাটতে বা অনুলিপি করতে পারেন, তারপরে পরে ACTION_PASTE সাথে আটকান।

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

    অ্যাক্সেসযোগ্যতার বৈশিষ্ট্যগুলি ঘোষণা করুন

    অ্যান্ড্রয়েড 4.3 দিয়ে শুরু করে, একটি অ্যাক্সেসিবিলিটি পরিষেবা অবশ্যই নির্দিষ্ট অ্যাক্সেসযোগ্যতা বৈশিষ্ট্যগুলি ব্যবহার করার জন্য তার মেটাডেটা ফাইলে অ্যাক্সেসযোগ্যতার ক্ষমতাগুলি ঘোষণা করতে হবে। যদি মেটাডেটা ফাইলে সক্ষমতার জন্য অনুরোধ না করা হয় তবে বৈশিষ্ট্যটি কোনও নো-ওপ হবে। আপনার পরিষেবার অ্যাক্সেসযোগ্যতার ক্ষমতাগুলি ঘোষণা করার জন্য, আপনাকে অবশ্যই এক্সএমএল বৈশিষ্ট্যগুলি ব্যবহার করতে হবে যা AccessibilityServiceInfo শ্রেণীর বিভিন্ন "সক্ষমতা" ধ্রুবকের সাথে মিলে যায়।

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

    পরীক্ষা এবং ডিবাগিং

    স্বয়ংক্রিয় ইউআই পরীক্ষা

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

    UiAutomation এর উদাহরণ পেতে, কল করুন Instrumentation.getUiAutomation() এটি কাজ করার জন্য, adb shell থেকে আপনার InstrumentationTestCase চালানোর সময় আপনাকে অবশ্যই instrument কমান্ডের সাথে -w বিকল্পটি সরবরাহ করতে হবে।

    UiAutomation উদাহরণ দিয়ে, আপনি executeAndWaitForEvent() কে কল করে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করার জন্য স্বেচ্ছাসেবী ইভেন্টগুলি সম্পাদন করতে পারেন, এটি সম্পাদনের জন্য একটি Runnable , অপারেশনের জন্য একটি সময়সীমা সময়কাল এবং UiAutomation.AccessibilityEventFilter । এটি আপনার UiAutomation.AccessibilityEventFilter এর মধ্যে।

    পরীক্ষার সময় সমস্ত ইভেন্টগুলি পর্যবেক্ষণ করতে, UiAutomation.OnAccessibilityEventListener এর বাস্তবায়ন তৈরি করুন এবং এটি setOnAccessibilityEventListener() এ পাস করুন। আপনার শ্রোতার ইন্টারফেসটি তখন onAccessibilityEvent() এর কাছে প্রতিটি ইভেন্ট ঘটে যখন ইভেন্টটি বর্ণনা করে এমন একটি AccessibilityEvent অবজেক্ট গ্রহণ করে।

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

    • ইনপুট ইভেন্ট ইনজেকশন
    • পর্দার ওরিয়েন্টেশন পরিবর্তন করুন
    • স্ক্রিনশট নিন

    এবং সবচেয়ে গুরুত্বপূর্ণভাবে ইউআই পরীক্ষার সরঞ্জামগুলির জন্য, UiAutomation এপিআইগুলি Instrumentation ক্ষেত্রে পৃথকভাবে অ্যাপ্লিকেশন সীমানা জুড়ে কাজ করে।

    অ্যাপ্লিকেশনগুলির জন্য systrace ইভেন্টগুলি

    অ্যান্ড্রয়েড 4.3 দুটি স্ট্যাটিক পদ্ধতি, beginSection() এবং endSection() এর সাথে Trace ক্লাস যুক্ত করে, যা আপনাকে কোডের ব্লকগুলি সিস্ট্রেস রিপোর্টের সাথে অন্তর্ভুক্ত করার জন্য সংজ্ঞায়িত করতে দেয়। আপনার অ্যাপ্লিকেশনটিতে ট্রেসযোগ্য কোডের বিভাগগুলি তৈরি করে, সিস্টেমস্ট্রেস লগগুলি আপনাকে আপনার অ্যাপ্লিকেশনটির মধ্যে কোথায় ধীরগতিতে ঘটে তার আরও বিশদ বিশ্লেষণ সরবরাহ করে।

    সিস্ট্রেস সরঞ্জাম ব্যবহার সম্পর্কে তথ্যের জন্য, বিশ্লেষণ প্রদর্শন এবং সিস্ট্রেসের সাথে পারফরম্যান্স পড়ুন।

    নিরাপত্তা

    অ্যাপ-প্রাইভেট কীগুলির জন্য অ্যান্ড্রয়েড কী স্টোর

    অ্যান্ড্রয়েড এখন KeyStore সুবিধাটিতে একটি কাস্টম জাভা সুরক্ষা সরবরাহকারী সরবরাহ করে, যার নাম অ্যান্ড্রয়েড কী স্টোর, যা আপনাকে কেবলমাত্র আপনার অ্যাপ্লিকেশন দ্বারা দেখা এবং ব্যবহার করা যেতে পারে এমন ব্যক্তিগত কীগুলি তৈরি এবং সংরক্ষণ করতে দেয়। অ্যান্ড্রয়েড কী স্টোরটি লোড করতে, KeyStore.getInstance()"AndroidKeyStore" পাস করুন।

    অ্যান্ড্রয়েড কী স্টোরটিতে আপনার অ্যাপ্লিকেশনটির ব্যক্তিগত শংসাপত্রগুলি পরিচালনা করতে, KeyPairGeneratorSpec সাথে KeyPairGenerator সহ একটি নতুন কী তৈরি করুন। প্রথমে getInstance() কল করে KeyPairGenerator একটি উদাহরণ পান। তারপরে এটি KeyPairGeneratorSpec একটি উদাহরণ পাস করে initialize() কল করুন, যা আপনি KeyPairGeneratorSpec.Builder ব্যবহার করতে পারেন। অবশেষে, generateKeyPair() কল করে আপনার KeyPair পান।

    হার্ডওয়্যার শংসাপত্র স্টোরেজ

    অ্যান্ড্রয়েড এখন আপনার KeyChain শংসাপত্রগুলির জন্য হার্ডওয়্যার-ব্যাক স্টোরেজ সমর্থন করে, কীগুলি নিষ্কাশনের জন্য অনুপলব্ধ করে আরও সুরক্ষা সরবরাহ করে। এটি হ'ল, একবার কীগুলি একটি হার্ডওয়্যার-সমর্থিত কী স্টোরে (সুরক্ষিত উপাদান, টিপিএম, বা ট্রাস্টজোন) হয়ে যায়, সেগুলি ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপের জন্য ব্যবহার করা যেতে পারে তবে ব্যক্তিগত কী উপাদান রফতানি করা যায় না। এমনকি ওএস কার্নেলও এই মূল উপাদানটি অ্যাক্সেস করতে পারে না। সমস্ত অ্যান্ড্রয়েড-চালিত ডিভাইসগুলি হার্ডওয়্যারগুলিতে স্টোরেজ সমর্থন করে না, আপনি রানটাইমে চেক করতে পারেন যদি হার্ডওয়্যার-ব্যাক স্টোরেজ KeyChain.IsBoundKeyAlgorithm() কল করে উপলব্ধ থাকে।

    প্রকাশ্য ঘোষণা

    ঘোষিত প্রয়োজনীয় বৈশিষ্ট্য

    নিম্নলিখিত মানগুলি এখন <uses-feature> বৈশিষ্ট্য> উপাদানটিতে সমর্থিত যাতে আপনি নিশ্চিত করতে পারেন যে আপনার অ্যাপ্লিকেশনটি কেবলমাত্র ডিভাইসে ইনস্টল করা আছে যা আপনার অ্যাপ্লিকেশনটির প্রয়োজনীয় বৈশিষ্ট্যগুলি সরবরাহ করে।

    FEATURE_APP_WIDGETS
    ঘোষণা করে যে আপনার অ্যাপ্লিকেশনটি একটি অ্যাপ্লিকেশন উইজেট সরবরাহ করে এবং কেবলমাত্র এমন ডিভাইসে ইনস্টল করা উচিত যাতে কোনও হোম স্ক্রিন বা অনুরূপ অবস্থান অন্তর্ভুক্ত থাকে যেখানে ব্যবহারকারীরা অ্যাপ উইজেটগুলি এম্বেড করতে পারেন। উদাহরণ:
    <uses-feature android:name="android.software.app_widgets" android:required="true" />
    
    FEATURE_HOME_SCREEN
    ঘোষণা করে যে আপনার অ্যাপ্লিকেশনটি হোম স্ক্রিন প্রতিস্থাপন হিসাবে আচরণ করে এবং কেবল তৃতীয় পক্ষের হোম স্ক্রিন অ্যাপ্লিকেশনগুলিকে সমর্থন করে এমন ডিভাইসে ইনস্টল করা উচিত। উদাহরণ:
    <uses-feature android:name="android.software.home_screen" android:required="true" />
    
    FEATURE_INPUT_METHODS
    ঘোষণা করে যে আপনার অ্যাপ্লিকেশনটি একটি কাস্টম ইনপুট পদ্ধতি সরবরাহ করে ( InputMethodService সহ নির্মিত একটি কীবোর্ড) এবং কেবল তৃতীয় পক্ষের ইনপুট পদ্ধতিগুলিকে সমর্থন করে এমন ডিভাইসে ইনস্টল করা উচিত। উদাহরণ:
    <uses-feature android:name="android.software.input_methods" android:required="true" />
    
    FEATURE_BLUETOOTH_LE
    ঘোষণা করে যে আপনার অ্যাপ্লিকেশনটি ব্লুটুথ লো এনার্জি এপিআই ব্যবহার করে এবং কেবলমাত্র ডিভাইসগুলিতে ইনস্টল করা উচিত যা ব্লুটুথ লো এনার্জির মাধ্যমে অন্যান্য ডিভাইসের সাথে যোগাযোগ করতে সক্ষম। উদাহরণ:
    <uses-feature android:name="android.software.bluetooth_le" android:required="true" />
    

    ব্যবহারকারীর অনুমতি

    নিম্নলিখিত মানগুলি এখন নির্দিষ্ট এপিআইগুলিতে অ্যাক্সেসের জন্য আপনার অ্যাপ্লিকেশনটির প্রয়োজনীয় অনুমতিগুলি ঘোষণার জন্য <uses-permission> এ সমর্থিত।

    BIND_NOTIFICATION_LISTENER_SERVICE
    নতুন NotificationListenerService এপিআই ব্যবহার করার জন্য প্রয়োজনীয়।
    SEND_RESPOND_VIA_MESSAGE
    ACTION_RESPOND_VIA_MESSAGE অভিপ্রায় গ্রহণের প্রয়োজন।

    অ্যান্ড্রয়েড ৪.৩ -এর সমস্ত এপিআই পরিবর্তনের বিশদ দেখার জন্য, এপিআই পার্থক্য প্রতিবেদনটি দেখুন।