2011-08-27 40 views
5

過去数日間、私のAndroid携帯からsco bluetoothヘッドセットでサウンドを再生しようとしています。このプロジェクトの最終的な目標は、最終的にガレージドアオープナを作ることですが、まずはヘッドセットで音を出す必要があります。ここでAndroid:Sco Bluetoothヘッドセットで音を再生する

は、私が使用している現在のコードに基づいている:

==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(); 

私はこれを実行する前に、私は自分の携帯電話に私のBluetoothヘッドセットをペアリングし、それが接続されています。私はそれが私のボイスメールを呼び出すことによって動作することを確認しました。しかし、私のコードを実行すると、どこからでも音が出ません。ここで

は、コードの異なるラインの効果である:

私はちょうど私のアプリを実行しているとき:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

この行は私のサウンド停止のすべては、私が何をすべきかに関係なく作業を行い、通常はコメントアウトされています。

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

この2行は、音の停止はフロントスピーカーから出てくる作り、私のヘッドセットのクリックを作成し、それがオンになっているようヒスが、何も出力はありません。

AudioManager.STREAM_VOICE_CALL 

これは私のAudioTrackコンストラクタへの呼び出しの一部ですが、かなりの違いがあります。これはSTREAM_VOICE_CALLに設定されているので、サウンドはフロントスピーカーから出ます。これをSTREAM_MUSICに設定すると、代わりにバックスピーカーから音が出ます。私は通話中に私のアプリを開く

:MODE_IN_CALLが既に設定されたため、通話中

audioManager.setMode(AudioManager.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 

誰かが私が間違っていることを知っていますか?私はヘッドセットを通して音を出すことができたのは1回しかありませんでしたが、AudioTrackを止めるのを忘れてしまったのは短い音でしたので、それが故障であると仮定しなければなりません。

+0

このコードでAudioManager.MODE_NORMALはどこで設定しましたか? – RedBullet

答えて

0

私は実際にこの問題を解決するために管理しました。問題は、私がヘッドセット上で演奏した音程が、あまりにも高い周波数であることでした。オーディオファイルを作成するコードを2倍にして、HIGH HIGH HIGHOWの代わりにHIGH HIGH LOW LOWになるように修正しました。

+0

私は非常にアンドロイドに新しいです。私は質問者(thepenguin77)が直面したのとまったく同じ問題に直面しています。私は考えられるすべての理由を調べたが運がない。ほとんどの場合、あなたのソリューションは問題を解決します。しかし残念ながら私はあなたの解決方法を理解できません。説明すると、「オーディオファイルを作成するコードを倍増させる」と「HIGH HIGH LOW LOW」とはどういう意味ですか?あなたは "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

解決策が見つかりました。pageaudioManager.setMode(AudioManager.MODE_IN_CALL);は、ソケットが接続された後、つまりAudioManager.SCO_AUDIO_STATE_CONNECTEDを受け取った後にのみ呼び出す必要があります。私はSpicaのアンドロイド2.2.2を走らせてTTSを聞くことができました。

編集:それはまだ新しいAPIと連携している場合、私は知らない

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); 
    } 
} 

: は、ここに私の(古い)の実装です。

+3

リンクが機能していません。新しい作業リンクを投稿できますか – chaitanya

関連する問題