বৈশিষ্ট্য এবং API

অ্যান্ড্রয়েড ১৭ ডেভেলপারদের জন্য দুর্দান্ত নতুন বৈশিষ্ট্য এবং API চালু করেছে। নিম্নলিখিত বিভাগগুলিতে এই বৈশিষ্ট্যগুলির সংক্ষিপ্তসার দেওয়া হয়েছে যা আপনাকে সম্পর্কিত API গুলি দিয়ে শুরু করতে সাহায্য করবে।

নতুন, পরিবর্তিত এবং সরানো API গুলির বিস্তারিত তালিকার জন্য, API diff রিপোর্টটি পড়ুন। নতুন API গুলির বিস্তারিত জানতে Android API রেফারেন্সটি দেখুন — দৃশ্যমানতার জন্য নতুন API গুলি হাইলাইট করা হয়েছে।

প্ল্যাটফর্মের পরিবর্তনগুলি আপনার অ্যাপগুলিকে প্রভাবিত করতে পারে এমন ক্ষেত্রগুলিও আপনার পর্যালোচনা করা উচিত। আরও তথ্যের জন্য, নিম্নলিখিত পৃষ্ঠাগুলি দেখুন:

মূল কার্যকারিতা

অ্যান্ড্রয়েড ১৭ মূল অ্যান্ড্রয়েড কার্যকারিতা সম্পর্কিত নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি যুক্ত করেছে।

নতুন প্রোফাইলিং ম্যানেজার ট্রিগার

পারফরম্যান্স সমস্যাগুলি ডিবাগ করার জন্য আপনাকে গভীর তথ্য সংগ্রহ করতে সাহায্য করার জন্য Android 17 ProfilingManager এ বেশ কয়েকটি নতুন সিস্টেম ট্রিগার যুক্ত করেছে।

নতুন ট্রিগারগুলি হল:

  • TRIGGER_TYPE_COLD_START : অ্যাপ কোল্ড স্টার্টের সময় ট্রিগার ঘটে। এটি প্রতিক্রিয়ায় একটি কল স্ট্যাক নমুনা এবং একটি সিস্টেম ট্রেস উভয়ই প্রদান করে।
  • TRIGGER_TYPE_OOM : যখন কোনও অ্যাপ OutOfMemoryError ছুঁড়ে ফেলে এবং প্রতিক্রিয়ায় একটি জাভা হিপ ডাম্প প্রদান করে তখন ট্রিগার ঘটে।
  • TRIGGER_TYPE_KILL_EXCESSIVE_CPU_USAGE : অস্বাভাবিক এবং অতিরিক্ত CPU ব্যবহারের কারণে যখন কোনও অ্যাপ বন্ধ হয়ে যায় এবং প্রতিক্রিয়া হিসাবে একটি কল স্ট্যাক নমুনা প্রদান করে তখন ট্রিগার ঘটে।

সিস্টেম ট্রিগার কীভাবে সেট আপ করবেন তা বুঝতে, ট্রিগার-ভিত্তিক প্রোফাইলিং এবং প্রোফাইলিং ডেটা ডকুমেন্টেশন কীভাবে পুনরুদ্ধার এবং বিশ্লেষণ করবেন তার ডকুমেন্টেশন দেখুন।

JobDebugInfo API গুলি

অ্যান্ড্রয়েড ১৭ নতুন JobDebugInfo API গুলি প্রবর্তন করেছে যা ডেভেলপারদের তাদের JobScheduler কাজগুলি ডিবাগ করতে সাহায্য করবে - কেন তারা কাজ করছে না, কতক্ষণ ধরে কাজ করছে এবং অন্যান্য সমষ্টিগত তথ্য।

সম্প্রসারিত JobDebugInfo API-এর প্রথম পদ্ধতি হল getPendingJobReasonStats() , যা কাজটি কেন মুলতুবি থাকা অবস্থায় ছিল এবং তাদের সংশ্লিষ্ট ক্রমবর্ধমান মুলতুবি থাকা সময়কালের একটি মানচিত্র প্রদান করে। এই পদ্ধতিটি getPendingJobReasonsHistory() এবং getPendingJobReasons() পদ্ধতির সাথে যোগ দেয় যাতে আপনি বুঝতে পারেন কেন একটি নির্ধারিত কাজ প্রত্যাশা অনুযায়ী চলছে না, তবে একটি একক পদ্ধতিতে সময়কাল এবং কাজের কারণ উভয়ই উপলব্ধ করে তথ্য পুনরুদ্ধারকে সহজ করে তোলে।

