Articles of android audiomanager

从服务调用setVolumeControlStream

我需要从一个通过STREAM_SYSTEM播放声音的服务调用setVolumeControlStream 。 显然在一个没有问题的Activity中,但是如何使用服务呢?

如何为特定来电提供定制振动

该程序的function如下:用户有一个电话号码列表,只有当没有其他系统范围的应用程序提供振动时(例如静音模式),手机才能在来电时振动。 我知道这是违反规则的,因为应用程序应该尊重用户的设置,但应用程序仅限于某些具有此需求的用户。 我尝试了两种方法,但它们都不令人满意: 收听电话状态并使用我自己的模式直接触发振动服务(使用Vibrator.vibrate() )。 当手机处于CALL_STATE_RINGING状态时,此方法有效,没有来电但随机有效,我猜这是因为与系统范围的应用程序实际处理来电时的振动冲突。 判断手机是否在来电时振动(使用AudioManager.shouldVibrate() ),并决定是否更改振动设置(使用AudioManager.setRingerMode()和AudioManager.setVibrateSetting() )。 如果我的应用程序更改了振动设置,则一旦手机返回CALL_STATE_IDLE状态,它们将被恢复。 然而,这种方法有时仍然不起作用,没有任何迹象。 我希望有人可以就这个问题提出一些建议。 欢迎对这两种方式或其他建议的评论。

SoundPool中的流量与AudioManager中的音量

我感到很困惑… SoundPool.play(int soundID, float leftVolume,float rightVolume ,int priority,int loop,float rate) 这里的体积是0.0到1.0 我见过的教程建议将流量计算为: AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); streamVolume = streamVolume / AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 这是有道理的。 我假设这个卷会覆盖用户在手机中设置的全局媒体音量,我可以通过改变soundPool中的流量来独立改变我的应用程序的音量。 但实际上它就像乘数一样 – 如果我在soundpool中设置0.5音量,实际音量将始终是全局音量的一半。 很容易重现: 将手机设置中的全局媒体音量设置为最大值 使用soundpool.play将活动中的音量设置为0.5 – 播放声音 将soundpool.play中的音量设置为1 – 播放声音,它会大两倍 有人可以解释为什么它会这样吗? 是传递给SoundPool.play方法的音量真的是全球音量的乘数吗?

什么是AudioFlinger,为什么TONE_PROP_ACK失败?

在我的应用程序中,我发出以下声明: toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600); 这对于运行Android 2.3.3的便宜的LG LS670非常有效,但在我拥有的所有其他手机上都没有声音,从Android 2.2.1到Android 2.3.4。 所以我知道操作系统版本在这里没有发挥作用(我还在文档中validation了它自API 1以来一直受支持)。 此外,Ringer音量和媒体音量都设置为最大值,toneGenerator初始化为: toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100); 我确认Settings.System.DTMF_TONE_WHEN_DIALING设置为1。 由于这种不一致的行为(跨越不同的手机)感到困惑,我在发生这种情况时检查了系统日志,并且我能够find的唯一可疑差异是听不到TONE_PROP_ACK的电话在他们的日志中有这一行: AudioFlinger setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121 AudioFlinger的目的是什么,以及它与静音TONE_PROP_ACK连接是TONE_PROP_ACK ? 知道如何修复我的代码,以便TONE_PROP_ACK始终发声,无论手机型号如何?

即使插入耳机,如何通过扬声器播放音频?

问题的标题可能会重复,但我的问题有时会出现问题并导致故障。 插入耳机时,我使用以下代码播放扬声器。 AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.STREAM_MUSIC); audioManager.setSpeakerphoneOn(true); if(! Globals.mediaPlayer.isPlaying()){ Globals.mediaPlayer.start(); } 上面的代码通过以下方式播放音频:1。很少次,它播放完美。 大多数时候,它在背景中播放循环声。 几次,它什么都不玩。 当插入耳机时,似乎系统声音播放没有错误。例如 – 设置铃声正确播放相应的铃声,没有任何故障。 请帮助我了解如何通过插入耳机的扬声器正确播放声音。

KeyEvent.ACTION_UP为ACTION_MEDIA_BUTTON触发了TWICE

