2011-08-27 71 views
5

Trong vài ngày qua, tôi đã cố gắng phát bất kỳ âm thanh nào qua tai nghe bluetooth sco của mình từ điện thoại Android của mình. Mục tiêu cuối cùng của tôi với dự án này là cuối cùng làm cho một cái mở cửa nhà để xe, nhưng trước tiên tôi cần để có thể chơi âm thanh qua tai nghe.Android: Phát âm thanh qua tai nghe Bluetooth Sco

Đây là căn cứ vào mã hiện tại tôi đang sử dụng:

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

Trước khi tôi chạy này, tôi cặp tai nghe bluetooth của tôi để điện thoại của tôi và có nó được kết nối. Tôi đã xác minh nó hoạt động bằng cách gọi thư thoại của tôi. Tuy nhiên, khi tôi chạy mã của mình, không có âm thanh phát ra từ bất cứ đâu.

Dưới đây là những ảnh hưởng của các dòng khác nhau của mã:

Khi Tôi chỉ chạy ứng dụng của tôi:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

Dòng này làm cho tất cả các điểm dừng âm thanh của tôi làm việc không có vấn đề gì tôi làm, vì vậy nó thường được bình luận.

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

Hai dòng này làm cho âm thanh dừng ra khỏi loa trước và làm cho tai nghe của tôi nhấp và bật như đã bật nhưng không có đầu ra.

AudioManager.STREAM_VOICE_CALL 

Đây là một phần của cuộc gọi của tôi với công cụ xây dựng AudioTrack, nhưng nó tạo nên sự khác biệt. Vì điều này được đặt thành STREAM_VOICE_CALL âm thanh xuất phát từ loa phía trước, nếu tôi đặt nó thành STREAM_MUSIC, âm thanh sẽ phát ra loa sau.

Khi tôi mở ứng dụng của tôi trong khi gọi:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

Trong khi gọi, dòng này không có tác dụng vì MODE_IN_CALL đã được thiết lập. Nhưng những gì khác nhau tuy nhiên là âm thanh của tôi được trộn lẫn với các cuộc gọi điện thoại, trong khi bình thường nó không chơi ở tất cả.

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

Điều này, với phần đối tác của chúng giảm đi một nửa, kiểm soát âm thanh đến từ đâu. Nếu tôi tắt chúng, âm thanh của tôi và cuộc gọi điện thoại đến từ loa phía trước, với những âm thanh này, cuộc gọi điện thoại đến từ tai nghe của tôi và âm thanh của tôi bị mất.

Vì sao mã của tôi không hoạt động, tôi thành thật không biết. Tôi tin rằng tôi đã hoàn thành danh sách kiểm tra để sử dụng 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 

Vì vậy, có ai có ý tưởng về những gì tôi đang làm sai không? Có một lần tôi cố gắng phát âm thanh qua tai nghe, nhưng đó chỉ là một giai điệu ngắn khi tôi quên dừng() AudioTrack của tôi vì vậy tôi phải cho rằng đó là một trục trặc.

+0

Bạn đã đặt AudioManager.MODE_NORMAL ở đâu trong mã này? – RedBullet

Trả lời

0

Tôi thực sự quản lý để sửa lỗi này. Vấn đề là sân của tôi mà tôi chơi trên tai nghe quá cao tần số. Tôi cố định nó bằng cách đơn giản tăng gấp đôi lên mã tạo ra các tập tin âm thanh để nó đi HIGH HIGH LOW LOW thay vì HIGH LOW HIGH LOW.

+0

Tôi rất mới cho android. Tôi đang đối mặt với chính xác cùng một vấn đề những gì người hỏi (thepenguin77) phải đối mặt. Tôi đã kiểm tra tất cả các lý do có thể, nhưng không may mắn. Hầu hết các giải pháp của bạn có thể sẽ giải quyết vấn đề. Nhưng tiếc là tôi không thể hiểu cách bạn giải quyết. Nó sẽ hữu ích cho tôi nếu bạn giải thích, điều gì làm bạn có ý nghĩa bằng cách "tăng gấp đôi mã tạo ra các tập tin âm thanh" và "HIGH HIGH LOW LOW". Bạn có ý nghĩa gì đó về việc đặt giá trị cho hàm tạo "AudioTrack" không? –

0

Thử đặt audiomanager thành AudioManager.MODE_NORMAL. Thos làm việc cho tôi.

+1

Tôi khá chắc chắn khi tôi đang làm việc trên này, tôi đặt nó thành MODE_NORMAL và âm thanh chỉ đơn giản là phát ra từ loa chính chứ không phải là tai nghe điện thoại di động. Mặc dù tôi có thể sai, nhưng bây giờ nó đang hoạt động. – thepenguin77

0

Add để bày tỏ:

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

Vì tôi không bao giờ thực sự rối tung với cài đặt bluetooth, những thứ đó không cần thiết. – thepenguin77

1

Tôi đã tìm thấy giải pháp trên page này. Bạn phải gọi audioManager.setMode(AudioManager.MODE_IN_CALL); chỉ sau khi ổ cắm được kết nối, tức là bạn đã nhận được AudioManager.SCO_AUDIO_STATE_CONNECTED. Tôi có thể nghe thấy TTS trên Spica đang chạy Android 2.2.2.

Edit: Đây là của tôi (cũ) thực hiện:

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

Tôi không biết nếu nó vẫn đang làm việc với các API mới.

+3

Liên kết không hoạt động. Bạn có thể vui lòng gửi liên kết làm việc mới không – chaitanya

Các vấn đề liên quan