পরিধানযোগ্য জিনিসপত্রে অডিও চালান

Wear OS অ্যাপে অডিও চালাতে আপনি কীভাবে পরিচিত Android API ব্যবহার করতে পারেন তা এই নির্দেশিকা বর্ণনা করে।

অডিও ডিভাইস সনাক্ত করুন

পরিধানযোগ্য ডিভাইসে উপযুক্ত অডিও আউটপুট আছে কিনা তা একটি Wear OS অ্যাপকে প্রথমে সনাক্ত করতে হবে। পরিধানযোগ্য ডিভাইসগুলিতে সাধারণত নিম্নলিখিত অডিও আউটপুটগুলির মধ্যে অন্তত একটি থাকে:

  • AudioDeviceInfo.TYPE_BUILTIN_SPEAKER : বিল্ট-ইন স্পিকার সহ ডিভাইসগুলিতে।
  • AudioDeviceInfo.TYPE_BLUETOOTH_A2DP : যখন একটি ব্লুটুথ হেডসেট যুক্ত এবং সংযুক্ত থাকে।
  • AudioDeviceInfo.TYPE_BLE_BROADCAST : যখন একটি ব্লুটুথ লো এনার্জি (BLE) ব্রডকাস্ট গ্রুপ ডিভাইস পেয়ার করা হয় এবং সংযুক্ত থাকে।
  • AudioDeviceInfo.TYPE_BLE_HEADSET : যখন একটি BLE হেডসেট জোড়া এবং সংযুক্ত করা হয়।
  • AudioDeviceInfo.TYPE_BLE_SPEAKER : যখন একটি BLE স্পিকার জোড়া এবং সংযুক্ত থাকে।

একটি অডিও আউটপুট প্রকার উপলব্ধ কিনা তা পরীক্ষা করতে নিম্নলিখিত উদাহরণটি FEATURE_AUDIO_OUTPUT মান সহ getDevices() পদ্ধতি ব্যবহার করে।

private val audioManager: AudioManager by lazy {
    getSystemService(AUDIO_SERVICE) as AudioManager
}

fun audioOutputAvailable(type: Int): Boolean {
    if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
        return false
    }
    return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type }
}

আপনি তারপর একটি অডিও আউটপুট প্রকার উপলব্ধ কিনা পরীক্ষা করতে এই পদ্ধতি ব্যবহার করতে পারেন.

val hasSpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)
val hasBluetoothHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)
val hasBLEBroadcast = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)
val hasBLEHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)
val hasBLESpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে, শুধুমাত্র যখন ব্লুটুথ হেডফোন বা স্পিকার ঘড়ির সাথে সংযুক্ত থাকে তখনই মিডিয়া চালান৷

অডিও আউটপুট জন্য পছন্দের ডিভাইস চয়ন করুন

আপনার অ্যাপের ব্যবহারের ক্ষেত্রে এবং এর মূল অভিজ্ঞতার জন্য অডিওর গুরুত্বের উপর নির্ভর করে, ব্যবহারকারীরা কীভাবে আপনার অ্যাপের অডিও আউটপুটের সাথে জড়িত থাকে তা চয়ন করুন।

ব্যবহারকারীকে মিডিয়া আউটপুট ডিভাইস বেছে নিতে দিন

Wear OS 5 দিয়ে শুরু করে, সিস্টেমটি একটি UI প্রদান করে যা ব্যবহারকারীদের বেছে নিতে দেয় কোন ডিভাইসটি মিডিয়া চালাবে এবং বর্তমানে বাজানো মিডিয়া বিষয়বস্তু সম্পর্কে তথ্য দেখায়।

আপনি Wear OS 5 বা উচ্চতর চলমান ডিভাইসগুলিতে অডিও প্লেব্যাক প্রদান করতে চাইলে আপনার অ্যাপ যদি সনাক্ত করে যে সেখানে একটি ব্লুটুথ হেডসেট সংযুক্ত নেই, তাহলে ব্যবহারকারীকে সরাসরি মিডিয়া আউটপুট সুইচারে নিয়ে যাওয়ার প্রস্তাব করুন। মিডিয়া আউটপুট সুইচার সমর্থন করে না এমন ডিভাইসগুলিতে, ACTION_BLUETOOTH_SETTINGS অভিপ্রায় ক্রিয়া শুরু করুন, যা ব্যবহারকারীকে সিস্টেম সেটিংসে ব্লুটুথ পৃষ্ঠায় নিয়ে যায়৷

