应用程序要求:检测手机何时开启振铃模式且振动设置为OFF 所以问题归结为:检测振动设置是关闭还是开启
相关信息:
首先,
Vibrator没有像isVibratorModeOn()
这样的方法
Flags related to Vibrate和EXTRA_VIBRATE_...都标记为已弃用:
此常量在API级别16中已弃用。应用程序应该 根据当前的振铃模式维持自己的振动策略 可以通过getRingerMode()查询。
但在getRingerMode()下,我们无法确切知道振动设置是否与RINGER_MODE_NORMAL关闭;
如果振动设置打开,它将振动。
现在{@ 3}}也已弃用。
用于检测* {大多数设备上的RINGER_MODE
和o.s.的代码版本包括getVibrateSetting():
if(audioManager.getRingerMode()!=AudioManager.RINGER_MODE_SILENT){
if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
*例外:Nexus 5 - 5.1.1,可能适用于所有Lollipop版本
如果错过了这一点我感到非常惊讶,或者我错过了一些显而易见的事情,从而犯了很大的错误。希望这不浪费你的时间。
以下是解释问题的更多内容:
涵盖RINGER_MODE_SILENT
方案:
Android M on Nexus 6
来自Android M,Nexus 6的作物截图
答案 0 :(得分: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;
}
很高兴为您提供帮助。
答案 1 :(得分:0)
更新
解决方案有点扭曲,在其中一个循环中使用了弃用的方法,它已经在我测试的所有设备上工作;公司的; motorola,samsung,htc,lg,xiaomi,micromax,sony
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
}
}
答案 2 :(得分:0)
修改后的解决方案:
即使是API&lt; 23和API 23这个工作正常。如果您不对以前的API使用弃用方法,那似乎很好。测试三星,摩托罗拉,OnePlus,谷歌Pixel,谷歌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;
}