我有这个ACTION_MEDIA_BUTTON的广播接收器,它实际上适用于Android 2.x和Android 4.1,但由于一些奇怪的原因,在Android 2.x(仅限)上 ,我得到每个甚至两次 (只需单击暂停按钮,当然): public class RemoteControlReceiver extends BroadcastReceiver { private static long prevEventTime = 0; @Override public void onReceive(Context ctx, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); long curEventTime = event.getEventTime(); if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) { int keycode = event.getKeyCode(); switch […]

由于AudioManager,Android Context Memory Leak ListView

我有一个ListView ,我希望在活动结束时从内存中清除它。 但是,它似乎正在泄漏。 当我检查内存转储,并获取ListView的pathToGC ,我得到以下内容, Class Name | Shallow Heap | Retained Heap android.widget.ExpandableListView @ 0x4063e560 | 768 | 39,904 |- list, mList com.hitpost.TeamChooser @ 0x405f92e8 | 176 | 1,648 | ‘- mOuterContext android.app.ContextImpl @ 0x40657368 | 160 | 304 | ‘- mContext android.media.AudioManager @ 0x40662600 | 40 | 168 | ‘- this$0 android.media.AudioManager$1 @ […]

如何在Android L中以编程方式打开来电扬声器?

我想在Android 5.0中使用我的手机的应答电话的GUI(手机的GUI)来接听来电。 我find了一种方法,需要进行一项活动,用于发送一些动作来打开Phone的GUI。 我成功打开了来电的电话GUI。 问题是如何为Phone的GUI打开扬声器。 我尝试了代码,但它没有打开。 你能帮我解决Android L中的那个问题吗? audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL); if (!audioManager.isSpeakerphoneOn()) audioManager.setSpeakerphoneOn(true); audioManager.setMode(AudioManager.MODE_NORMAL); 表现 此外,我们是否有更多的射击方式打开接听来电使用接听电话的意图。 我的方式很长,因为它使用了一个Activity。 这是我的全class代码 public class AcceptCallActivity extends Activity { private static final String MANUFACTURER_HTC = “HTC”; private KeyguardManager keyguardManager; private AudioManager audioManager; private CallStateReceiver callStateReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); audioManager […]

如何检测用户何时在Android设备上插入耳机? (与ACTION_AUDIO_BECOMING_NOISY相反)

我正在开发一个具有以下必要条件的应用程序:如果设备中插入了耳机并且用户将其删除,我需要将所有流静音。 为此,我需要收听AudioManager.ACTION_AUDIO_BECOMING_NOISY广播。 还行吧! 这里没问题。 但是当用户再次插入耳机时 ,我需要取消静音设备。 但是广播没有AudioManager.ACTION_AUDIO_BECOMING_NOISY 。 我不知道耳机何时再次插上。 一种解决方案是定期查看AudioManager.isWiredHeadsetOn()是否为true但这对我来说似乎不是一个好的解决方案。 有没有办法检测用户何时在设备上插入耳机? 编辑 :我尝试以这种方式使用Intent.ACTION_HEADSET_PLUG , 但它没有用 。 在manifest.xml中我放了: 这是我的MusicIntentReceiver.java的代码: public class MusicIntentReceiver extends BroadcastReceiver { public void onReceive(Context ctx, Intent intent) { AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { Log.d(“Let’s turn the sound on!”); //other things to un-mute the streams } } } 尝试其他任何解决方案?

到目前为止,无法在Android上实现Gapless音频循环

我已经尝试了几乎所有的方法,但是我没能在循环单个音轨之间实现无间隙音频播放,持续时间为10-15秒。 我尝试过的步骤失败了: 使用setLooping(true)不同音频文件格式.mp3 .wav .ogg : MediaPlayer mp1 = MediaPlayer.create(MainActivity.this, R.raw.track1); mp1.setLooping(true); mp1.start(); 创建两个setOnCompletionListener播放器并使用setOnCompletionListener一个接一个地循环,但无法无间隙地循环。 使用setNextMediaPlayer(nextmp)一些如何工作,但只有两个循环是可能的。 在完成前两个循环后,我们必须准备并重新开始。 mp1.start(); mp1.setNextMediaPlayer(mp2); 更新: @Jeff Mixon的结果回答: Mediaplayer循环因Android错误而停止 。 Jeff Mixon工作正常,但之后只有10或20个循环,由于一些垃圾收集问题,Mediaplayers会立即停止离开日志,如下所示。 我真的有点困在这里2年了。 提前致谢。 E/MediaPlayer(24311): error (1, -38) E/MediaPlayer(23256): Error(1,-1007) E/MediaPlayer(23546): Error (1,-2147483648)