Android 블 루 투 스 채 팅 기능 구현
10623 단어 Android블 루 투 스 채 팅
이 편 은 전편 의 결말 에 이 어 휴대 전화 간 에 어떻게 블 루 투 스 를 통 해 문자 채 팅 을 할 수 있 는 지 살 펴 보 겠 습 니 다.
먼저 위의 demo 를 붙 입 니 다.
그림 의 두 목록 중 하 나 를 클릭 하면 다음 코드 를 실행 합 니 다.
mBtAdapter.cancelDiscovery();
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
Intent intent = new Intent();
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
setResult(Activity.RESULT_OK, intent);
finish();
이 블 루 투 스 메 신 저 는 마지막 으로 이 루어 진 효 과 는 다음 과 같 습 니 다.채 팅 메 인 화면 으로 돌아 갑 니 다:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
LogUtils.getInstance().e(getClass(), "onActivityResult " + resultCode);
switch (requestCode) {
case REQUEST_CONNECT_DEVICE:
// DeviceListActivity
if (resultCode == Activity.RESULT_OK) {
// MAC
String address = data.getExtras().getString(
DeviceListActivity.EXTRA_DEVICE_ADDRESS);
//
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
//
mChatService.connect(device);
}
break;
case REQUEST_ENABLE_BT:
//
if (resultCode == Activity.RESULT_OK) {
//
setupChat();
} else {
LogUtils.getInstance().e(getClass(), " ");
Toast.makeText(this, R.string.bt_not_enabled_leaving,
Toast.LENGTH_SHORT).show();
finish();
}
}
}
여기 서 저 는 BluetoothChatService 류 의 연결 절 차 를 중점적으로 소개 하 겠 습 니 다.블 루 투 스 채 팅 은 두 핸드폰 간 에 통신 을 하 는 것 이기 때문에 그들 은 서로 호스트 와 종 기 를 위해 주요 한 사고 와 절 차 는 다음 과 같다.
1.블 루 투 스 를 연결 하기 위해 소켓 을 가 져 오기;
2.블 루 투 스 가 들 어 오 는 연결 을 감청 하기 위해 스 레 드 를 열 고 연결 이 받 아들 여지 면 세 번 째 스 레 드 를 열 어 들 어 오 는 모든 데 이 터 를 처리 합 니 다.
public synchronized void connect(BluetoothDevice device) {
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
}
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
mConnectThread = new ConnectThread(device);
mConnectThread.start();
setState(STATE_CONNECTING);
}
스 레 드 를 열 어 연결 하 다.
/**
* @description:
* @author:zzq
* @time: 2016-8-6 1:18:41
*/
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device) {
mmDevice = device;
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), "socket :" + e);
}
mmSocket = tmp;
}
public void run() {
LogUtils.getInstance().e(getClass(), " mConnectThread");
setName("ConnectThread");
// mAdapter.cancelDiscovery();
try {
mmSocket.connect();
} catch (IOException e) {
// , ui
connectionFailed();
try {
mmSocket.close();
} catch (IOException e2) {
LogUtils.getInstance().e(getClass(), " " + e2);
}
//
startChat();
return;
}
synchronized (BluetoothChatService.this) {
mConnectThread = null;
}
connected(mmSocket, mmDevice);
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), " " + e);
}
}
}
/**
*
*/
private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
public AcceptThread() {
BluetoothServerSocket tmp = null;
try {
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), "-- socket :" + e);
}
mmServerSocket = tmp;
}
public void run() {
setName("AcceptThread");
BluetoothSocket socket = null;
while (mState != STATE_CONNECTED) {
LogUtils.getInstance().e(getClass(), "----accept- -");
try {
socket = mmServerSocket.accept();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), "accept() " + e);
break;
}
//
if (socket != null) {
synchronized (BluetoothChatService.this) {
switch (mState) {
case STATE_LISTEN:
case STATE_CONNECTING:
//
connected(socket, socket.getRemoteDevice());
break;
case STATE_NONE:
case STATE_CONNECTED:
//
try {
socket.close();
} catch (IOException e) {
LogUtils.getInstance().e(getClass()," " + e);
}
break;
}
}
}
}
LogUtils.getInstance().e(getClass(), " mAcceptThread");
}
public void cancel() {
LogUtils.getInstance().e(getClass(), " " + this);
try {
mmServerSocket.close();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), " " + e);
}
}
}
/**
*
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// BluetoothSocket
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(),"temp sockets not created" + e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
int bytes;
String str1 = "";
//
while (true) {
try {
byte[] buffer = new byte[256];
bytes = mmInStream.read(buffer);
String readStr = new String(buffer, 0, bytes);//
String str = bytes2HexString(buffer).replaceAll("00", "").trim();
if (bytes > 0) {//
mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_READ, bytes, -1,buffer).sendToTarget();
} else {
LogUtils.getInstance().e(getClass(),"disconnected");
connectionLost();
if (mState != STATE_NONE) {
LogUtils.getInstance().e(getClass(), "disconnected");
startChat();
}
break;
}
} catch (IOException e) {
LogUtils.getInstance().e(getClass(), "disconnected" + e);
connectionLost();
if (mState != STATE_NONE) {
//
startChat();
}
break;
}
}
}
/**
* OutStream
*
* @param buffer
*
*/
public void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
// UI
mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_WRITE, -1,-1, buffer).sendToTarget();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(),
"Exception during write:" + e);
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
LogUtils.getInstance().e(getClass(),"close() of connect socket failed:" + e);
}
}
}
대략적인 절 차 는 위의 세 개의 라인 에서 보 여 준 것 이다.물론 구체 적 인 상황 은 프로젝트 에 따라,예 를 들 어 블 루 투 스 프로 토 콜 이 프로 토 콜 정의 에 따라 해석 하 는 방식 이다.코드 에 연 결 된 블 루 투 스 연결 상태의 변화 에 사용 되 는 handle 은 상 태 를 activity 에 직접 보 내 activity 업 데 이 트 를 알 립 니 다.
/**
* , Activity
*/
private void connectionFailed() {
setState(STATE_LISTEN);
Message msg = mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString(BluetoothChatActivity.TOAST, " ");
msg.setData(bundle);
mHandler.sendMessage(msg);
}
/**
* , Activity
*/
private void connectionLost() {
Message msg = mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString(BluetoothChatActivity.TOAST, " ");
msg.setData(bundle);
mHandler.sendMessage(msg);
}
보 내기 단 추 를 누 르 면 텍스트 입력 상자 의 텍스트 를 보 내 는 방법:
private void sendMessage(String message) {
if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED) {
Toast.makeText(this, R.string.not_connected,Toast.LENGTH_SHORT).show();
return;
}
if (message.length() > 0) {
byte[] send = message.getBytes();
mChatService.write(send);
}
}
// BluetoothChatService write
public void write(byte[] out) {
ConnectedThread r;
synchronized (this) {
if (mState != STATE_CONNECTED)
return;
r = mConnectedThread;
}
r.write(out);
}
이렇게 블 루 투 스 채 팅 의 절 차 는 바로 이 렇 습 니 다.채 팅 을 종료 할 때 모든 스 레 드 를 중단 합 니 다.
public synchronized void stop() {
LogUtils.getInstance().e(getClass(), "---stop()");
setState(STATE_NONE);
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
if (mAcceptThread != null) {
mAcceptThread.cancel();
mAcceptThread = null;
}
}
이 글 을 보고 안 드 로 이 드 블 루 투 스에 서 연결 하 는 것 은 문제 가 크 지 않 을 것 이 라 고 믿 습 니 다(spp 프로 토 콜).원본 주소:소스 코드 확인 시 켜 주세요.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.