【教えてください】Bluetoothをオフにしたい

1,589 views
Skip to first unread message

mkai

unread,
Oct 15, 2010, 5:26:54 AM10/15/10
to 日本Androidの会
お世話になります、mkaiです。
かなり詰まってしまっているので、どなたかご教授ください。

現在、音楽の鳴らす先(スピーカー?)を自由に設定する、という処理を作ろうとしています。

1.耳にあてて聴く
2.機体を机などに置いて聴く
3.Bluetoothのスピーカーを使って聴く

以上の動作を使い分けたいのですが、
「Bluetoothが使える(設定がONになっていて、デバイスが既にペアリングされている)状態で、
音楽を耳に当てて聴く」処理がうまくいきません。
以下の方法を試してみても、うまくいきませんでした。

・BluetoothAdapterクラスのdisable()を使い、BluetoothをOFFにしようとする
 →実機がリブートしてしまう
・BluetoothをOFFにするのを諦め、AudioManagerクラスのsetMode()などを使う
 →音が出ない

BluetoothがOFFの状態であれば、1は簡単にできるのですが・・・。

以下、簡単ですがコードです。
使っている実機:HTC Desire X06HT
Androidバージョン:2.2

-----------------------------------------------------------------------------------------------------------------
private BluetoothAdapter bluetooth_adapt =
BluetoothAdapter.getDefaultAdapter();
private static AudioManager audio= (AudioManager)
getSystemService(Context.AUDIO_SERVICE);
private MediaPlayer bgmPlayer = MediaPlayer.create(this,
R.raw.stage1bgm);

・Bluetoothをオン/オフする

if (bluetooth_adapt.isEnabled()) {

audio.setBluetoothScoOn(false);
audio.stopBluetoothSco();
audio.setMode(AudioManager.MODE_NORMAL);
bluetooth_adapt.disable();
// ここで落ちます。sleepを入れたりしていますが効果はありませんでした…。

}else{

bluetooth_adapt.enable();
Intent enable_bt = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enable_bt, REQUEST_ENABLE_BT);
}

・耳に当てて聴く

audio.setBluetoothScoOn(false);
audio.stopBluetoothSco();
audio.setSpeakerphoneOn(false);
// 上の3行をコメントアウトすると、音が出るには出るのですが、
 Bluetooth端末からになります。
audio.setMode(AudioManager.MODE_IN_CALL);
bgmPlayer.start();

・Bluetoothで聴く

audio.startBluetoothSco();
audio.setMode(AudioManager.MODE_IN_CALL);
bgmPlayer.start();

-----------------------------------------------------------------------------------------------------------------
以下は、リブートしたときのログの抜粋です。

DEBUG/BluetoothService(4965): Bluetooth state 12 -> 13
DEBUG/BluetoothHandsfree(5072): audioOff(): mPendingSco: false,
mScoSocket: , mA2dpState: 2, mA2dpSuspended: false

INFO/BluetoothA2dpService(4965): checkSinkSuspendState() : state = 0
prevState = 2
INFO/BluetoothA2dpService(4965): checkSinkSuspendState() :
mTargetA2dpState = -1
INFO/BluetoothA2dpService(4965): checkSinkSuspendState() :
initialStart = false initialSuspend = false
DEBUG/A2dpAudioInterface(4957): setBluetoothEnabled 0
INFO/BluetoothA2dpService(4965): A2DP profile has been disconnected
VERBOSE/BluetoothDataGatewayService(4965): #### DataGateway Service
Received message ####
INFO/BrcmBtServiceLoader(4965): ***Received Bluetooth
UNKNOWN_STATE_CHANGE Event**** : 13

INFO/BluetoothService(4965): Got ACTION_PROFILE_DISCONNECTED, profile
= 2
VERBOSE/BluetoothEventRedirector(5223): Received
android.bluetooth.adapter.action.STATE_CHANGED
INFO/BluetoothEventRedirector(5223): EXTRA_STATE = 13
VERBOSE/BluetoothEventRedirector(5223): Received
android.bluetooth.a2dp.action.SINK_STATE_CHANGED
INFO/BluetoothService(4965): Got ACTION_PROFILE_DISCONNECTED, profile
= 3

INFO/AudioHardwareQSD(4957): Routing audio to Handset
DEBUG/AudioHardwareQSD(4957): Switching audio device to
DEBUG/AudioHardwareQSD(4957): Handset

ERROR/AndroidRuntime(4965): *** FATAL EXCEPTION IN SYSTEM PROCESS:
android.server.ServerThread
ERROR/AndroidRuntime(4965): java.lang.RuntimeException: Error
receiving broadcast Intent
{ act=android.bluetooth.headset.action.STATE_CHANGED (has extras) } in
android.media.AudioService$AudioServiceBroadcastReceiver@46395630
ERROR/AndroidRuntime(4965): at android.app.ActivityThread
$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:938)
ERROR/AndroidRuntime(4965): at
android.os.Handler.handleCallback(Handler.java:587)
ERROR/AndroidRuntime(4965): at
android.os.Handler.dispatchMessage(Handler.java:92)
ERROR/AndroidRuntime(4965): at android.os.Looper.loop(Looper.java:
144)
ERROR/AndroidRuntime(4965): at
com.android.server.ServerThread.run(SystemServer.java:600)
ERROR/AndroidRuntime(4965): Caused by:
java.util.NoSuchElementException: Death link does not exist
ERROR/AndroidRuntime(4965): at
android.os.BinderProxy.unlinkToDeath(Native Method)
ERROR/AndroidRuntime(4965): at android.media.AudioService
$ScoClient.clearCount(AudioService.java:1080)
ERROR/AndroidRuntime(4965): at
android.media.AudioService.clearAllScoClients(AudioService.java:1138)
ERROR/AndroidRuntime(4965): at android.media.AudioService
$AudioServiceBroadcastReceiver.onReceive(AudioService.java:1928)
ERROR/AndroidRuntime(4965): at android.app.ActivityThread
$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:920)
ERROR/AndroidRuntime(4965): ... 4 more

-----------------------------------------------------------------------------------------------------------------

長くなってしまいましたが、以上です。
恐れいりますが、ご存知の方がいらっしゃいましたら、ご教示頂きたく存じます。
よろしくお願い致します。

mkai

unread,
Oct 18, 2010, 9:24:58 PM10/18/10
to 日本Androidの会
どなたかご存知ないでしょうか…。
現在、BluetoothをOFFにするのではなく、
BluetoothがONのままインスピーカーに切り替える方法を探しているのですが、
Bluetoothのデバイスから音が出るか、音が全く出なくなるかのどちらかで困っております;

applepenguin

unread,
Oct 20, 2010, 11:07:48 PM10/20/10
to 日本Androidの会
Desireだけかもしれませんが

<uses-permission
android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
のパーミッションを設定した状態で以下の処理を実行するとリブートします。

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.disable();

at812875

unread,
Oct 21, 2010, 12:14:30 AM10/21/10
to android-g...@googlegroups.com

applepenguin <fujina...@gmail.com>:

>--
>このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
>このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
>このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
>詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

mkai

unread,
Oct 21, 2010, 12:32:29 AM10/21/10
to 日本Androidの会
>applepenguin様

ありがとうございます!
MODIFY_AUDIO_SETTINGSの記述を外したところ、
無事Bluetoothをdisableすることができました!

ただ、今度は
audio.setSpeakerphoneOn(false);
が効かなくなり、インスピーカーから音を出すことが
出来なくなってしまいました。
Bluetoothのオンオフとインスピーカーを両立できるよう、
解決方法を模索してみます。
Reply all
Reply to author
Forward
0 new messages