Bluetooth データの転送
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
Bluetooth に正常に接続したら、
デバイス、
1 つはコネクテッド
BluetoothSocket
。今すぐ
デバイス間で情報を共有する機能です。BluetoothSocket
を使用すると、一般的な
手順は次のとおりです。
InputStream
と
転送を処理する OutputStream
ソケットを経由し、
getInputStream()
および
getOutputStream()
できます。
を使用したストリームのデータの読み取りと書き込み
read(byte[])
、
write(byte[])
。
もちろん、考慮すべき実装の詳細があります。特に、
ストリームからの読み取りとストリームへの書き込みに専用のスレッドを使用する必要があります。
read(byte[])
メソッドと write(byte[])
メソッドの両方が
ブロッキング呼び出しですread(byte[])
メソッドは、なんらかの読み込みが行われるまでブロックを実行します。
ストリームから読み取ることができます通常、write(byte[])
メソッドはブロックしませんが、
リモート デバイスが read(byte[])
を呼び出していない場合にフロー制御をブロックできる
その結果、中間バッファがいっぱいになります。ですから、
InputStream
からの読み取りに、スレッド内のメインループを専任で行うべきです。
スレッド内で別のパブリック メソッドを使用すると、
OutputStream
。
例
2 つのデバイス間でデータを転送する方法の例を次に示します。
Bluetooth で接続:
Kotlin
private const val TAG = "MY_APP_DEBUG_TAG"
// Defines several constants used when transmitting messages between the
// service and the UI.
const val MESSAGE_READ: Int = 0
const val MESSAGE_WRITE: Int = 1
const val MESSAGE_TOAST: Int = 2
// ... (Add other message types here as needed.)
class MyBluetoothService(
// handler that gets info from Bluetooth service
private val handler: Handler) {
private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {
private val mmInStream: InputStream = mmSocket.inputStream
private val mmOutStream: OutputStream = mmSocket.outputStream
private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream
override fun run() {
var numBytes: Int // bytes returned from read()
// Keep listening to the InputStream until an exception occurs.
while (true) {
// Read from the InputStream.
numBytes = try {
mmInStream.read(mmBuffer)
} catch (e: IOException) {
Log.d(TAG, "Input stream was disconnected", e)
break
}
// Send the obtained bytes to the UI activity.
val readMsg = handler.obtainMessage(
MESSAGE_READ, numBytes, -1,
mmBuffer)
readMsg.sendToTarget()
}
}
// Call this from the main activity to send data to the remote device.
fun write(bytes: ByteArray) {
try {
mmOutStream.write(bytes)
} catch (e: IOException) {
Log.e(TAG, "Error occurred when sending data", e)
// Send a failure message back to the activity.
val writeErrorMsg = handler.obtainMessage(MESSAGE_TOAST)
val bundle = Bundle().apply {
putString("toast", "Couldn't send data to the other device")
}
writeErrorMsg.data = bundle
handler.sendMessage(writeErrorMsg)
return
}
// Share the sent message with the UI activity.
val writtenMsg = handler.obtainMessage(
MESSAGE_WRITE, -1, -1, mmBuffer)
writtenMsg.sendToTarget()
}
// Call this method from the main activity to shut down the connection.
fun cancel() {
try {
mmSocket.close()
} catch (e: IOException) {
Log.e(TAG, "Could not close the connect socket", e)
}
}
}
}
Java
public class MyBluetoothService {
private static final String TAG = "MY_APP_DEBUG_TAG";
private Handler handler; // handler that gets info from Bluetooth service
// Defines several constants used when transmitting messages between the
// service and the UI.
private interface MessageConstants {
public static final int MESSAGE_READ = 0;
public static final int MESSAGE_WRITE = 1;
public static final int MESSAGE_TOAST = 2;
// ... (Add other message types here as needed.)
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private byte[] mmBuffer; // mmBuffer store for the stream
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams; using temp objects because
// member streams are final.
try {
tmpIn = socket.getInputStream();
} catch (IOException e) {
Log.e(TAG, "Error occurred when creating input stream", e);
}
try {
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "Error occurred when creating output stream", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
mmBuffer = new byte[1024];
int numBytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs.
while (true) {
try {
// Read from the InputStream.
numBytes = mmInStream.read(mmBuffer);
// Send the obtained bytes to the UI activity.
Message readMsg = handler.obtainMessage(
MessageConstants.MESSAGE_READ, numBytes, -1,
mmBuffer);
readMsg.sendToTarget();
} catch (IOException e) {
Log.d(TAG, "Input stream was disconnected", e);
break;
}
}
}
// Call this from the main activity to send data to the remote device.
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
// Share the sent message with the UI activity.
Message writtenMsg = handler.obtainMessage(
MessageConstants.MESSAGE_WRITE, -1, -1, mmBuffer);
writtenMsg.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Error occurred when sending data", e);
// Send a failure message back to the activity.
Message writeErrorMsg =
handler.obtainMessage(MessageConstants.MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString("toast",
"Couldn't send data to the other device");
writeErrorMsg.setData(bundle);
handler.sendMessage(writeErrorMsg);
}
}
// Call this method from the main activity to shut down the connection.
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close the connect socket", e);
}
}
}
}
コンストラクタが必要なストリームを取得した後、スレッドはデータを
InputStream
を通す必要があります。read(byte[])
が次のデータを返した場合:
ストリームでは、メンバーを使用してデータがメイン アクティビティに送信されます。
親クラスの Handler
。スレッド
その後、InputStream
からさらにバイトが読み取られるまで待機します。
送信データを送信するには、メインスレッドからスレッドの write()
メソッドを呼び出します。
送信するバイトを渡します。このメソッドは write(byte[])
を呼び出して、
リモートデバイスにデータを送信します。もし
次の呼び出し時に IOException
がスローされる
write(byte[])
の場合、スレッドはメイン アクティビティにトーストを送信し、
指定されたバイトをデバイスが他のバイトに送信できなかったことを通知したユーザー
接続します。
スレッドの cancel()
メソッドを使用すると、いつでも接続を終了できます。
BluetoothSocket
を閉じます。終了時に必ずこのメソッドを呼び出してください
接続します。
Bluetooth API の使用方法については、Bluetooth チャットのサンプルをご覧ください。
アプリ
ご覧ください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[null,null,["最終更新日 2025-07-27 UTC。"],[],[],null,["# Transfer Bluetooth data\n\nAfter you have successfully [connected to a Bluetooth\ndevice](/develop/connectivity/bluetooth/connect-bluetooth-devices), each\none has a connected\n[`BluetoothSocket`](/reference/android/bluetooth/BluetoothSocket). You can now\nshare information between devices. Using the `BluetoothSocket`, the general\nprocedure to transfer data is as follows:\n\n1. Get the [`InputStream`](/reference/java/io/InputStream) and\n [`OutputStream`](/reference/java/io/OutputStream) that handle transmissions\n through the socket using\n [`getInputStream()`](/reference/android/bluetooth/BluetoothSocket#getInputStream())\n and\n [`getOutputStream()`](/reference/android/bluetooth/BluetoothSocket#getOutputStream()),\n respectively.\n\n2. Read and write data to the streams using\n [`read(byte[])`](/reference/java/io/InputStream#read(byte%5B%5D)) and\n [`write(byte[])`](/reference/java/io/OutputStream#write(byte%5B%5D)).\n\nThere are, of course, implementation details to consider. In particular, you\nshould use a dedicated thread for reading from the stream and writing to it.\nThis is important because both the `read(byte[])` and `write(byte[])` methods\nare blocking calls. The `read(byte[])` method blocks until there is something to\nread from the stream. The `write(byte[])` method doesn't usually block, but it\ncan block for flow control if the remote device isn't calling `read(byte[])`\nquickly enough and the intermediate buffers become full as a result. So, you\nshould dedicate your main loop in the thread to reading from the `InputStream`.\nYou can use a separate public method in the thread to initiate writes to the\n`OutputStream`.\n\nExample\n-------\n\nThe following is an example of how you can transfer data between two devices\nconnected over Bluetooth: \n\n### Kotlin\n\n```kotlin\nprivate const val TAG = \"MY_APP_DEBUG_TAG\"\n\n// Defines several constants used when transmitting messages between the\n// service and the UI.\nconst val MESSAGE_READ: Int = 0\nconst val MESSAGE_WRITE: Int = 1\nconst val MESSAGE_TOAST: Int = 2\n// ... (Add other message types here as needed.)\n\nclass MyBluetoothService(\n // handler that gets info from Bluetooth service\n private val handler: Handler) {\n\n private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {\n\n private val mmInStream: InputStream = mmSocket.inputStream\n private val mmOutStream: OutputStream = mmSocket.outputStream\n private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream\n\n override fun run() {\n var numBytes: Int // bytes returned from read()\n\n // Keep listening to the InputStream until an exception occurs.\n while (true) {\n // Read from the InputStream.\n numBytes = try {\n mmInStream.read(mmBuffer)\n } catch (e: IOException) {\n Log.d(TAG, \"Input stream was disconnected\", e)\n break\n }\n\n // Send the obtained bytes to the UI activity.\n val readMsg = handler.obtainMessage(\n MESSAGE_READ, numBytes, -1,\n mmBuffer)\n readMsg.sendToTarget()\n }\n }\n\n // Call this from the main activity to send data to the remote device.\n fun write(bytes: ByteArray) {\n try {\n mmOutStream.write(bytes)\n } catch (e: IOException) {\n Log.e(TAG, \"Error occurred when sending data\", e)\n\n // Send a failure message back to the activity.\n val writeErrorMsg = handler.obtainMessage(MESSAGE_TOAST)\n val bundle = Bundle().apply {\n putString(\"toast\", \"Couldn't send data to the other device\")\n }\n writeErrorMsg.data = bundle\n handler.sendMessage(writeErrorMsg)\n return\n }\n\n // Share the sent message with the UI activity.\n val writtenMsg = handler.obtainMessage(\n MESSAGE_WRITE, -1, -1, mmBuffer)\n writtenMsg.sendToTarget()\n }\n\n // Call this method from the main activity to shut down the connection.\n fun cancel() {\n try {\n mmSocket.close()\n } catch (e: IOException) {\n Log.e(TAG, \"Could not close the connect socket\", e)\n }\n }\n }\n}\n```\n\n### Java\n\n```java\npublic class MyBluetoothService {\n private static final String TAG = \"MY_APP_DEBUG_TAG\";\n private Handler handler; // handler that gets info from Bluetooth service\n\n // Defines several constants used when transmitting messages between the\n // service and the UI.\n private interface MessageConstants {\n public static final int MESSAGE_READ = 0;\n public static final int MESSAGE_WRITE = 1;\n public static final int MESSAGE_TOAST = 2;\n\n // ... (Add other message types here as needed.)\n }\n\n private class ConnectedThread extends Thread {\n private final BluetoothSocket mmSocket;\n private final InputStream mmInStream;\n private final OutputStream mmOutStream;\n private byte[] mmBuffer; // mmBuffer store for the stream\n\n public ConnectedThread(BluetoothSocket socket) {\n mmSocket = socket;\n InputStream tmpIn = null;\n OutputStream tmpOut = null;\n\n // Get the input and output streams; using temp objects because\n // member streams are final.\n try {\n tmpIn = socket.getInputStream();\n } catch (IOException e) {\n Log.e(TAG, \"Error occurred when creating input stream\", e);\n }\n try {\n tmpOut = socket.getOutputStream();\n } catch (IOException e) {\n Log.e(TAG, \"Error occurred when creating output stream\", e);\n }\n\n mmInStream = tmpIn;\n mmOutStream = tmpOut;\n }\n\n public void run() {\n mmBuffer = new byte[1024];\n int numBytes; // bytes returned from read()\n\n // Keep listening to the InputStream until an exception occurs.\n while (true) {\n try {\n // Read from the InputStream.\n numBytes = mmInStream.read(mmBuffer);\n // Send the obtained bytes to the UI activity.\n Message readMsg = handler.obtainMessage(\n MessageConstants.MESSAGE_READ, numBytes, -1,\n mmBuffer);\n readMsg.sendToTarget();\n } catch (IOException e) {\n Log.d(TAG, \"Input stream was disconnected\", e);\n break;\n }\n }\n }\n\n // Call this from the main activity to send data to the remote device.\n public void write(byte[] bytes) {\n try {\n mmOutStream.write(bytes);\n\n // Share the sent message with the UI activity.\n Message writtenMsg = handler.obtainMessage(\n MessageConstants.MESSAGE_WRITE, -1, -1, mmBuffer);\n writtenMsg.sendToTarget();\n } catch (IOException e) {\n Log.e(TAG, \"Error occurred when sending data\", e);\n\n // Send a failure message back to the activity.\n Message writeErrorMsg =\n handler.obtainMessage(MessageConstants.MESSAGE_TOAST);\n Bundle bundle = new Bundle();\n bundle.putString(\"toast\",\n \"Couldn't send data to the other device\");\n writeErrorMsg.setData(bundle);\n handler.sendMessage(writeErrorMsg);\n }\n }\n\n // Call this method from the main activity to shut down the connection.\n public void cancel() {\n try {\n mmSocket.close();\n } catch (IOException e) {\n Log.e(TAG, \"Could not close the connect socket\", e);\n }\n }\n }\n}\n```\n\nAfter the constructor acquires the necessary streams, the thread waits for data\nto come through the `InputStream`. When `read(byte[])` returns with data from\nthe stream, the data is sent to the main activity using a member\n[`Handler`](/reference/android/os/Handler) from the parent class. The thread\nthen waits for more bytes to be read from the `InputStream`.\n\nTo send outgoing data, you call the thread's `write()` method from the main\nactivity and pass in the bytes to be sent. This method calls `write(byte[])` to\nsend the data to the remote device. If an\n[`IOException`](/reference/java/io/IOException) is thrown when calling\n`write(byte[])`, the thread sends a toast to the main activity, explaining to\nthe user that the device couldn't send the given bytes to the other\n(connected) device.\n\nThe thread's `cancel()` method allows you to terminate the connection at any\ntime by closing the `BluetoothSocket`. Always call this method when you're done\nusing the Bluetooth connection.\n\nFor a demonstration of using the Bluetooth APIs, see the [Bluetooth Chat sample\napp](https://github.com/android/connectivity-samples/tree/master/BluetoothChat)\non GitHub."]]