উদাহরণস্বরূপ, একটি নির্দিষ্ট jobId জন্য, পদ্ধতিটি PENDING_JOB_REASON_CONSTRAINT_CHARGING এবং 60000 ms সময়কাল প্রদান করতে পারে, যা নির্দেশ করে যে চার্জিং সীমাবদ্ধতা পূরণ না হওয়ার কারণে কাজটি 60000 ms ধরে মুলতুবি ছিল।

গোপনীয়তা

ব্যবহারকারীর গোপনীয়তা উন্নত করার জন্য অ্যান্ড্রয়েড ১৭-তে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করা হয়েছে।

অ্যান্ড্রয়েড পরিচিতি পিকার

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

আরও তথ্যের জন্য, যোগাযোগ বাছাইকারী ডকুমেন্টেশন দেখুন।

নিরাপত্তা

ডিভাইস এবং অ্যাপের নিরাপত্তা উন্নত করতে অ্যান্ড্রয়েড ১৭ নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি যুক্ত করেছে।

অ্যান্ড্রয়েড অ্যাডভান্সড প্রোটেকশন মোড (AAPM)

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

এই মূল কনফিগারেশনগুলির মধ্যে রয়েছে অজানা উৎস থেকে অ্যাপ ইনস্টলেশন ব্লক করা (সাইডলোডিং), USB ডেটা সিগন্যালিং সীমাবদ্ধ করা এবং Google Play Protect স্ক্যানিং বাধ্যতামূলক করা, যা ডিভাইসের আক্রমণ পৃষ্ঠের ক্ষেত্রফল উল্লেখযোগ্যভাবে হ্রাস করে। ডেভেলপাররা মোডের স্থিতি সনাক্ত করতে AdvancedProtectionManager API ব্যবহার করে এই বৈশিষ্ট্যটির সাথে একীভূত হতে পারে, যার ফলে অ্যাপ্লিকেশনগুলি স্বয়ংক্রিয়ভাবে একটি কঠোর নিরাপত্তা ভঙ্গি গ্রহণ করতে পারে বা ব্যবহারকারী যখন এটি নির্বাচন করে তখন উচ্চ-ঝুঁকিপূর্ণ কার্যকারিতা সীমাবদ্ধ করতে পারে।

সংযোগ

ডিভাইস এবং অ্যাপ সংযোগ উন্নত করতে অ্যান্ড্রয়েড 17 নিম্নলিখিত বৈশিষ্ট্যগুলি যুক্ত করে।

সীমাবদ্ধ স্যাটেলাইট নেটওয়ার্ক

কম-ব্যান্ডউইথ স্যাটেলাইট নেটওয়ার্কগুলিতে অ্যাপগুলিকে কার্যকরভাবে কাজ করতে সক্ষম করার জন্য অপ্টিমাইজেশন বাস্তবায়ন করে।

ব্যবহারকারীর অভিজ্ঞতা এবং সিস্টেম UI

ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে অ্যান্ড্রয়েড ১৭-তে নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত করা হয়েছে।

হ্যান্ডঅফ

হ্যান্ডঅফ হল অ্যান্ড্রয়েড ১৭-তে আসা একটি নতুন বৈশিষ্ট্য এবং API যা অ্যাপ ডেভেলপাররা তাদের ব্যবহারকারীদের জন্য ক্রস-ডিভাইস ধারাবাহিকতা প্রদানের জন্য একত্রিত করতে পারে। এটি ব্যবহারকারীকে একটি অ্যান্ড্রয়েড ডিভাইসে একটি অ্যাপ কার্যকলাপ শুরু করতে এবং অন্য অ্যান্ড্রয়েড ডিভাইসে স্থানান্তর করতে দেয়। হ্যান্ডঅফ ব্যবহারকারীর ডিভাইসের পটভূমিতে চলে এবং ব্যবহারকারীর অন্যান্য কাছাকাছি ডিভাইস থেকে উপলব্ধ কার্যকলাপগুলি রিসিভিং ডিভাইসে লঞ্চার এবং টাস্কবারের মতো বিভিন্ন এন্ট্রি পয়েন্টের মাধ্যমে প্রকাশ করে।

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

