Androidデバイスを振動させる方法は?


499

Androidアプリケーションを作成しました。ここで、特定のアクションが発生したときにデバイスを振動させたいと思います。これどうやってするの?

回答:


988

試してください:

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ミリ秒で、わずか0.5秒です。グーグルドキュメントをチェックしてください。developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
コンテキストを解決できないか、フィールドではない..?!問題は何
ですか

3
バイブレーションは非推奨になりました。代わりにHitesh Sahuのソリューションを使用してください。
Ray Li

2
このメソッドはAPIレベル26で廃止されましたvibrate(VibrationEffect)。代わりに使用してください。
TimoBähr18年

651

振動許可を与える

バイブレーションコードの実装を開始する前に、アプリケーションにバイブレーションを許可する必要があります。

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

この行をAndroidManifest.xmlファイルに必ず含めてください。

振動ライブラリをインポートする

ほとんどのIDEがこれを行いますが、そうでない場合のインポート文は次のとおりです。

 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用ハプティック開発プラットフォームです

トラブルシューティング

端末が振動しない場合は、まず振動することを確認してください:

// 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
すばらしい答えですが、私は無期限にバイブレーションを演奏することに警戒します。この機能を使用するときは、責任を持ってください!
デイブ

4
すばらしい答えですが、1つあります。「ここでの「0」は無期限に繰り返すことを意味します」と言った場合、本当ですが少し誤解を招きます。この番号は、繰り返し時にパターンが開始するパターン配列のインデックスです。
aaronvargas 2014年

1
@aaronvargasフェアポイント。ただし、それはほとんどの人が達成しようとしていることの範囲外です。私は簡単な説明に行きました:)
リアム・ジョージ・ベッツワース

@Liam George Betsworth携帯電話がサイレントモードであっても振動させるにはどうすればよいですか?お願いします。
パルティ

1
イマージョンリンクがダウンしていて、archive.orgで見つかりません:(
looper

73

Update 2017のvibrate(interval)メソッドは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
Vibrationの実行時権限は必要ありません。振動は危険な許可ではないため、マニフェストでのみ宣言する必要があります。[ developer.android.com/guide/topics/permissions/...
Roon13

@BugsHappenのドキュメントを移動しました。更新または削除します。
Roon13

私は追加することを唯一のことは、あなたが活動中で、これを使用していて、特定のコンテキスト変数を持っていない場合は、交換することであるgetSystemServicethis.getContext().getSystemService
DrMcCleod

あなたは先生は、トウシュその機能名のupvote」原因を獲得した
Starwave

18

上記の答えは完璧です。ただし、ボタンクリックでアプリを2回正確に振動させたかったので、この小さな情報がここにないため、将来の読者のために投稿します。:)

上記のように従う必要があり、唯一の変更は以下のようなバイブレーションパターンになります。

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

これは正確に2回振動ます。すでに知っているように

  1. 0は 遅延用
  2. 100はバイブレーションと言います初めてミリ秒間する
  3. 次は遅れます 1000msのが発生します
  4. そして、その振動を300ms再度投稿します

遅延とバイブレーションを交互に繰り返し言及することもできます(たとえば、3つのバイブレーションに対して0、100、1000、300、1000、300など)。ただし、@ Daveの言葉は責任を持って使用することを忘れないでください。:)

ここで、繰り返しパラメータが-1に設定されていることにも注意してください。これは、振動がパターンで述べたとおりに発生することを意味します。:)


なぜ-1は、パターンで述べたとおりに振動が発生することを意味するのですか?ありがとう!
Ruchir Baronia

@リッチ私の答えを参照してください。「-1」は、パターンに初めて従った後、振動が繰り返されることを試みるインデックスです。「-1」は範囲外であるため、振動は繰り返されません。
Liam George Betsworth 2015年

@リッチ-リアムジョージベッツワースは正しいです。Androidのドキュメントによると-パターンを繰り返すには、繰り返しを開始するパターン配列にインデックスを渡すか、-1を指定して繰り返しを無効にします。リンク- developer.android.com/reference/android/os/...、INT)
アトゥールOホリック

14

私は最初の実装でこれを行う方法を理解するのに苦労しました-次のものがあることを確認してください:

1)お使いのデバイスは振動をサポートしています(Samsungタブレットが機能しなかったため、コードを再確認し続けました-元のコードはCMタッチパッドで完全に機能しました

2)AndroidManifest.xmlファイルでアプリケーションレベルより上で宣言して、コードに実行権限を付与しました。

3)次の両方を、他のインポートと共にMainActivity.javaにインポートしました:import android.content.Context; android.os.Vibratorをインポートします。

4)バイブレーションを呼び出す(すでにこのスレッドで詳しく説明されています)-別の関数でそれを実行し、他のポイントでこれをコードで呼び出します-バイブレーションの呼び出しに使用するものに応じて、画像が必要になる場合があります(Android:ボタンを長押し->アクションを実行)またはボタンリスナー、またはXMLで定義されているクリック可能なオブジェクト(クリック可能な画像-android):

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

10

許可なく振動する

デバイスを1回振動させるだけで、ユーザーアクションに関するフィードバックを提供したい場合。の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.