ফোনের মতোই, অডিও গ্লাস ও ডিসপ্লে গ্লাসে ক্যামেরা ও মাইক্রোফোনের মতো সংবেদনশীল হার্ডওয়্যার অ্যাক্সেস করার জন্য ব্যবহারকারীর স্পষ্ট সম্মতি প্রয়োজন। এগুলি গ্লাস-নির্দিষ্ট অনুমতি হিসেবে বিবেচিত হয় এবং আপনার অ্যাপকে রানটাইমে এগুলির জন্য অনুরোধ করতে হবে, এমনকি ফোনে আগে থেকেই সংশ্লিষ্ট অনুমতি থাকলেও।
আপনার অ্যাপের মেনিফেস্টে অনুমতি ঘোষণা করা
অনুমতির অনুরোধ করার আগে, আপনাকে <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>
গ্লাস অনুমতির অনুরোধ করার আগে
অনুমতি সংক্রান্ত নীতি ও ওয়ার্কফ্লো পর্যালোচনা করে দেখুন যাতে আপনি ব্যবহারকারীদের জন্য সেরা অভিজ্ঞতা প্রদান করতে পারেন, যেমন আপনার অ্যাপের প্রয়োজনীয় রানটাইম অনুমতি ব্যবহারকারী আগে থেকেই দিয়েছেন কিনা তা চেক করা এবং গ্লাস-নির্দিষ্ট অনুমতি অনুরোধ করার আগে আপনার অ্যাপকে ব্যবহারকারীকে কোনও রেশনালে দেখাতে হবে কিনা।
অনুমতি সংক্রান্ত পরিস্থিতি
অডিও ও ডিসপ্লে গ্লাসে বিপজ্জনক রানটাইম অনুমতির অনুরোধ করার সময় আপনি বিভিন্ন পরিস্থিতির সম্মুখীন হতে পারেন:
- প্রজেক্ট করা অ্যাক্টিভিটি থেকে রানটাইম অনুমতির অনুরোধ করা
- ফোন অ্যাক্টিভিটি থেকে রানটাইম অনুমতি চাওয়া
প্রতিটি পরিস্থিতি সম্পর্কে বিস্তারিত জানতে এই গাইডের নিম্নলিখিত বিভাগগুলি দেখুন।
প্রজেক্ট করা অ্যাক্টিভিটি থেকে রানটাইম অনুমতির অনুরোধ করা
প্রজেক্ট করা
অ্যাক্টিভিটি থেকে অডিও বা ডিসপ্লে গ্লাসের জন্য রানটাইম অনুমতির অনুরোধ করতে, ProjectedActivityCompat.requestPermissions পদ্ধতি ব্যবহার করুন।
এই পদ্ধতি কল করলে, চশমা ও হোস্ট ফোন, দুটিতেই কোঅর্ডিনেট করা ব্যবহারকারী ফ্লো ট্রিগার হয়।
- চশমায়: সিস্টেম চশমায় একটি প্রোজেক্ট করা কম্প্যানিয়ন অ্যাক্টিভিটি খোলে, ব্যবহারকারীকে তার ফোন চেক করে অনুমতির অনুরোধে উত্তর দিতে নির্দেশ দেয়।
- ফোনে: ফোনের স্ক্রিনে Android সিস্টেমের অনুমতি সংক্রান্ত ডায়ালগ দেখা যায়। ডায়ালগ থেকে স্পষ্টভাবে বোঝা যায় যে ব্যবহারকারী ফোন নয়, বরং glasses-এর জন্য অনুমতি দিচ্ছেন। ব্যবহারকারী তারপরে অনুরোধে অনুমতি দিতে বা তা বাতিল করতে পারবেন।
প্রজেক্ট করা অ্যাক্টিভিটি থেকে কীভাবে গ্লাসের অনুমতি চাওয়া যায় তা নিম্নলিখিত উদাহরণ থেকে দেখুন:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) private fun requestCameraPermission() { lifecycleScope.launch { try { ProjectedActivityCompat.requestPermissions( this@PermissionsFromProjectedActivity, arrayOf(Manifest.permission.CAMERA), // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant CAMERA_PERMISSION_REQUEST_CODE, ) } catch (e: IllegalStateException) { // Thrown when the projected system service can't be bound. Log.e(TAG, "Camera permission request failed: projected service unavailable.", e) } } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- স্ট্যান্ডার্ড
ActivityCompatপদ্ধতির পরিবর্তেProjectedActivityCompat.requestPermissionsব্যবহার করুন। এই পদ্ধতিটি হোস্ট ফোনের পরিবর্তে অডিও এবং ডিসপ্লে গ্লাসের জন্য রানটাইম অনুমতিকে স্পষ্টভাবে টার্গেট করে।
অনুমতি সংক্রান্ত ফলাফল হ্যান্ডেল করা
ব্যবহারকারী ফোনে অনুমতির ডায়ালগে উত্তর দিলে, তার সিদ্ধান্তটি onRequestPermissionsResult
কলব্যাক
ইনভোক করার মাধ্যমে আপনার অ্যাপে ডেলিভার করা হয়।
সিস্টেম অটোমেটিক প্রজেক্ট করা কম্প্যানিয়ন অ্যাক্টিভিটি বন্ধ করে দেয়। অডিও গ্লাসে, অডিও অ্যালার্ট বাজানো শেষ হওয়ার পরে এটি ঘটে। ডিসপ্লে গ্লাসে, ব্যবহারকারী সবকটি অনুমতি সংক্রান্ত ডায়ালগের উত্তর দেওয়ার পরে এটি হয়।
উত্তর ম্যানেজ করতে, অনুমতি সংক্রান্ত অনুরোধ শুরু করা
Activity ইনস্ট্যান্সের মধ্যে onRequestPermissionsResult() ওভাররাইড করুন।
নিম্নলিখিত কোড স্নিপেট থেকে বোঝা যায়, কীভাবে কলব্যাক হ্যান্ডেল করতে হয় এবং ব্যবহারকারী অনুরোধ করা অনুমতি দিয়েছেন কিনা তা কীভাবে যাচাই করতে হয়:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray, deviceId: Int, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId) if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return val isCameraGranted = grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) == PackageManager.PERMISSION_GRANTED if (isCameraGranted) { initializeCameraFeatures() } else { onCameraPermissionDenied() } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
deviceIdওভারলোড ব্যবহার করুন এবংonRequestPermissionsResultকলব্যাক করে নিশ্চিত করুন যে অনুমতি সংক্রান্ত স্ট্যাটাসটি নির্দিষ্ট কনটেক্সটের সাথে সঠিকভাবে ম্যাপ করা হয়েছে, যেমন হোস্ট ফোনের পরিবর্তে অডিও বা ডিসপ্লে গ্লাস।- আপনার অ্যাপকে মঞ্জুর করা ও প্রত্যাখ্যান করা, উভয় ফলাফলই মার্জিতভাবে হ্যান্ডেল করতে হবে।
ফোন অ্যাক্টিভিটিতে রানটাইম অনুমতির অনুরোধ করা
আপনার অ্যাপ যদি ফোন অ্যাক্টিভিটিতে চলে কিন্তু অডিও বা
ডিসপ্লে গ্লাসের জন্য অনুমতির প্রয়োজন হয়—যেমন, কোনও ব্যবহারকারীকে গ্লাসের
ক্যামেরায় ভিডিও স্ট্রিম পরিবর্তন করতে দেওয়া—তাহলে
ডিভাইস-নির্দিষ্ট Activity#requestPermissions(permissions, requestCode,
deviceId) পদ্ধতি ব্যবহার করে অনুমতি অনুরোধ করুন:
// 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 )
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- অডিও ও ডিসপ্লে গ্লাস টার্গেট করতে, আপনার তৈরি করা
প্রজেক্টেড প্রসঙ্গ থেকে উপযুক্ত ডিভাইস আইডি পান যা আপনি
createProjectedDeviceContextব্যবহার করে তৈরি করেছেন।requestPermissionsপদ্ধতিতে কল করার সময় এই আইডিটি পাস করুন।
অনুমতি সংক্রান্ত ফলাফল ম্যানেজ করুন
ব্যবহারকারী ফোনে অনুমতির ডায়ালগে উত্তর দিলে, তার সিদ্ধান্তটি onRequestPermissionsResult
কলব্যাক
ইনভোক করার মাধ্যমে আপনার অ্যাপে ডেলিভার করা হয়।
উত্তর ম্যানেজ করতে, Activity ইনস্ট্যান্সের মধ্যে onRequestPermissionsResult ওভাররাইড করুন
যা অনুমতির অনুরোধ শুরু করেছে।
নিম্নলিখিত কোড স্নিপেট থেকে বোঝা যায় যে কীভাবে কলব্যাক ম্যানেজ করতে হয় এবং ব্যবহারকারী অনুরোধ করা অনুমতি দিয়েছেন কিনা তা যাচাই করতে হয়:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray, deviceId: Int, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId) if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return val isCameraGranted = grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) == PackageManager.PERMISSION_GRANTED if (isCameraGranted) { initializeCameraFeatures() } else { onCameraPermissionDenied() } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- হোস্ট ফোনের পরিবর্তে অডিও বা ডিসপ্লে গ্লাসের মতো নির্দিষ্ট কনটেক্সটে অনুমতি সংক্রান্ত স্ট্যাটাস সঠিকভাবে ম্যাপ করা হয়েছে কিনা তা নিশ্চিত করতে,
onRequestPermissionsResultকলব্যাক সহdeviceIdওভারলোড ব্যবহার করুন। - আপনার অ্যাপকে মঞ্জুর করা ও প্রত্যাখ্যান করা, উভয় ফলাফলই মার্জিতভাবে হ্যান্ডেল করতে হবে।