launchOutputSelection() পদ্ধতি , গিটহাবের হরোলজিস্ট লাইব্রেরির অংশ, প্রদর্শন করে কিভাবে ব্যবহারকারীদের তাদের মিডিয়া আউটপুট ডিভাইস চয়ন করতে দেওয়া যায়।

ব্লুটুথ হেডসেট

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

val audioDeviceCallback =
    object : AudioDeviceCallback() {
        override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) {
            super.onAudioDevicesAdded(addedDevices)
            if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
            ) {
                // A Bluetooth or BLE device is connected and available for playback.
            }
        }
        override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) {
            super.onAudioDevicesRemoved(removedDevices)
            if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER))
            ) {
                // No Bluetooth or BLE devices are connected anymore.
            }
        }
    }

audioManager.registerAudioDeviceCallback(audioDeviceCallback, /*handler=*/ null)

যদি আপনার অ্যাপ সনাক্ত করে যে আপনি অডিও আউটপুট প্রদান করতে চান তখন একটি ব্লুটুথ হেডসেট সংযুক্ত নেই, একটি ত্রুটি বার্তা দেখাবেন না৷ পরিবর্তে, ব্যবহারকারীদের সংযোগ করা সহজ করতে সরাসরি ব্লুটুথ সেটিংসে নিয়ে যাওয়ার প্রস্তাব করুন৷ আপনি ACTION_BLUETOOTH_SETTINGS এর মাধ্যমে একটি অভিপ্রায় পাঠিয়ে এটি করতে পারেন:

fun Context.launchBluetoothSettings(closeOnConnect: Boolean = true) {
    val intent = with(Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        putExtra("EXTRA_CONNECTION_ONLY", true)
        if (closeOnConnect) {
            putExtra("EXTRA_CLOSE_ON_CONNECT", true)
        }
        putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", FILTER_TYPE_AUDIO)
    }
    startActivity(intent)
}

internal const val FILTER_TYPE_AUDIO = 1

অন্তর্নির্মিত স্পিকার

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

বিস্তারিত জানার জন্য WearSpeakerSample দেখুন।

অডিও চালান

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

অন্তর্নির্মিত স্পিকারের মাধ্যমে অনিচ্ছাকৃত মিডিয়া প্লেব্যাক প্রতিরোধ করুন

অন্তর্নির্মিত ঘড়ি স্পীকারে অনিচ্ছাকৃতভাবে মিডিয়া চালানো থেকে অ্যাপটিকে আটকাতে মিডিয়া অ্যাপগুলি এই নির্দেশিকা অনুসরণ করতে পারে৷ আপনার অ্যাপ যে প্লেয়ার ব্যবহার করে তার উপর নির্ভর করে নির্দেশিকা পরিবর্তিত হয়।

এক্সো প্লেয়ার

যদি আপনার অ্যাপ ExoPlayer ব্যবহার করে:

  1. ExoPlayer দৃষ্টান্ত তৈরি করার সময় setSuppressPlaybackOnUnsuitableOutput(true) পদ্ধতিতে কল করুন:

val exoPlayer = ExoPlayer.Builder(context)
    .setAudioAttributes(AudioAttributes.DEFAULT, true)
    .setSuppressPlaybackOnUnsuitableOutput(true)
    .build()

  1. ExoPlayer উদাহরণের একজন শ্রোতা হিসাবে WearUnsuitableOutputPlaybackSuppressionResolverListener শ্রোতাকে নিবন্ধন করে প্লেব্যাক দমন ইভেন্টে প্রতিক্রিয়া জানান:

exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))

হরোলজিস্ট মিডিয়া টুলকিট

Horologist MediaToolkit ইতিমধ্যেই অন্তর্নির্মিত ঘড়ি স্পীকারগুলিতে অনাকাঙ্ক্ষিত মিডিয়া প্লেব্যাক প্রতিরোধ করার জন্য যুক্তি রয়েছে৷

অন্যান্য মিডিয়া প্লেয়ার