2

アプリの要件: バイブレーション設定がオフの状態で電話が呼び出しモードに なっていることを検出するため、問題は次のようになります: バイブレーション設定がオフかオンかを検出する

関連情報:

まず、 Vibratorには次のようなメソッドがなく、VibrateおよびEXTRA_VIBRATE_...isVibratorModeOn()に関連 する フラグ はすべて非推奨とマークされています。

この定数は、API レベル 16 で非推奨になりました。アプリケーションは、getRingerMode() を介して照会できる現在の呼び出し音モードに基づいて、独自の振動ポリシーを維持する必要があります。

しかし、getRingerMode()の下では、バイブレーション設定がRINGER_MODE_NORMALでオフになっているかどうかは正確にはわかりません。

バイブレーション設定がオンの場合、振動します。

getVibrateSetting ()も非推奨になりました。

Nexus 6 の Android M をRINGER_MODE含む *ほとんどのデバイスと OS のバージョンを検出するために機能するコード:

 if(audioManager.getRingerMode()!=AudioManager.RINGER_MODE_SILENT){
            if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {  

*例外: Nexus 5 - 5.1.1、おそらくすべての Lollipop バージョン

これが見落とされていたり、明らかな何かを見逃して大きな(最高の)ばかげた間違いを犯したりした場合、私は非常に驚くべきことを感じます。うまくいけば、これはあなたの時間の無駄ではありません。

問題を説明する詳細は次のとおりです。
RINGER_MODE_SILENT対象となるシナリオ: 対象となるシナリオ - 呼び出し音のサイレント モード

RINGER_MODE_VIBRATE対象となるシナリオ: 対象となるシナリオ - 呼び出し音の振動モード

これが問題であることを検出する:
問題のシナリオ - 着信音の音量が大きい、バイブレーションがオフになっている

Android M、Nexus 6 からのスクリーンショットのトリミング

4

3 に答える 3

2

アップデート:

解決策は少しねじれており、ループの 1 つで非推奨の方法を使用しています。テストしたすべてのデバイスで機能しました。ブランドのもの; モトローラ、サムスン、htc、lg、シャオミ、マイクロマックス、ソニー

audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        
if (audioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT) {
   //ensuring it is not on silent
   if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE) {
      //  if it is on vibrate mode , esp for api 23
   } else if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
             //  else check whether the volume is not 0
             if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
             if (audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER) == AudioManager.VIBRATE_SETTING_ON  
 || audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER) == AudioManager.VIBRATE_SETTING_ONLY_SILENT) { //need to add this to detect a specific scenario in xiaomi device
       // if the device o.s version is not 23 this part works
              }
            }
if ((1 == Settings.System.getInt(ApplicationController.getInstance().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0))) { 
       // the constant VIBRATE_WHEN_RINGING was added in api 23
       }
}
于 2015-10-21T09:24:02.780 に答える
2

与えられたものへの修正されたソリューション:

API < 23 および API 23 の場合でも、これは正常に機能します。以前の API で廃止されたメソッドを使用しなければ問題ないようです。Samsung、Motorola、OnePlus、Google Pixel、Google Nexus でテスト済み

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                int mode = am.getRingerMode();

            switch (mode) {
                case AudioManager.RINGER_MODE_NORMAL:
                    if ((1 == Settings.System.getInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0))) {
                        // code here
                        Toast.makeText(getApplicationContext(), "=== ring + vibrate mode ===", Toast.LENGTH_LONG).show();
                    } else {
                        // code here
                        Toast.makeText(getApplicationContext(), "=== ring + no vibrate mode ===", Toast.LENGTH_LONG).show();
                    }
                    break;

                case AudioManager.RINGER_MODE_SILENT:
                    // code here
                    Toast.makeText(getApplicationContext(), "=== in silent mode ===", Toast.LENGTH_LONG).show();
                    break;

                case AudioManager.RINGER_MODE_VIBRATE:
                    // code here
                    Toast.makeText(getApplicationContext(), "=== in vibrate mode ===", Toast.LENGTH_LONG).show();
                    break;
            }
于 2017-07-21T14:51:40.410 に答える
0

これを試して、

振動を検出するため

public static boolean detectVibrate(Context context){
    boolean status = false;
    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(am.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE){
        status = true;
    } else if (1 == Settings.System.getInt(context.getContentResolver(), "vibrate_when_ringing", 0)) //vibrate on
        status = true;
    return status;
}

リンガーがオンになっていることを確認します。

public static boolean checkRingerIsOn(Context context){
    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    return am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL;
}

喜んでお手伝いします。

于 2015-09-22T06:56:00.357 に答える