এআই চশমা হার্ডওয়্যার অ্যাক্সেস করতে একটি প্রজেক্টেড প্রসঙ্গ ব্যবহার করুন

প্রযোজ্য XR ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরণের XR ডিভাইসের অভিজ্ঞতা তৈরি করতে সাহায্য করবে।
এআই চশমা

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

আপনার কোডটি কোথায় কার্যকর হচ্ছে তার উপর নির্ভর করে একটি প্রজেক্টেড কনটেক্সট পাওয়ার দুটি প্রাথমিক উপায় রয়েছে:

যদি আপনার কোডটি AI চশমা কার্যকলাপে চলমান থাকে তবে একটি প্রজেক্টেড প্রসঙ্গ পান

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

যদি আপনার কোড ফোন অ্যাপ কম্পোনেন্টে চলমান থাকে তাহলে একটি প্রজেক্টেড প্রসঙ্গ পান

যদি আপনার AI চশমা কার্যকলাপের বাইরের অ্যাপের কোনও অংশের (যেমন ফোন কার্যকলাপ বা কোনও পরিষেবা) চশমার হার্ডওয়্যার অ্যাক্সেস করার প্রয়োজন হয়, তাহলে এটিকে স্পষ্টভাবে একটি প্রজেক্টেড প্রসঙ্গ পেতে হবে। এটি করার জন্য, createProjectedDeviceContext() পদ্ধতিটি ব্যবহার করুন:

// From a phone Activity, get a context for the AI glasses
try {
    val glassesContext = ProjectedContext.createProjectedDeviceContext(this)
    // Now use glassesContext to access glasses' system services
} catch (e: IllegalStateException) {
    // Projected device was not found
}

বৈধতা পরীক্ষা করুন

প্রজেক্টেড কনটেক্সট তৈরি করার পর, ProjectedContext.isProjectedDeviceConnected মনিটর করুন। যদিও এই পদ্ধতিটি true প্রদান করে, প্রজেক্টেড কনটেক্সট সংযুক্ত ডিভাইসের জন্য বৈধ থাকে এবং আপনার ফোন অ্যাপ কার্যকলাপ বা পরিষেবা (যেমন একটি CameraManager ) AI চশমা হার্ডওয়্যার অ্যাক্সেস করতে পারে।

সংযোগ বিচ্ছিন্ন করার সময় পরিষ্কার করুন

প্রজেক্টেড কনটেক্সট সংযুক্ত ডিভাইসের জীবনচক্রের সাথে আবদ্ধ থাকে, তাই ডিভাইসটি সংযোগ বিচ্ছিন্ন হয়ে গেলে এটি ধ্বংস হয়ে যায়। যখন ডিভাইসটি সংযোগ বিচ্ছিন্ন হয়, তখন ProjectedContext.isProjectedDeviceConnected false ফেরত দেয়। আপনার অ্যাপের এই পরিবর্তনটি শোনা উচিত এবং আপনার অ্যাপের তৈরি করা যেকোনো সিস্টেম পরিষেবা (যেমন CameraManager ) বা রিসোর্স পরিষ্কার করা উচিত যা সেই প্রজেক্টেড কনটেক্সট ব্যবহার করে করা হয়েছে।

পুনঃসংযোগের সময় পুনরায় আরম্ভ করুন

যখন AI চশমা ডিভাইসটি পুনরায় সংযোগ স্থাপন করে, তখন আপনার অ্যাপটি createProjectedDeviceContext() ব্যবহার করে আরেকটি প্রজেক্টেড কনটেক্সট ইনস্ট্যান্স পেতে পারে এবং তারপর নতুন প্রজেক্টেড কনটেক্সট ব্যবহার করে যেকোনো সিস্টেম পরিষেবা বা রিসোর্স পুনরায় চালু করতে পারে।

ব্লুটুথ ব্যবহার করে অডিও অ্যাক্সেস করুন

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

যেকোনো স্ট্যান্ডার্ড ব্লুটুথ অডিও ডিভাইসের মতো, RECORD_AUDIO অনুমতি দেওয়ার অনুমতি ফোন দ্বারা নিয়ন্ত্রিত হয়, চশমা দ্বারা নয়।

এআই চশমার ক্যামেরা দিয়ে ছবি তুলুন

AI চশমার ক্যামেরা দিয়ে ছবি তুলতে, আপনার অ্যাপের জন্য সঠিক প্রেক্ষাপট ব্যবহার করে CameraX এর ImageCapture ইউজ কেসটি চশমার ক্যামেরার সাথে সেট আপ করুন এবং বাইন্ড করুন:

private fun startCamera() {
    // Get the CameraProvider using the projected context.

    val cameraProviderFuture = ProcessCameraProvider.getInstance(
        ProjectedContext.createProjectedDeviceContext(this)
    )

    cameraProviderFuture.addListener({
        // Used to bind the lifecycle of cameras to the lifecycle owner
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        // Select the camera. When using the projected context, DEFAULT_BACK_CAMERA maps to the AI glasses' camera.
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
    
        // Check for the presence of a camera before initializing the ImageCapture use case.
       if (!cameraProvider.hasCamera(cameraSelector)) {
            Log.w(TAG, "The selected camera is not available.")
            return@addListener
        }

        // Get supported streaming resolutions.
        val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
        val camera2CameraInfo = Camera2CameraInfo.from(cameraInfo)
        val cameraCharacteristics = camera2CameraInfo.getCameraCharacteristic(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)

        // Define the resolution strategy.
        val targetResolution = Size(1920, 1080)
        val resolutionStrategy = ResolutionStrategy(
            targetResolution,
            ResolutionStrategy.FALLBACK_RULE_CLOSEST_LOWER)

        val resolutionSelector = ResolutionSelector.Builder()
            .setResolutionStrategy(resolutionStrategy)
            .build()

        // If you have other continuous use cases bound, such as Preview or ImageAnalysis, you can use  Camera2 Interop's CaptureRequestOptions to set the FPS
        val fpsRange = Range(30, 30)
        val captureRequestOptions = CaptureRequestOptions.Builder()
                .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,fpsRange)
                .build()

        // Initialize the ImageCapture use case.
        val imageCapture = ImageCapture.Builder()
            // Optional: Configure resolution, format, etc.
            .setResolutionSelector(resolutionSelector)
            .build()

        try {
            // Unbind use cases before rebinding
            cameraProvider.unbindAll()

            // 4. Bind use cases to camera
            cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageCapture)

        } catch(exc: Exception) {
            // This catches exceptions like IllegalStateException if use case binding fails
            Log.e(TAG, "Use case binding failed", exc)
        }

    }, ContextCompat.getMainExecutor(this))
}

কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ

  • প্রজেক্টেড ডিভাইস কনটেক্সট ব্যবহার করে ProcessCameraProvider এর একটি উদাহরণ পায়।
  • প্রক্ষেপিত প্রেক্ষাপটের পরিধির মধ্যে, ক্যামেরা নির্বাচন করার সময় AI চশমার প্রাথমিক, বহির্মুখী-নির্দেশক ক্যামেরা DEFAULT_BACK_CAMERA তে ম্যাপ করে।
  • একটি প্রি-বাইন্ডিং চেক cameraProvider.hasCamera(cameraSelector) ব্যবহার করে যাচাই করা হয় যে নির্বাচিত ক্যামেরাটি এগিয়ে যাওয়ার আগে ডিভাইসে উপলব্ধ।
  • অন্তর্নিহিত CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP পড়ার জন্য Camera2CameraInfo এর সাথে Camera2 Interop ব্যবহার করে, যা সমর্থিত রেজোলিউশনের উন্নত পরীক্ষাগুলির জন্য কার্যকর হতে পারে।
  • ImageCapture এর আউটপুট ইমেজ রেজোলিউশন সঠিকভাবে নিয়ন্ত্রণ করার জন্য একটি কাস্টম ResolutionSelector তৈরি করা হয়েছে।
  • একটি ImageCapture ব্যবহারের কেস তৈরি করে যা একটি কাস্টম ResolutionSelector দিয়ে কনফিগার করা হয়।
  • ImageCapture ব্যবহারের কেসকে কার্যকলাপের জীবনচক্রের সাথে আবদ্ধ করে। এটি কার্যকলাপের অবস্থার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে ক্যামেরা খোলা এবং বন্ধ করা পরিচালনা করে (উদাহরণস্বরূপ, কার্যকলাপ বিরতি দেওয়া হলে ক্যামেরা বন্ধ করা)।

AI চশমার ক্যামেরা সেট আপ হওয়ার পর, আপনি CameraX এর ImageCapture ক্লাসের সাহায্যে একটি ছবি তুলতে পারবেন। takePicture() ব্যবহার করে ছবি তোলা সম্পর্কে জানতে CameraX এর ডকুমেন্টেশন দেখুন।

এআই চশমার ক্যামেরা দিয়ে ভিডিও ক্যাপচার করুন

AI চশমার ক্যামেরা দিয়ে ছবির পরিবর্তে ভিডিও ক্যাপচার করতে, ImageCapture কম্পোনেন্টগুলিকে সংশ্লিষ্ট VideoCapture কম্পোনেন্ট দিয়ে প্রতিস্থাপন করুন এবং ক্যাপচার এক্সিকিউশন লজিক পরিবর্তন করুন।

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

আপনার অ্যাপের ব্যবহারের ক্ষেত্রের উপর নির্ভর করে নিম্নলিখিত টেবিলটি প্রস্তাবিত রেজোলিউশন এবং ফ্রেম রেট দেখায়:

ব্যবহারের ধরণ রেজোলিউশন ফ্রেম রেট
ভিডিও যোগাযোগ ১২৮০ x ৭২০ ১৫ এফপিএস
কম্পিউটার ভিশন ৬৪০ x ৪৮০ ১০ এফপিএস
এআই ভিডিও স্ট্রিমিং ৬৪০ x ৪৮০ ১ এফপিএস

একটি AI চশমা কার্যকলাপ থেকে একটি ফোনের হার্ডওয়্যার অ্যাক্সেস করুন

একটি AI চশমা কার্যকলাপ হোস্ট ডিভাইসের (ফোন) প্রসঙ্গ পেতে createHostDeviceContext(context) ব্যবহার করে ফোনের হার্ডওয়্যার (যেমন ক্যামেরা বা মাইক্রোফোন) অ্যাক্সেস করতে পারে:

// From an AI glasses Activity, get a context for the phone
val phoneContext = ProjectedContext.createHostDeviceContext(this)
// Now use phoneContext to access the phone's hardware

একটি হাইব্রিড অ্যাপে (মোবাইল এবং এআই চশমা উভয় অভিজ্ঞতা সম্বলিত একটি অ্যাপ) হোস্ট ডিভাইস (ফোন) এর জন্য নির্দিষ্ট হার্ডওয়্যার বা রিসোর্স অ্যাক্সেস করার সময়, আপনার অ্যাপটি সঠিক হার্ডওয়্যার অ্যাক্সেস করতে পারে তা নিশ্চিত করার জন্য আপনাকে স্পষ্টভাবে সঠিক প্রসঙ্গ নির্বাচন করতে হবে:

  • ফোনের প্রসঙ্গ পেতে ফোনের Activity থেকে Activity প্রসঙ্গ অথবা ProjectedContext.createHostDeviceContext() ব্যবহার করুন।
  • getApplicationContext() ব্যবহার করবেন না কারণ যদি কোনও চশমার কার্যকলাপ সম্প্রতি চালু হওয়া উপাদান হয় তবে অ্যাপ্লিকেশন প্রসঙ্গটি ভুলভাবে AI চশমার প্রসঙ্গটি ফেরত দিতে পারে।