ফোনের মতোই, অডিও গ্লাস ও ডিসপ্লে গ্লাসে ক্যামেরা ও মাইক্রোফোনের মতো সংবেদনশীল হার্ডওয়্যার অ্যাক্সেস করার জন্য ব্যবহারকারীর স্পষ্ট সম্মতি প্রয়োজন। এগুলি গ্লাস-নির্দিষ্ট অনুমতি হিসেবে বিবেচিত হয় এবং আপনার অ্যাপকে রানটাইমে এগুলির জন্য অনুরোধ করতে হবে, এমনকি ফোনে আগে থেকেই সংশ্লিষ্ট অনুমতি থাকলেও।
আপনার অ্যাপের মেনিফেস্টে অনুমতি ঘোষণা করা
অনুমতির অনুরোধ করার আগে, আপনাকে <uses-permission> এলিমেন্ট ব্যবহার করে আপনার অ্যাপের ম্যানিফেস্ট ফাইলে সেগুলি ঘোষণা করতে হবে
। ফোন বা গ্লাস-নির্দিষ্ট ফিচারের জন্য অনুমতি নেওয়া হোক না কেন, এই ঘোষণা একই থাকে, তবে
আপনাকে অবশ্যই গ্লাস-নির্দিষ্ট হার্ডওয়্যার বা
কার্যকারিতার জন্য স্পষ্টভাবে অনুরোধ করতে হবে।
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for the camera. -->
<uses-permission android:name="android.permission.CAMERA"/>
<application ...>
...
</application>
</manifest>
গ্লাস অনুমতির অনুরোধ করার আগে
অনুমতি সংক্রান্ত নীতি ও ওয়ার্কফ্লো পর্যালোচনা করে দেখুন যাতে আপনি ব্যবহারকারীদের জন্য সেরা অভিজ্ঞতা প্রদান করতে পারেন, যেমন আপনার অ্যাপের প্রয়োজনীয় রানটাইম অনুমতি ব্যবহারকারী আগে থেকেই দিয়েছেন কিনা তা চেক করা এবং গ্লাস-নির্দিষ্ট অনুমতি অনুরোধ করার আগে আপনার অ্যাপকে ব্যবহারকারীকে কোনও রেশনালে দেখাতে হবে কিনা।
অনুমতি সংক্রান্ত পরিস্থিতি
অডিও ও ডিসপ্লে গ্লাসে বিপজ্জনক রানটাইম অনুমতি অনুরোধ করার সময় আপনি বিভিন্ন ধরনের পরিস্থিতি সম্মুখীন হতে পারেন:
- প্রজেক্ট করা অ্যাক্টিভিটি থেকে রানটাইম অনুমতির অনুরোধ করা
- ফোন অ্যাক্টিভিটি থেকে রানটাইম অনুমতি চাওয়া
প্রতিটি পরিস্থিতি সম্পর্কে বিস্তারিত জানতে এই গাইডের নিম্নলিখিত বিভাগগুলি দেখুন।
প্রোজেক্ট করা অ্যাক্টিভিটি থেকে রানটাইম অনুমতি চাওয়া ও ম্যানেজ করা
অডিও গ্লাস ও ডিসপ্লে গ্লাসের জন্য অনুমতি অনুরোধ করতে, প্রথমে
ActivityResultLauncher-এর সাথে
ProjectedPermissionsResultContract পদ্ধতি ব্যবহার করে অনুমতির
লঞ্চার রেজিস্টার করুন। ব্যবহারকারী অনুমতির অনুরোধে অ্যাকশন নিলে, কলব্যাক
অনুমতির নামের একটি ম্যাপ পায়, যেখানে সেগুলির মঞ্জুর করা স্ট্যাটাস থাকে।
// Register the permissions launcher using the ProjectedPermissionsResultContract. private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> = registerForActivityResult(ProjectedPermissionsResultContract()) { results -> if (results[Manifest.permission.CAMERA] == true) { isPermissionDenied = false initializeGlassesFeatures() } else { // Handle permission denial. isPermissionDenied = true } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- আপনার অ্যাপের কোন কোন অনুমতি প্রয়োজন তা আপনাকে উল্লেখ করতে হবে, যেমন
Manifest.permission.CAMERAঅথবাManifest.permission.RECORD_AUDIO। - আপনার অ্যাপকে লঞ্চারের কলব্যাকে মঞ্জুর করা ও প্রত্যাখ্যান করা, উভয় ফলাফলই সাবলীলভাবে হ্যান্ডেল করতে হবে।
অনুমতি সংক্রান্ত অনুরোধের ফ্লো ট্রিগার করতে, আপনার রেজিস্টার করা অনুমতি
লঞ্চারের launch পদ্ধতিতে
ProjectedPermissionsRequestParams-এর একটি তালিকা পাস করুন। ProjectedPermissionsRequestParams অবজেক্ট
কাস্টম rationale
স্ট্রিংয়ের সাথে অনুরোধ করা ম্যানিফেস্টের অনুমতি একসাথে বান্ডেল করে। rationale স্ট্রিংয়ে অবশ্যই স্পষ্ট ও সংক্ষিপ্তভাবে ব্যাখ্যা করতে হবে যে কেন অ্যাপটির
গ্লাসের হার্ডওয়্যার ফিচার (যেমন, ক্যামেরা বা
মাইক্রোফোন) অ্যাক্সেস করার প্রয়োজন।
private fun requestHardwarePermissions() { val params = ProjectedPermissionsRequestParams( permissions = listOf(Manifest.permission.CAMERA), rationale = "Camera access is required to overlay digital content on your physical environment." ) requestPermissionLauncher.launch(listOf(params)) }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- লঞ্চারে
launchকল করলে অনুমতির অনুরোধ সংক্রান্ত ব্যবহারকারী ফ্লো ট্রিগার হয়।
অনুমতির অনুরোধ সংক্রান্ত ব্যবহারকারীর ফ্লো বোঝা
আপনি
ProjectedPermissionsResultContract পদ্ধতি ব্যবহার করে অনুমতির অনুরোধ লঞ্চ করলে, সিস্টেম
গ্লাস ও ফোন, দু'টি ডিভাইস জুড়ে কোঅর্ডিনেট করা ব্যবহারকারীর ফ্লো শুরু করে।
অনুমতি সংক্রান্ত ইউজার ফ্লো চলাকালীন, আপনার অ্যাপ ও ব্যবহারকারী কী আশা করতে পারেন তা এখানে দেওয়া হল:
গ্লাসে: প্রজেক্ট করা ডিভাইসে (গ্লাস) একটি অ্যাক্টিভিটি দেখা যায়, ব্যবহারকারীকে সেটি চালিয়ে যাওয়ার জন্য ফোনে দেখতে বলা হয়।
ফোনে: একই সাথে, হোস্ট ডিভাইসে (ফোন) একটি অ্যাক্টিভিটি লঞ্চ হয়। এই স্ক্রিনে আপনার দেওয়া রেশনালে স্ট্রিং দেখানো হয় এবং ব্যবহারকারীকে এগিয়ে যাওয়া বা বাতিল করার বিকল্প দেওয়া হয়।
ফোনে: ব্যবহারকারী যুক্তি মেনে নিলে, ফোনে একটি পরিবর্তিত Android সিস্টেমের অনুমতি সংক্রান্ত ডায়ালগ দেখা যাবে, যেখানে ব্যবহারকারীকে বলা হবে যে তিনি গ্লাসের (ফোনের নয়) জন্য অনুমতি মঞ্জুর করছেন এবং ব্যবহারকারী আনুষ্ঠানিকভাবে অনুমতি মঞ্জুর বা বাতিল করতে পারবেন।
ফলাফল পাওয়া: ব্যবহারকারী চূড়ান্ত উত্তর বেছে নেওয়ার পরে, ফোন ও গ্লাস, দু'টিতেই অ্যাক্টিভিটি বন্ধ হয়ে যায়। আপনার
ActivityResultLauncherকলব্যাককে তারপরে প্রতিটি অনুরোধ করা অনুমতির জন্য মঞ্জুর করা স্ট্যাটাস সহ একটি ম্যাপের সাথে আহ্বান করা হয়।
ফোন অ্যাক্টিভিটিতে রানটাইম অনুমতি চাওয়া
আপনার অ্যাপ যদি কোনও ফোন অ্যাক্টিভিটিতে চলে কিন্তু অডিও বা
ডিসপ্লে গ্লাসের জন্য অনুমতির প্রয়োজন হয়—যেমন, কোনও ব্যবহারকারীকে গ্লাসের
ক্যামেরায় ফার্স্ট-পার্সন পয়েন্ট অফ ভিউয়ের জন্য ভিডিও স্ট্রিম পরিবর্তন করতে দিতে—তাহলে
ডিভাইস-নির্দিষ্ট Activity#requestPermissions(permissions, requestCode,
deviceId) পদ্ধতি ব্যবহার করে অনুমতি অনুরোধ করুন।
অডিও ও ডিসপ্লে গ্লাস টার্গেট করতে, প্রজেক্ট করা ডিভাইস কনটেক্সটে
getDeviceId কল করে উপযুক্ত ডিভাইস আইডি পান। আপনার ফোন অ্যাক্টিভিটি থেকে অনুমতির অনুরোধ করার সময় এই আইডি পাস করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
// Request the projected permission from phone activity requestPermissions( arrayOf(Manifest.permission.CAMERA), // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant REQUEST_CODE_GLASSES_CAMERA, projectedDeviceId )
অনুমতি সংক্রান্ত ফলাফল হ্যান্ডেল করা
ব্যবহারকারী ফোনে অনুমতির ডায়ালগে উত্তর দিলে, onRequestPermissionsResult কলব্যাক ইনভোক করার মাধ্যমে তার সিদ্ধান্ত আপনার অ্যাপে ডেলিভার করা হয়।
উত্তরটি ম্যানেজ করতে, অনুমতি সংক্রান্ত অনুরোধ শুরু করা
Activity ইনস্ট্যান্সের মধ্যে onRequestPermissionsResult ওভাররাইড করুন।
নিম্নলিখিত কোড স্নিপেট থেকে বোঝা যায়, কীভাবে কলব্যাক হ্যান্ডেল করতে হয় এবং ব্যবহারকারী অনুরোধ করা অনুমতি দিয়েছেন কিনা তা কীভাবে যাচাই করতে হয়:
private companion object { // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant. const val REQUEST_CODE_GLASSES_CAMERA = 1001 } @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray, deviceId: Int ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId) // Handle the result of the permission request if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Proceed with glasses camera features } else { // Handle glasses permission denied } } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- হোস্ট ফোনের পরিবর্তে অডিও বা ডিসপ্লে গ্লাসের মতো নির্দিষ্ট কনটেক্সটে অনুমতি সংক্রান্ত স্ট্যাটাস সঠিকভাবে ম্যাপ করা হয়েছে কিনা তা নিশ্চিত করতে,
onRequestPermissionsResultকলব্যাক সহdeviceIdওভারলোড ব্যবহার করুন। - আপনার অ্যাপকে মঞ্জুর করা ও প্রত্যাখ্যান করা, উভয় ফলাফলই মার্জিতভাবে হ্যান্ডেল করতে হবে।