Как вибрировать Android-устройство при нажатии кнопки с помощью эффектов вибратора с помощью Kotlin?

Как вибрировать Android-устройство, кодирующее Kotlin, при нажатии любых кнопок? Я использовал этот код ниже, но никаких эффектов или вибраций не было.

//click listener
    imgNextBtn.setOnClickListener {
        val vibe:Vibrator = activity?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
        vibe.vibrate(500)
        Utilities.alertDialog(this,
                activity!!,
                mContent!!
    }
}

Or

 //click listener
    imgNextBtn.setOnClickListener {
        val vibe:Vibrator = activity?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
        var effect:VibrationEffect = VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE);

    vibe.vibrate(effect)
        
        Utilities.alertDialog(this,
                activity!!,
                mContent!!
    }
}

Манифест Android:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.china.openkey">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />

person Davinder Goel    schedule 19.12.2017    source источник
comment
Вы добавили разрешение ‹uses-permission android:name=android.permission.VIBRATE/› в свой манифест?   -  person Ramesh sambu    schedule 19.12.2017
comment
да .. я уже добавил это разрешение в манифест   -  person Davinder Goel    schedule 19.12.2017
comment
Где это в вашем манифесте? Наиболее полезен минимально воспроизводимый пример.   -  person chris    schedule 19.12.2017


Ответы (4)


Вы можете создать fun и использовать из него (Kotlin):

fun Fragment.vibratePhone() {
    val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    if (Build.VERSION.SDK_INT >= 26) {
        vibrator.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
        vibrator.vibrate(200)
    }
}

И в вашем fragment:

vibratePhone()

Наконец в тебе manifest:

 <uses-permission android:name="android.permission.VIBRATE" />
person jo jo    schedule 11.09.2018
comment
Будет ли это работать и с Java? Вроде будет? - person Learn2Code; 15.06.2021

Ответ, данный @R2R, идеален. Но метод vibrate() класса Vibrator устарел с API уровня 26. Итак, я даю вам обновленный код:

Вам не нужно менять все. Просто обновите код вибрации в MainActivity.kt.

MainActivity.kt:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main);

        val btn_click_me = findViewById(R.id.btn_vibrate) as Button
        btn_click_me.setOnClickListener {
            val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            if (vibrator.hasVibrator()) { // Vibrator availability checking
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)) // New vibrate method for API Level 26 or higher
                } else {
                    vibrator.vibrate(500) // Vibrate method for below API Level 26
                }
            }
        }
    }

}
person Avijit Karmakar    schedule 14.01.2018
comment
Вы создаете vibratorService с помощью getSystemService, тогда ваш код его не использует. Вместо этого он использует нечто, называемое вибратором, которое вы никогда не создавали. Я уверен, что это просто опечатка в вашем ответе. - person Octopus; 06.12.2018

Вибрация с использованием рабочего образца kotlin, попробуйте это

Манифест.xml

 <uses-permission android:name="android.permission.VIBRATE" />

В Котлине:

 val vibratorService = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
        vibratorService.vibrate(500)

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <Button
        android:id="@+id/btn_vibrate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Vibrate"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main);
        val btn_click_me = findViewById(R.id.btn_vibrate) as Button
        btn_click_me.setOnClickListener {
            val vibratorService = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
            vibratorService.vibrate(500)

        }
    }
}
person Ramesh sambu    schedule 19.12.2017

Упростить это может быть как

val buzzer = activity?.getSystemService<Vibrator>()

buzzer?.let {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                buzzer.vibrate(VibrationEffect.createWaveform(pattern, -1))
            } else {
                //deprecated in API 26
                buzzer.vibrate(pattern, -1)
            }
        }

Когда шаблон может быть похож

val pattern = longArrayOf(0, 200, 100, 300)

Элементы гудящих и не гудящих дублей -> ожидание 0 мс, гудение 200 мс, ожидание 100 мс, гудение 300 мс

Конечно с разрешения в манифесте

<uses-permission android:name="android.permission.VIBRATE" />

Надеюсь, это поможет кому-то в будущем

person Developer534255    schedule 07.04.2020