Android Bluetooth 開発の基本プロセス
この例は、androidのデモを元に作成されています。
一般のソフトウェア開発者にとって、Bluetoothはほとんど使われておらず、特にAndroidは国内の事例がほとんどありません。 Bluetooth開発用のAndroidはsdkのバージョン2.0からしか対応しておらず、エミュレータも対応しておらず、テストも最低2台必要で、多くの技術者が制約を受けています。
現在、多くの開発者がBluetooth開発のニーズも持っていることを踏まえつつ、回り道を少なくするために、まずは私がAndroid Bluetooth開発の経験を少しづつ蓄積して、皆さんにお伝えしていきたいと考えています
まず、Bluetoothを操作するためには、AndroidManifest.xmlにパーミッションを追加する必要があります。
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
注:Android 6.0以降では
<uss-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
この許可
次にapiを見ると、Bluetooth開発に関するAndroidのクラスはすべてandroid.bluetoothパッケージの下にあり、以下のように8つのクラスしかありません。
しかも、使う必要があるのは、ほんのわずかです。
1.BluetoothAdapter(ブルートゥースアダプター
BluetoothAdapterはその名の通り、BluetoothSocket接続を確立するまでは、継続して操作する必要がありますBluetoothAdapterには多くのメソッドがあり、一般的なものは以下の通りです。
cancelDiscovery() は文字通り、発見をキャンセルするという意味で、デバイスの検索中にこのメソッドを呼び出しても、検索は続行されません。
disable() は、Bluetooth をオフにします。
enable() は Bluetooth をオンにします。このメソッドは Bluetooth をオンにするためのプロンプトをポップアップしませんので、多くの場合、オンにするかどうかをユーザーに尋ねる必要があります。
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//startActivity(enabler) と同じです。
getAddress()でローカルのBluetoothアドレスを取得します。
getDefaultAdapter() は、デフォルトのBluetoothAdapter を取得します。
getName() ローカルのBluetooth名を取得します
getRemoteDevice(String address) BluetoothアドレスからリモートのBluetoothデバイスを取得する
getState() は、ローカルのBluetoothアダプタの現在の状態を取得します(デバッグのためにもっと必要な気がします)。
isDiscovering() は、デバイスが現在検出されているかどうかを判断し、検出されている場合は true を返します。
isEnabled() は、Bluetooth がオンになっているかどうかを判定し、オンになっている場合は true を、そうでない場合は false を返します。
listenUsingRfcommWithServiceRecord(String name,UUID uuid) 名前、UUIDに従ってBluetoothServerSocketを作成し返す、これはBluetoothSocketサーバー側を作成する最初のステップである。
startDiscovery() は、検索を開始する、検索の最初のステップ。
2.BluetoothDevice(ブルートゥースデバイス
名前からわかるように、このクラスはBluetoothデバイスを記述します。
createRfcommSocketToServiceRecord(UUIDuuid) UUIDに基づいたBluetoothSocketを作成し、返します。
getState() Bluetoothの状態はBluetoothAdapter.STATE_ONの状態でのみ聞くことができます、詳しくはandrid apiを参照してください。
このメソッドは、BluetoothDeviceを取得する目的でもある、BluetoothSocketを作成するためのものです。
その他のメソッド(getAddress(),getName() など)は、BluetoothAdapter と同じです。
3.ブルートゥースサーバーソケット
あなたはBluetoothを削除した場合、私はあなたがそれに精通している必要があると信じて、それはソケットなので、メソッドが似ている必要があります、このクラスは、2つのオーバーロードされた唯一の3つのメソッドですaccept()、accept(intimeout)2つの違いは、後者のメソッドが有効期限の時間を指定し、それはまで、これら二つのメソッドの実行が注意すべきクライアントの要求を受信すると(またはそれが有効期限後に)、スレッドはブロックされて新しいスレッドで実行しなければなりません!あなたは、このクラスは、このクラスのメソッドを使用する必要があります?
もう一つ注意すべき点は、どちらのメソッドもBluetoothSocketを返し、最終的な接続はサーバー側とクライアント側の2つのBluetoothSocketの間で行われることです
close() これは言うまでもないことですが、翻訳してください - close!
4.ブルートゥースソケット
BluetoothServerSocketとは対照的に、クライアント側には5つのメソッドがあり、驚くなかれ、そのすべてが使用されることになるのです
close()、close
connect() で接続
getInptuStream() で入力ストリームを取得します。
getOutputStream() で出力ストリームを取得します。
getRemoteDevice() リモートデバイスを取得、ここではbluetoothSocketが接続先として指定したリモートデバイスを取得します。
1. ローカルのBluetoothアダプタを取得する
BluetoothAdapter
mAdapter= BluetoothAdapter.getDefaultAdapter()。
2. Bluetoothをオンにする
if(!mAdapter.isEnabled()){。 <未定義
//ユーザーを促すポップアップダイアログが表示された後に開く
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler, REQUEST_ENABLE)を実行します。
// プロンプトを出さずに強制的に開く
// mAdapter.enable()を実行します。
}
3. デバイスの検索
1) 前述のとおり mAdapter.startDiscovery()
が最初のステップですが、返されたBluetoothデバイスは見つかりませんが、どうやって見つかったことを知るのでしょうか?下を見て、急がないでください
2)BroadcastReceiverの定義、BroadcastReceiverについての詳細はありません、それは今日の議論ではありません、コードは次のとおりです。
BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//find the device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() ! = BluetoothDevice.BOND_BONDED) {
Log.v(TAG, "find device:" + device.getName()
+ device.getAddress());
}
}
//search completed
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)) {
setTitle("Search completed");
if (mNewDevicesAdapter.getCount() == 0) {
Log.v(TAG, "find over");
}
}
}
};
新しいデバイスが見つかったときや検索が完了したときに、上記のコードの2つのifで対応するアクションが実行されるように、ただし最初に登録した場合のみです
BroadcastReceiver を次のコードで作成します。
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter)<span style="font-family:SimSun;">;</span>
(このコード、通常はonCreate()に書かれているのですが...)
4、接続を確立する、まず、Android sdk(バージョン2.0以上)はBluetoothSocket(間違っていたら訂正してください)を介してBluetooth接続をサポートしています、サーバー側(BluetoothServerSocket)とクライアント側(BluetoothSocket)は同じUUIDを指定する必要があります なぜなら接続確立メソッドはスレッドをブロックするので、サーバーとクライアント両方は接続する新しいスレッドを開始しなければならないからです
1) サーバー側で
//UUUID形式は一般的に "xxxxxxxxx-xxxx-xxxx-xxxx"に利用可能です。
//http://www.uuidgenerator.com アプリケーション
BluetoothServerSocket serverSocket = mAdapter.listenUsingRfcommWithServiceRecord(serverSocketName,UUID).ListenUsingRfcommWithServiceRecord(serverSocketName,UUID);
serverSocket.accept()を実行します。
2)クライアント
//BroadcastReceiverでBLuetoothDeviceを取得したのを覚えていますか?
BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);
clienSocket.connect()を実行します。
5、データ転送は、上記の操作を介して、BluetoothSocketの接続が確立されている、データ転送は、ストリームの形式を介してのみです。
1) ストリームの取得
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
2) 書き出し、読み出し
これは基本的なことなので、ここでは割愛します
やっと書きました!この2日間の私の学習体験です!Bluetoothのニーズをお持ちの方のお役に立てれば幸いです。また、前述したように
android.bluetoothの下に8つのクラスがあり、そのうちの4つのクラスは定数として定義されており、私は使っていません。
最後に、Bluetoothの例として、私が見つけたものをいくつか添付しておきます。 ソフトウェア開発、特にAndroidの開発に携わっている人たちが、今後もっとコミュニケーションをとって共有していくことを期待しています
さらに付け加えれば、デバイスを検索可能にすることで
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(enabler,REQUEST_DISCOVERABLE) を実行します。
デモはクライアントサイドとサーバーサイド。2台のスマホに載せれば通信できる。変えれば使えるはずだ。
http://download.csdn.net/detail/q610098308/8681065
これが正式なデモです。
http://download.csdn.net/detail/q610098308/8628675
https://edu.csdn.net/course/detail/24723 Android bluetooth bluetooth通信のビデオチュートリアル
関連
-
Androidのadbデバイスがオフラインであることが判明
-
android.os の NetworkOnMainThreadException。
-
デフォルトのアクティビティが見つからない場合の対処法
-
Android: インポートモジュールエラー Android リソースのリンクに失敗しました
-
ArrayAdapter は、リソース ID が TextView であることが必要です。
-
android studioが "The activity must be exported or contain an intent-filter" と表示され実行される。
-
Android カスタムスピナーコントロールのドロップダウン・ボックスの実装
-
アンドロイドスタジオソフトウェア使用詳細説明書
-
アンドロイドにおけるトークンの利用
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.lang.NullPointerException: NULLオブジェクト参照で仮想メソッド......を呼び出そうとしました。
-
Android.mk:7: *** セパレータがありません。
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
アンドロイドのエリプサイズを使用する
-
Android TextViewにandroid:ellipsize=endのバグがある。
-
Androidの美しいSeekBarスタイルのカスタマイズ
-
アンドロイドスタジオ学習入門
-
Android studio 制約レイアウト ConstraintLayout
-
android.view.inflateexception 例外処理
-
android.view.InflateException: バイナリXMLファイル行番号46の例外処理