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

Java - Ngủ sâu không kết nối được với thiết bị Bluetooth

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:09:22 35 4
mua khóa gpt4 Nike

Tôi đang cố gắng kết nối với một thiết bị bluetooth được ghép nối cứ sau 25 giây, được lên lịch thông qua Trình quản lý báo thức, điều này sẽ kích hoạt WakefulBroadcastReceiver để bắt đầu dịch vụ kết nối. Sau khi thiết bị chuyển sang chế độ ngủ, mọi thứ hoạt động tốt trong vài giờ đầu, nhưng bắt đầu trục trặc sau khoảng 4-5 giờ, lúc đó tôi cho rằng thiết bị sẽ chuyển sang chế độ ngủ.ngủ sâu .

Tôi nhận được NullPointerException từ ParcelFileDescriptor cho biết "FileDescriptor không thể rỗng". Tôi đã thử tìm kiếm lỗi này và thậm chí đã xem mã trong ParcelFileDescriptor.java, nhưng tôi không tìm thấy gì cả. Tôi đang chạy nó trên Nexus 10 với Android 4.4.2. Mã cố gắng kết nối như sau:

public GatewaySocket getSocket() ném IOException
{
if (!BluetoothAdapter.checkBluetoothAddress(macAddress))
trả về GatewaySocket mới("Địa chỉ " + macAddress + " không phải là Địa chỉ MAC Bluetooth hợp lệ");

BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
nếu (bluetooth == null)
return new GatewaySocket("Xin lỗi, không có bộ chuyển đổi Bluetooth nào");

Thiết bị BluetoothDevice = bluetooth.getRemoteDevice(macAddress);

BluetoothSocket btSocket = null;

thử
{
btSocket = device.createRfcommSocketToServiceRecord(uuid);
}
catch (Exception e)
{
log(3, "" + this, "Lỗi đóng socket khi kết nối: " + e);
}

nếu (btSocket == null)
return GatewaySocket mới("Không thể khởi chạy kết nối không an toàn tới thiết bị " +);

thử
{
btSocket.connect();
}
bắt (IOException cũ)
{
thử
{
btSocket.close();
}
bắt (IOException ex2)
{
// không làm gì cả
}

ném (ví dụ);
}

Ổ cắm GatewaySocket = GatewaySocket mới(btSocket, btSocket.getInputStream(), btSocket.getOutputStream());

ổ cắm trở lại;
}

GatewaySocket là một lớp con mỏng của BluetoothSocket. Lỗi xảy ra ở dòng btSocket.connect() và dấu vết ngăn xếp như sau:

01-10 09:13:57.796: W/BluetoothAdapter(3591): getBluetoothService() được gọi mà không có BluetoothManagerCallback
01-10 09:13:57.801: D/BTIF_SOCK(979): service_uuid: 00001101-0000-1000-8000-00805f9b34fb
01-10 09:13:57.801: E/bt-btif(979): SOCK_THREAD_FD_RD báo hiệu khi rfc không được kết nối, id khe:4374, kênh:-1
01-10 09:13:57.801: W/System.err(3591): java.lang.NullPointerException: FileDescriptor không được rỗng
01-10 09:13:57.806: W/System.err(3591): tại android.os.ParcelFileDescriptor.(ParcelFileDescriptor.java:174)
01-10 09:13:57.806: W/System.err(3591): tại android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)
01-10 09:13:57.806: W/System.err(3591): tại android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)
01-10 09:13:57.806: W/System.err(3591): tại android.bluetooth.IBluetooth$Stub$Proxy.connectSocket(IBluetooth.java:1322)
01-10 09:13:57.806: W/System.err(3591): tại android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:308)
01-10 09:13:57.806: W/System.err(3591): tại com.gateway.service.AndroidGMConversation.getSocket(AndroidGMConversation.java:162)
01-10 09:13:57.806: W/System.err(3591): tại com.gateway.GatewayManagerConversation.converse(GatewayManagerConversation.java:81)
01-10 09:13:57.806: W/System.err(3591): tại com.gateway.GatewayManagerConversation.run(GatewayManagerConversation.java:72)
01-10 09:13:57.806: W/System.err(3591): tại java.lang.Thread.run(Thread.java:841)
01-10 09:13:57.806: V/PS(3591): Đã xong với thiết bị 06:92:25:0A:A5:50

Mọi đề xuất sẽ được đánh giá rất cao!

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

Tôi đã tìm ra giải pháp sau khi duyệt qua các lớp thư viện bluetooth và thấy rằng nó đang gọi bluetoothsocket.close(); FileDescriptor không bị đóng, mặc dù nó gọi gửi đi() Phương thức trên FileDescriptor, nó không đóng nó.

Chỉ cần vào bluetoothsocket.close();

Phương thức này đã được gọi trước đây
đồng bộ riêng tư void clearFileDescriptor(){
try{
Trường trường = BluetoothSocket.class.getDeclaredField("mPfd");
field.setAccessible(true);
ParcelFileDescriptor mPfd = (ParcelFileDescriptor)field.get(socket);
if(null == mPfd){
return;
}

mPfd.close();
}bắt(Ngoại lệ e){
Log.w(SensorTicker.TAG, "LocalSocket không thể đóng hoàn toàn.");
}
}

Hy vọng điều này cũng sẽ giải quyết các vấn đề khác. Nhưng nó phải được xử lý bởi lớp BluetoothSocket thông qua phương thức close.

Về java - Ngủ sâu không kết nối được với thiết bị Bluetooth, 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/21166222/

35 4 0
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