হ্যান্ডঅফ সাপোর্ট প্রতি-অ্যাক্টিভিটির ভিত্তিতে বাস্তবায়িত হয়। হ্যান্ডঅফ সক্ষম করতে, অ্যাক্টিভিটির জন্য setHandoffEnabled() পদ্ধতিটি কল করুন। রিসিভিং ডিভাইসে পুনঃনির্মিত কার্যকলাপটি যথাযথ অবস্থা পুনরুদ্ধার করতে হ্যান্ডঅফের সাথে অতিরিক্ত ডেটা পাস করার প্রয়োজন হতে পারে। একটি HandoffActivityData অবজেক্ট ফেরত দেওয়ার জন্য onHandoffActivityRequested() কলব্যাক বাস্তবায়ন করুন যাতে হ্যান্ডঅফ কীভাবে রিসিভিং ডিভাইসে কার্যকলাপ পরিচালনা এবং পুনঃনির্মিত করবে তা নির্দিষ্ট করে।

লাইভ আপডেট - সিমান্টিক কালার এপিআই

অ্যান্ড্রয়েড ১৭ এর সাথে, লাইভ আপডেট সার্বজনীন অর্থ সহ রঙগুলিকে সমর্থন করার জন্য সিমান্টিক কালারিং এপিআই চালু করেছে।

নিম্নলিখিত ক্লাসগুলি শব্দার্থিক রঙ সমর্থন করে:

রঙ করা

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

নিম্নলিখিত উদাহরণে একটি বিজ্ঞপ্তিতে টেক্সটে শব্দার্থিক শৈলী কীভাবে প্রয়োগ করতে হয় তা দেখানো হয়েছে:

  val ssb = SpannableStringBuilder()
        .append("Colors: ")
        .append("NONE", Notification.createSemanticStyleAnnotation(SEMANTIC_STYLE_UNSPECIFIED), 0)
        .append(", ")
        .append("INFO", Notification.createSemanticStyleAnnotation(SEMANTIC_STYLE_INFO), 0)
        .append(", ")
        .append("SAFE", Notification.createSemanticStyleAnnotation(SEMANTIC_STYLE_SAFE), 0)
        .append(", ")
        .append("CAUTION", Notification.createSemanticStyleAnnotation(SEMANTIC_STYLE_CAUTION), 0)
        .append(", ")
        .append("DANGER", Notification.createSemanticStyleAnnotation(SEMANTIC_STYLE_DANGER), 0)

    Notification.Builder(context, channelId)
          .setSmallIcon(R.drawable.ic_icon)
          .setContentTitle("Hello World!")
          .setContentText(ssb)
          .setOngoing(true)
              .setRequestPromotedOngoing(true)

অ্যান্ড্রয়েড ১৭ এর জন্য UWB ডাউনলিংক-TDoA API

ডাউনলিংক আগমনের সময়ের পার্থক্য (DL-TDoA) রেঞ্জিং একটি ডিভাইসকে সংকেতের আপেক্ষিক আগমনের সময় পরিমাপ করে একাধিক অ্যাঙ্করের সাপেক্ষে তার অবস্থান নির্ধারণ করতে দেয়।

নিম্নলিখিত স্নিপেটটি দেখায় কিভাবে Ranging Manager শুরু করতে হয়, ডিভাইসের ক্ষমতা যাচাই করতে হয় এবং একটি DL-TDoA সেশন শুরু করতে হয়:

কোটলিন

class RangingApp {

    fun initDlTdoa(context: Context) {
        // Initialize the Ranging Manager
        val rangingManager = context.getSystemService(RangingManager::class.java)

        // Register for device capabilities
        val capabilitiesCallback = object : RangingManager.CapabilitiesCallback {
            override fun onRangingCapabilities(capabilities: RangingCapabilities) {
                // Make sure Dl-TDoA is supported before starting the session
                if (capabilities.uwbCapabilities != null && capabilities.uwbCapabilities!!.isDlTdoaSupported) {
                    startDlTDoASession(context)
                }
            }
        }
        rangingManager.registerCapabilitiesCallback(Executors.newSingleThreadExecutor(), capabilitiesCallback)
    }

    fun startDlTDoASession(context: Context) {

        // Initialize the Ranging Manager
        val rangingManager = context.getSystemService(RangingManager::class.java)

        // Create session and configure parameters
        val executor = Executors.newSingleThreadExecutor()
        val rangingSession = rangingManager.createRangingSession(executor, RangingSessionCallback())
        val rangingRoundIndexes = intArrayOf(0)
        val config: ByteArray = byteArrayOf() // OOB config data
        val params = DlTdoaRangingParams.createFromFiraConfigPacket(config, rangingRoundIndexes)

        val rangingDevice = RangingDevice.Builder().build()
        val rawTagDevice = RawRangingDevice.Builder()
            .setRangingDevice(rangingDevice)
            .setDlTdoaRangingParams(params)
            .build()

        val dtTagConfig = RawDtTagRangingConfig.Builder(rawTagDevice).build()

        val preference = RangingPreference.Builder(DEVICE_ROLE_DT_TAG, dtTagConfig)
            .setSessionConfig(SessionConfig.Builder().build())
            .build()

        // Start the ranging session
        rangingSession.start(preference)
    }
}

private class RangingSessionCallback : RangingSession.Callback {
    override fun onDlTdoaResults(peer: RangingDevice, measurement: DlTdoaMeasurement) {
        // Process measurement results here
    }
}

জাভা

public class RangingApp {

    public void initDlTdoa(Context context) {

        // Initialize the Ranging Manager
        RangingManager rangingManager = context.getSystemService(RangingManager.class);

        // Register for device capabilities
        RangingManager.CapabilitiesCallback capabilitiesCallback = new RangingManager.CapabilitiesCallback() {
            @Override
            public void onRangingCapabilities(RangingCapabilities capabilities) {
                // Make sure Dl-TDoA is supported before starting the session
                if (capabilities.getUwbCapabilities() != null && capabilities.getUwbCapabilities().isDlTdoaSupported) {
                    startDlTDoASession(context);
                }
            }
        };
        rangingManager.registerCapabilitiesCallback(Executors.newSingleThreadExecutor(), capabilitiesCallback);
    }

    public void startDlTDoASession(Context context) {
        RangingManager rangingManager = context.getSystemService(RangingManager.class);

        // Create session and configure parameters
        Executor executor = Executors.newSingleThreadExecutor();
        RangingSession rangingSession = rangingManager.createRangingSession(executor, new RangingSessionCallback());
        int[] rangingRoundIndexes = new int[] {0};
        byte[] config = new byte[0]; // OOB config data
        DlTdoaRangingParams params = DlTdoaRangingParams.createFromFiraConfigPacket(config, rangingRoundIndexes);

        RangingDevice rangingDevice = new RangingDevice.Builder().build();
        RawRangingDevice rawTagDevice = new RawRangingDevice.Builder()
                .setRangingDevice(rangingDevice)
                .setDlTdoaRangingParams(params)
                .build();

        RawDtTagRangingConfig dtTagConfig = new RawDtTagRangingConfig.Builder(rawTagDevice).build();

        RangingPreference preference = new RangingPreference.Builder(DEVICE_ROLE_DT_TAG, dtTagConfig)
                .setSessionConfig(new SessionConfig.Builder().build())
                .build();

        // Start the ranging session
        rangingSession.start(preference);
    }

    private static class RangingSessionCallback implements RangingSession.Callback {

        @Override
        public void onDlTdoaResults(RangingDevice peer, DlTdoaMeasurement measurement) {
            // Process measurement results here
        }
    }
}

আউট-অফ-ব্যান্ড (OOB) কনফিগারেশন

নিম্নলিখিত স্নিপেটটি Wi-Fi এবং BLE এর জন্য DL-TDoA OOB কনফিগারেশন ডেটার একটি উদাহরণ প্রদান করে:

জাভা

// Wifi Configuration
byte[] wifiConfig = {
    (byte) 0xDD, (byte) 0x2D, (byte) 0x5A, (byte) 0x18, (byte) 0xFF, // Header
    (byte) 0x5F, (byte) 0x19, // FiRa Sub-Element
    (byte) 0x02, (byte) 0x00, // Profile ID
    (byte) 0x06, (byte) 0x02, (byte) 0x20, (byte) 0x08, // MAC Address
    (byte) 0x14, (byte) 0x01, (byte) 0x0C, // Preamble Index
    (byte) 0x27, (byte) 0x02, (byte) 0x08, (byte) 0x07, // Vendor ID
    (byte) 0x28, (byte) 0x06, (byte) 0xCA, (byte) 0xC8, (byte) 0xA6, (byte) 0xF7, (byte) 0x6F, (byte) 0x08, // Static STS IV
    (byte) 0x08, (byte) 0x02, (byte) 0x60, (byte) 0x09, // Slot Duration
    (byte) 0x1B, (byte) 0x01, (byte) 0x0A, // Slots per RR
    (byte) 0x09, (byte) 0x04, (byte) 0xE8, (byte) 0x03, (byte) 0x00, (byte) 0x00, // Duration
    (byte) 0x9F, (byte) 0x04, (byte) 0x67, (byte) 0x45, (byte) 0x23, (byte) 0x01  // Session ID
};

// BLE Configuration
byte[] bleConfig = {
    (byte) 0x2D, (byte) 0x16, (byte) 0xF4, (byte) 0xFF, // Header
    (byte) 0x5F, (byte) 0x19, // FiRa Sub-Element
    (byte) 0x02, (byte) 0x00, // Profile ID
    (byte) 0x06, (byte) 0x02, (byte) 0x20, (byte) 0x08, // MAC Address
    (byte) 0x14, (byte) 0x01, (byte) 0x0C, // Preamble Index
    (byte) 0x27, (byte) 0x02, (byte) 0x08, (byte) 0x07, // Vendor ID
    (byte) 0x28, (byte) 0x06, (byte) 0xCA, (byte) 0xC8, (byte) 0xA6, (byte) 0xF7, (byte) 0x6F, (byte) 0x08, // Static STS IV
    (byte) 0x08, (byte) 0x02, (byte) 0x60, (byte) 0x09, // Slot Duration
    (byte) 0x1B, (byte) 0x01, (byte) 0x0A, // Slots per RR
    (byte) 0x09, (byte) 0x04, (byte) 0xE8, (byte) 0x03, (byte) 0x00, (byte) 0x00, // Duration
    (byte) 0x9F, (byte) 0x04, (byte) 0x67, (byte) 0x45, (byte) 0x23, (byte) 0x01  // Session ID
};

যদি আপনি OOB কনফিগারেশন ব্যবহার করতে না পারেন কারণ এটি অনুপস্থিত, অথবা যদি আপনাকে OOB কনফিগারেশনে নেই এমন ডিফল্ট মান পরিবর্তন করতে হয়, তাহলে আপনি নিম্নলিখিত স্নিপেটে দেখানো DlTdoaRangingParams.Builder দিয়ে প্যারামিটার তৈরি করতে পারেন। আপনি DlTdoaRangingParams.createFromFiraConfigPacket() এর পরিবর্তে এই প্যারামিটারগুলি ব্যবহার করতে পারেন:

কোটলিন

val dlTdoaParams = DlTdoaRangingParams.Builder(1)
    .setComplexChannel(UwbComplexChannel.Builder()
            .setChannel(9).setPreambleIndex(10).build())
    .setDeviceAddress(deviceAddress)
    .setSessionKeyInfo(byteArrayOf(0x01, 0x02, 0x03, 0x04))
    .setRangingIntervalMillis(240)
    .setSlotDuration(UwbRangingParams.DURATION_2_MS)
    .setSlotsPerRangingRound(20)
    .setRangingRoundIndexes(byteArrayOf(0x01, 0x05))
    .build()

জাভা

DlTdoaRangingParams dlTdoaParams = new DlTdoaRangingParams.Builder(1)
    .setComplexChannel(new UwbComplexChannel.Builder()
            .setChannel(9).setPreambleIndex(10).build())
    .setDeviceAddress(deviceAddress)
    .setSessionKeyInfo(new byte[]{0x01, 0x02, 0x03, 0x04})
    .setRangingIntervalMillis(240)
    .setSlotDuration(UwbRangingParams.DURATION_2_MS)
    .setSlotsPerRangingRound(20)
    .setRangingRoundIndexes(new byte[]{0x01, 0x05})
    .build();