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


499

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

답변:


987

시험:

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"/>

3
모든 전화의 진동을 취소 할 수있는 방법이 있습니까? 감사!
Javi

14
@joshsvoss 500 밀리 초인데 반 초 밖에되지 않습니다. Google 문서를 확인하십시오. developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
문맥을 해결할 수 없거나 필드가 아닙니다. 무엇이 문제입니까
McLan

3
진동이 더 이상 사용되지 않습니다. 대신 Hitesh Sahu의 솔루션을 사용하십시오.
Ray Li

2
이 메소드는 API 레벨 26에서 더 이상 사용되지 않습니다 vibrate(VibrationEffect). 대신 사용하십시오 .
Timo Bähr

651

진동 허가

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

<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");
}

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


26
나는 무한정 진동을하는 것에주의를 기울이지 만 훌륭한 대답입니다. 이 기능을 사용할 때는 책임을 져야합니다!
Dave

4
좋은 대답이지만 한 가지. '여기서'0 '은 무한정 반복한다는 뜻이지만 사실이지만 약간 오해의 소지가 있습니다. 이 숫자는 반복 할 때 패턴이 시작될 패턴 배열의 인덱스입니다.
aaronvargas

1
@aaronvargas 페어 포인트는 대부분의 사람들이 달성하려는 범위를 벗어납니다. 나는 간단한 설명을 갔다 :)
Liam George Betsworth

@Liam George Betsworth 모바일이 무음 모드 인 경우에도 진동을 발생시키는 방법은 무엇입니까? 부디.
Parthi

1
침수 링크가 다운되어서 archive.org에서 찾을 수 없습니다 :(
looper

73

업데이트 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)
    }
}

2
진동에 대한 런타임 권한이 필요하지 않습니다. 진동은 위험한 권한이 아니므로 매니페스트에서만 선언해야합니다. [ developer.android.com/guide/topics/permissions/…
Roon13

@BugsHappen 문서가 이동되었습니다. 업데이트하거나 삭제합니다.
Roon13

내가 추가 할 수있는 유일한 것은 액티비티에서 이것을 사용하고 특정 컨텍스트 변수가없는 경우 다음으로 대체 getSystemServicethis.getContext().getSystemService
한다는 것

당신은 각하, 투시하는 기능 이름의 upvote에 '원인을 벌었 다
를 역임

18

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

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

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이 패턴에 언급 된대로 진동이 발생한다는 것을 의미하는 이유는 무엇입니까? 감사!
Ruchir Baronia

@Rich 내 답변을 참조하십시오. '-1'은 패턴을 처음으로 따른 후 진동이 반복되는 인덱스입니다. '-1'이 범위를 벗어 났으므로 진동이 반복되지 않습니다.
Liam George Betsworth

@Rich-Liam George Betsworth가 맞습니다. Android 문서 말-패턴을 반복하려면 반복을 시작할 패턴 배열로 색인을 전달하거나 반복을 비활성화하려면 -1을 전달하십시오. 링크 - developer.android.com/reference/android/os/... , INT)
아툴 O 홀릭

14

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

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);    
 }

10

허가없이 진동

사용자 동작에 대한 피드백을 제공하기 위해 장치를 한 번만 진동 시키려면 의 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())

그렇게 간단합니다!


2
좋고 간단한 해결책!
VAdaihiep

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

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


4

다음 utils 방법을 사용합니다.

public static final void vibratePhone(Context context, short vibrateMilliSeconds) {
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(vibrateMilliSeconds);
}

AndroidManifest 파일에 다음 권한을 추가하십시오.

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

위에서 제안한 것처럼 다른 유형의 진동 (패턴 / 무한)을 사용하려는 경우 오버로드 된 방법을 사용할 수 있습니다.


4

위의 답변은 매우 정확하지만 쉬운 단계를 밟고 있습니다.

 private static final long[] THREE_CYCLES = new long[] { 100, 1000, 1000,  1000, 1000, 1000 };

  public void longVibrate(View v) 
  {
     vibrateMulti(THREE_CYCLES);
  }

  private void vibrateMulti(long[] cycles) {
      NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      Notification notification = new Notification();

      notification.vibrate = cycles; 
      notificationManager.notify(0, notification);
  }

그런 다음 xml 파일에서

<button android:layout_height="wrap_content" 
        android:layout_width ="wrap_content" 
        android:onclick      ="longVibrate" 
        android:text         ="VibrateThrice">
</button>

즉,의 가장 쉬운 방법입니다.


3

패턴 / 웨이브 에서 진동 :

import android.os.Vibrator;
...
// Vibrate for 500ms, pause for 500ms, then start again
private static final long[] VIBRATE_PATTERN = { 500, 500 };

mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // API 26 and above
    mVibrator.vibrate(VibrationEffect.createWaveform(VIBRATE_PATTERN, 0));
} else {
    // Below API 26
    mVibrator.vibrate(VIBRATE_PATTERN, 0);
}

을 더한

필요한 권한 AndroidManifest.xml:

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

3

더 많은 유형 안전을위한 Kotlin 업데이트

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

// Vibrates the device for 100 milliseconds.
fun vibrateDevice(context: Context) {
    val vibrator = getSystemService(context, Vibrator::class.java)
    vibrator?.let {
        if (Build.VERSION.SDK_INT >= 26) {
            it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
        } else {
            @Suppress("DEPRECATION")
            it.vibrate(100)
        }
    }
}

그런 다음 코드의 어느 곳에서나 다음과 같이 호출하십시오.

vibrateDevice(requireContext())

설명

상수를 사용하는 Vibrator::class.java것보다 형식이 안전 String합니다.

우리는을 확인 vibrator하여 Null 허용을 위해 let { }진동이 장치에 사용할 수없는 경우 때문에,의는 vibrator것입니다 null.

else경고는 최신 SDK에서 온 것이기 때문에 사용 중단 절을 무시해도 됩니다.

진동을 사용하기 위해 런타임에 허가를 요청할 필요가 없습니다. 그러나 AndroidManifest.xml다음과 같이 선언해야합니다 .

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

2

이것을 사용하십시오 :

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

노트 :

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

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

1

장치 및 작업을 진동시킬 수 있습니다

   Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
           v.vibrate(100);

권한이 필요하지만 런타임 권한이 필요하지 않은 권한

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

이 솔루션은 더 이상 사용되지 않습니다
BekaBot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.