[java] Android 기기를 진동으로 만드는 방법은 무엇입니까?

Android 애플리케이션을 작성했습니다. 이제 특정 작업이 발생할 때 장치를 진동시키고 싶습니다. 어떻게해야합니까?



답변

시험:

import android.os.Vibrator;
...
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
    //deprecated in API 26 
    v.vibrate(500);
}

노트 :

AndroidManifest.xml 파일에 권한을 포함시키는 것을 잊지 마십시오 :

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


답변

진동 허가

진동 코드 구현을 시작하기 전에 애플리케이션에 진동 권한을 부여해야합니다.

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

이 행을 AndroidManifest.xml 파일에 포함 시키십시오.

진동 라이브러리 가져 오기

대부분의 IDE 가이 작업을 수행하지만 다음과 같은 경우 import 문이 있습니다.

 import android.os.Vibrator;

진동을 발생시키려는 활동에서이를 확인하십시오.

주어진 시간 동안 진동하는 방법

대부분의 상황에서 미리 정해진 시간 동안 장치를 진동시키고 싶을 것입니다. vibrate(long milliseconds)방법 을 사용하여이를 달성 할 수 있습니다 . 다음은 간단한 예입니다.

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Vibrate for 400 milliseconds
v.vibrate(400);

그게 간단합니다!

무기한 진동하는 방법

장치가 무한정 진동하는 것을 원할 수도 있습니다. 이를 위해 다음 vibrate(long[] pattern, int repeat)방법 을 사용합니다 .

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Vibrate for 100 milliseconds
// Sleep for 1000 milliseconds
long[] pattern = {0, 100, 1000};

// The '0' here means to repeat indefinitely
// '0' is actually the index at which the pattern keeps repeating from (the start)
// To repeat the pattern from any other point, you could increase the index, e.g. '1'
v.vibrate(pattern, 0);

진동을 멈출 준비가되면 다음 cancel()메소드를 호출하십시오 .

v.cancel();

진동 패턴을 사용하는 방법

보다 맞춤형 진동을 원하는 경우 고유 한 진동 패턴을 만들 수 있습니다.

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};

// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);

더 복잡한 진동

보다 포괄적 인 햅틱 피드백을 제공하는 여러 SDK가 있습니다. 특수 효과에 사용하는 것은 Immersion의 Android 용 Haptic Development Platform입니다 .

문제 해결

기기가 진동하지 않으면 먼저 진동 할 수 있는지 확인하십시오.

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Output yes if can vibrate, no otherwise
if (v.hasVibrator()) {
    Log.v("Can Vibrate", "YES");
} else {
    Log.v("Can Vibrate", "NO");
}

둘째, 애플리케이션에 진동 권한을 부여했는지 확인하십시오. 첫 번째 요점을 다시 참조하십시오.


답변

업데이트 2017 진동 (간격) 방법은 Android-O (API 8.0)에서 사용되지 않습니다.

모든 Android 버전을 지원하려면이 방법을 사용하십시오.

// Vibrate for 150 milliseconds
private void shakeItBaby() {
    if (Build.VERSION.SDK_INT >= 26) {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
    } else {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(150);
    }
}

코 틀린 :

// Vibrate for 150 milliseconds
private fun shakeItBaby(context: Context) {
    if (Build.VERSION.SDK_INT >= 26) {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(150)
    }
}


답변

위의 답변은 완벽합니다. 그러나 나는 버튼 클릭으로 내 앱을 정확히 두 번 진동시키고 싶었고이 작은 정보는 여기에서 누락되어 나 같은 미래 독자를 위해 게시했습니다. 🙂

위에서 언급 한대로 따라야하며 유일한 변경 사항은 다음과 같이 진동 패턴입니다.

long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); //-1 is important

이것은 정확히 두 번 진동 합니다. 우리가 이미 알고 있듯이

  1. 0은 지연입니다
  2. 100은 처음으로 100ms 동안 진동 한다고 말합니다.
  3. 다음은 1000ms의 지연 이 온다
  4. 그 300ms 동안 다시 진동 게시

지연과 진동을 대안 적으로 언급 할 수 있습니다 (예 : 3 진동의 경우 0, 100, 1000, 300, 1000, 300 등). 그러나 @Dave의 단어가 책임감있게 사용한다는 것을 기억하십시오. 🙂

또한 반복 매개 변수가 -1로 설정 되어있어 패턴에서 언급 한대로 진동이 발생한다는 것을 의미합니다 . 🙂


답변

첫 번째 구현 에서이 작업을 수행하는 방법을 이해하는 데 어려움을 겪었습니다. 다음을 확인하십시오.

1) 장치가 진동을 지원합니다 (삼성 타블렛이 작동하지 않아서 코드를 다시 확인했습니다. 원래 코드는 CM 터치 패드에서 완벽하게 작동했습니다.

2) 코드 실행 권한을 부여하기 위해 AndroidManifest.xml 파일에서 애플리케이션 레벨 이상으로 선언했습니다.

3) 다른 가져 오기와 함께 다음 두 가지를 MainActivity.java로 가져 왔습니다. import android.content.Context; import android.os.Vibrator;

4) 진동을 호출하십시오 (이 스레드에서 이미 광범위하게 논의되었습니다)-별도의 기능으로 수행하고 다른 지점에서 코드에서 호출합니다-진동을 호출하는 데 사용하려는 이미지에 따라 이미지가 필요할 수 있습니다 ( Android : 버튼을 길게 클릭-> 작업 수행 ) 또는 버튼 리스너 또는 XML에 정의 된 클릭 가능한 객체 ( Clickable image-android ) :

 public void vibrate(int duration)
 {
    Vibrator vibs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vibs.vibrate(duration);
 }


답변

허가없이 진동

사용자 동작에 대한 피드백을 제공하기 위해 장치를 한 번만 진동 시키려면 의 performHapticFeedback()기능을 사용할 수 있습니다 View. VIBRATE매니페스트에 선언 할 권한 이 필요하지 않습니다 .

프로젝트의 Utils.kt와 같은 일반적인 클래스에서 다음 함수를 최상위 함수로 사용하십시오.

/**
 * Vibrates the device. Used for providing feedback when the user performs an action.
 */
fun vibrate(view: View) {
    view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}

그리고 다음에 어디를 사용 Fragment하거나 Activity다음과 같은 :

vibrate(requireView())

그렇게 간단합니다!


답변

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

<manifest>태그 내부 와 외부 <application>태그를 추가해야합니다 .