【问题标题】:Silent phone without "don't disturb"没有“请勿打扰”的静音电话
【发布时间】:2019-09-17 14:48:36
【问题描述】:

至少在 Pixel 手机上,可以将手机从设置中静音。但是,从屏幕截图中可以看出,我没有找到任何将手机设置为这种模式的 Android API。 如果我使用AudioManager 使用setRingerMode,则手机将设置为振动模式和/或显示“请勿打扰”图标。有谁知道如何使用这个功能?

【问题讨论】:

  • 你找到答案了吗?我面临同样的问题。它触发 DND 而不是静默模式
  • 是的,我检查了源代码,它调用了一个内部 API。一个简单的应用程序无法做到这一点。所以这是不可能的。

标签: android


【解决方案1】:

确保您已在 AndroidManifest.xml 文件中声明了以下权限。

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

编辑 2

我还在 Google Pixel 2 API 28 上对其进行了测试,它按预期工作。

如您所见,通知栏中没有“请勿打扰(DND)”按钮。

编辑

audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0) 将让您在没有“请勿打扰”图标的情况下实现所需的功能。

输出

原创

AudioManger's方法名setRingerMode(int ringerMode)可以让你设置你想要的模式。

文档:

静音模式将使音量静音并且不会振动。振动模式 将静音和振动。正常模式将是可听见的并且可能 根据用户设置振动。

如果设备实现了固定音量,此方法无效 isVolumeFixed() 指示的策略。

从 N 开始,铃声模式调整将切换“请勿” 除非应用已被授予请勿打扰,否则不允许打扰 使用权。见NotificationManager#isNotificationPolicyAccessGranted()

/**
 * Changes mobile profile to "Silent" or "Vibrate" or "Normal" mode
 *
 * @param context
 * @param mode    - "0 - Silent"
 *                - "1 - Vibrate"
 *                - "2 - Normal"
 */
public static void chooseProfile(Context context, int ringerMode) {
  AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
  if (ringerMode == 0)
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
  else if (ringerMode == 1)
    audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
  else if (ringerMode == 2)
    audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}

另请参阅:

getRingerMode()

isVolumeFixed()

【讨论】:

  • @greywolf82 你能详细说明你的问题吗?
  • @greywolf82 在您的问题中,您问过:“有人知道如何使用此功能吗?”
  • 是的,没有 dnd 的静音,正如标题所说的那样,正如你从图片中看到的那样
  • @greywolf82 你研究过adjustStreamVolume 方法吗?
  • @greywolf82 我已经修改了我的答案
【解决方案2】:
AudioManager am = (AudioManager) getContext().getSystemService(AUDIO_SERVICE);
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

如果您想在不显示图标的情况下执行相反的操作(通过切换使手机静音)。在 Android 中,只有 'Alarm' 和 'Media' 音量设置为 0 实际上是 0。通话音量永远不能归零,并且在 0 的铃声音量仍然可以听到。它可以设置为振动,并且当手机处于低功耗模式时,振动功能不会激活,除非它是特权应用程序或用户允许它,但振动会出现一个图标。将铃声音量设置为实际0,不振动,具有使图标出现的效果。

它内置在 Android 源代码中,无法克服。具体来说,它是在 HAL 和 SystemUI 中处理的,这些策略的来源可以在这里在线找到 https://android.googlesource.com/platform/hardware/libhardware/+/master/modules/audio/audio_hw.c 和适当的 https://android.googlesource.com/platform/hardware/libhardware/+/master/modules/audio/audio_policy.c,图标显示 https://android.googlesource.com/platform/frameworks/base/+/eb04a99/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java https://android.googlesource.com/platform/frameworks/base/+/eb04a99/packages/SystemUI/src/com/android/systemui/statusbar/policy/

【讨论】:

  • 我想要屏幕截图中的图标,如果您通过 AudioManager 将音量设置为零,您会看到“请勿打扰”图标,而不是屏幕截图中的图标。
  • OHHHHHHHHH。使用顶部的解决方案进行了编辑。
  • 铃声模式静音将手机设置为免打扰状态
  • 您并没有非常乐于助人,因为您没有说明您要静音的内容。如果以上不起作用,那么它将是以下的某种组合:am.getStreamMaxVolume(0);am.setRingerMode(AudioManager.RINGER_MODE_SILENT);am.setStreamVolume(0, 0, AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND); 也许最后一个标志应该不同。
  • 我不知道为什么这么难理解,我想以编程方式执行您在用户按下红色框中的按钮执行的屏幕截图中看到的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多