답변:
시험:
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"/>
vibrate(VibrationEffect)
. 대신 사용하십시오 .
진동 코드 구현을 시작하기 전에 애플리케이션에 진동 권한을 부여해야합니다.
<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)
}
}
getSystemService
this.getContext().getSystemService
위의 답변은 완벽합니다. 그러나 나는 버튼 클릭으로 내 앱을 정확히 두 번 진동시키고 싶었고이 작은 정보는 여기에서 누락되어 나 같은 미래 독자를 위해 게시했습니다. :)
위에서 언급 한대로 따라야하며 유일한 변경 사항은 다음과 같이 진동 패턴입니다.
long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); //-1 is important
이것은 정확히 두 번 진동 합니다. 우리가 이미 알고 있듯이
지연과 진동을 대안 적으로 언급 할 수 있습니다 (예 : 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())
그렇게 간단합니다!
다음 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"/>
위에서 제안한 것처럼 다른 유형의 진동 (패턴 / 무한)을 사용하려는 경우 오버로드 된 방법을 사용할 수 있습니다.
위의 답변은 매우 정확하지만 쉬운 단계를 밟고 있습니다.
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>
즉,의 가장 쉬운 방법입니다.
패턴 / 웨이브 에서 진동 :
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"/>
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"/>
이것을 사용하십시오 :
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"/>