2011-08-27 649 views
5

在过去的几天里,我一直试图在我的android手机上播放sco蓝牙耳机的任何声音。这个项目的最终目标是最终制造一个车库开门器,但首先我需要能够通过耳机播放声音。Android:通过Sco蓝牙耳机播放声音

这里是我使用的当前代码的基础:

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


==Code== 
    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 

    audioManager.setMode(AudioManager.MODE_IN_CALL); 
    audioManager.startBluetoothSco(); 
    audioManager.setBluetoothScoOn(true); 

    short[] soundData = new short [8000*20]; 
    for (int iii = 0; iii < 20*8000; iii++) { 
     soundData[iii] = 32767; 
     iii++; 
     soundData[iii] = -32768; 
    } 

    audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
      8000, AudioFormat.CHANNEL_OUT_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, soundData.length 
      * Short.SIZE, AudioTrack.MODE_STATIC); 
    audioTrack.write(soundData, 0, soundData.length); 
    audioTrack.play(); 

我跑在此之前,我配对我的蓝牙耳机到我的手机,并将它连接。我通过拨打我的语音邮件来验证它的工作原理。但是,当我运行我的代码时,没有任何声音来自任何地方。

这里有不同的代码行的作用:

当我刚刚运行我的应用程序:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

此行让我所有的声音停止的工作,无论我做什么,所以它通常会被注释掉。

audioManager.startBluetoothSco(); 
    audioManager.setBluetoothScoOn(true); 

这两条线使声音停止出来前置扬声器,使我的耳机点击嘶嘶像它打开,但没有输出。

AudioManager.STREAM_VOICE_CALL 

这是我对AudioTrack构造函数的调用的一部分,但它有很大的不同。由于设置为STREAM_VOICE_CALL,所以声音从前置扬声器发出,如果将其设置为STREAM_MUSIC,则声音会从后置扬声器中发出。

当我在通话过程中打开我的应用程序:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

在通话过程中,该行没有影响,因为MODE_IN_CALL已被设置。但是,不同的是,我的声音与电话混在一起,而通常它根本不起作用。

audioManager.startBluetoothSco(); 
    audioManager.setBluetoothScoOn(true); 

这些,与他们的对手关闭的一半,控制音频来自哪里。如果我关闭这些功能,我的声音和电话会从前置扬声器发出,打开后,电话会从我的耳机中传出,并且我的声音会丢失。至于为什么我的代码不工作,我真的不知道。我相信我已经完成了使用startBluetoothSco()的清单。

Even if a SCO connection is established, the following restrictions 
apply on audio output streams so that they can be routed to SCO headset: 
- the stream type must be STREAM_VOICE_CALL - the format must be mono - 
the sampling must be 16kHz or 8kHz 

那么,有没有人有我的做法错误的想法?有一次,我设法让我的声音通过耳机播放,但当我忘记停止()我的AudioTrack时,它只是一个简短的语调,所以我不得不认为这是一个小故障。

+0

你在哪里设置了AudioManager.MODE_NORMAL这个代码? – RedBullet

回答

0

我实际上设法解决这个问题。问题在于我通过耳机播放的音频频率太高。我通过简单地加倍创建音频文件的代码来修复它,以便它变为HIGH HIGH LOW LOW LOW而不是HIGH LOW HIGH LOW。

+0

我对android非常陌生。我面临与提问者(thepenguin77)面临完全相同的问题。我检查了所有可能的原因,但没有运气。很可能你的解决方案将解决这个问题。但不幸的是,我无法理解你解决的方式。如果你解释一下,这对我会有帮助,你认为“加倍创建音频文件的代码”和“高高低低”意味着什么。你的意思是把价值放在“AudioTrack”构造函数上吗? –

0

尝试将audiomanager设置为AudioManager.MODE_NORMAL。 Thos为我工作。

+1

我很确定我在做这件事的时候,我把它设置为MODE_NORMAL,声音只是从主要的扬声器而不是手机听筒播放出来。我可能是错的,但它现在正在工作。 – thepenguin77

0

加来体现:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
+0

由于我从来没有真正搞砸蓝牙设置,这些都不需要。 – thepenguin77

1

我在这个page找到了解决方案。 只有在插座连接后,您才能拨打audioManager.setMode(AudioManager.MODE_IN_CALL);,即您收到了AudioManager.SCO_AUDIO_STATE_CONNECTED。我可以听到运行android 2.2.2的Spica上的TTS。

编辑: 这里是我的(旧)执行:

public class BluetoothNotificationReceiver 
extends BroadcastReceiver 
{ 

    /** 
    * 
    */ 
    public BluetoothNotificationReceiver(Handler h) 
    { 
     super(); 
     bnrHandler = h; 
    } 

    /* (non-Javadoc) 
    * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) 
    */ 
    @Override 
    public void onReceive(Context arg0, Intent arg1) 
    { 
     String action = arg1.getAction(); 
     if (action.equalsIgnoreCase(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED)) 
     { 
      int l_state = arg1.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); 
      Log.d("bnr", "Audio SCO: " + AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); 
      switch(l_state) 
      { 
      case AudioManager.SCO_AUDIO_STATE_CONNECTED: 
      { 
       Log.i("bnr", "SCO_AUDIO_STATE_CONNECTED"); 
      } 
      break; 
      case AudioManager.SCO_AUDIO_STATE_DISCONNECTED: 
       { 
        Log.e("bnr", "SCO_AUDIO_STATE_DISCONNECTED");     
       } 
      break; 
      default: Log.e("bnr", "unknown state received:"+l_state); 
      } 
     } 
     else 
      Log.e("bnr", "onReceive:action="+action); 
    } 
} 

我不知道它是否仍然与新的API工作。

+3

链接无法使用。你能否发布新的工作链接? – chaitanya

相关问题