cuốn sách gpt4 ai đã làm

android - RFCOMM_CreateConnection - 已打开状态 :2, RFC 状态 :4, MCB 状态:5

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 13:35:26 33 4
mua khóa gpt4 Nike

Tôi đang viết một ứng dụng Android sử dụng RFCOMM để kết nối với thiết bị qua Bluetooth. Tôi đã sử dụng mẫu BluetoothChat làm cơ sở để thiết lập kết nối và hầu hết mọi thứ đều hoạt động tốt.

Tuy nhiên, đôi khi tôi không thể kết nối lại do có thông báo ổ cắm đã mở:

RFCOMM_CreateConnection - trạng thái đã mở:2, trạng thái RFC:4, trạng thái MCB:5

Điều này có xu hướng xảy ra nếu tôi kết nối với thiết bị, đóng ứng dụng (gọi onDestroy()), mở lại và thử kết nối lại, dẫn đến tình huống trên.

Tôi sử dụng phương pháp này trong ConnectThread để kết nối (ví dụ ref.BluetoothChat):

Phương thức m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
mmSocket = tmp;

Cách duy nhất để giải quyết vấn đề này là tắt/bật Bluetooth của điện thoại Android.

Điều này khiến tôi tin rằng ổ cắm không bị đóng trong onDestroy(), nhưng tôi vẫn gọi tất cả các luồng sẽ bị đóng như trong ví dụ đã đề cập trước đó.
Bất kỳ ý tưởng sẽ được đánh giá rất cao.

câu trả lời hay nhất

Tôi cũng tình cờ phát hiện ra điều này và đây là câu trả lời tôi tìm thấy:

Lỗi này có thể xảy ra nếu kết nối ổ cắm Bluetooth được mở và đóng nhiều lần.

giải pháp

Bắt đầu từ API cấp 14, BluetoothSocket có chức năng gọi là isConected() phương pháp. , trả về true nếu ổ cắm này được kết nối, nếu không thì trả về false, đây là đoạn trích gốc từ API:

Nhận trạng thái kết nối của ổ cắm này, tức là có kết nối đang hoạt động với thiết bị từ xa hay không.

Đối với các cấp API < 14, bạn có thể giải quyết vấn đề này bằng cách để luồng xử lý Bluetooth ở chế độ ngủ sau khi đóng kết nối - 1000 ms là đủ, đây là ví dụ (btDevice thuộc loại BluetoothDevice và đã có trong đoạn mã bên dưới):

    thử {
//Mở ổ cắm cho thiết bị SPP (UUID được lấy từ API Android cho createRfcommSocketToServiceRecord)
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
// Kết nối với ổ cắm
btSocket.connect();
//Đóng ổ cắm
btSocket.close();
// Thời gian ngủ 1000ms sau khi đóng ổ cắm
SystemClock.sleep(POST_RESET_DELAY);

} bắt (Ném được e) {
//Thông báo lỗi nhật ký
}

P.S. Thay vì SystemClock.sleep, bạn cũng có thể sử dụng Thread.sleep - nhưng chế độ ngủ của SystemCock không thể bị gián đoạn, trong khi Thread.sleep thì có thể, vì vậy tùy thuộc vào trường hợp sử dụng của bạn mà tùy chọn nào phù hợp với mục đích của bạn hơn.

nguồn:Louis A. Prado

Về android - RFCOMM_CreateConnection - Trạng thái đã mở: 2, trạng thái RFC: 4, trạng thái MCB: 5, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/7888294/

33 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress