12

Mục tiêu: Tạo ứng dụng Android phát hiện tên và địa chỉ thiết bị BT trong phạm vi và gửi giá trị của chúng đến dịch vụ web. Thiết bị BT chưa được liên kết trước đó với thiết bị chủ, tôi chỉ muốn thăm dò mọi thứ khi tôi đi bộ.Phát hiện thiết bị Bluetooth trong Android - startDiscovery()

Những gì tôi đã làm:

  1. Các vẩy có lỗ trên tài liệu.
  2. Đã triển khai phiên bản cục bộ của bộ điều hợp BT của thiết bị chủ.
  3. Đã triển khai thông báo để bật BT nếu không bật.
  4. Người nhận phát sóng đã đăng ký và Mục đích để phân tích cú pháp ACTION_FOUNDs sắp tắt của startDiscovery().
  5. Đã đăng ký BLUETOOTHBLUETOOTH_ADMIN quyền trong tệp kê khai.

Mọi thứ hoạt động (như được kiểm tra bằng ghi nhật ký điều khiển gia tăng) cho đến startDiscovery().


thất vọng:

  • startDiscovery() - Tôi cho rằng tôi đi qua này trong bối cảnh sai. Ngữ cảnh nào mà phương pháp này cần phải được đặt bên trong để hoạt động đúng?

Nếu bạn có thể làm phương pháp này hoạt động, tôi sẽ đánh giá cao sự khôn ngoan của bạn.

CẬP NHẬT - đây là phiên bản rút gọn đơn giản của mã khiến tôi đau buồn; đơn giản hóa này tóm tắt lỗi của tôi. Mã này chạy, nó không có lỗi cat.log hoặc các lỗi khác, nó chỉ đơn giản là không cung cấp cho bất kỳ đầu ra.

package aqu.bttest; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.widget.Toast; 

public class BT2Activity extends Activity { 

private BluetoothAdapter mBTA; 
private SingBroadcastReceiver mReceiver; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //register local BT adapter 
    mBTA = BluetoothAdapter.getDefaultAdapter(); 
    //check to see if there is BT on the Android device at all 
    if (mBTA == null){ 
     int duration = Toast.LENGTH_SHORT; 
     Toast.makeText(this, "No Bluetooth on this handset", duration).show(); 
    } 
    //let's make the user enable BT if it isn't already 
    if (!mBTA.isEnabled()){ 
     Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBT, 0xDEADBEEF); 
    } 
    //cancel any prior BT device discovery 
    if (mBTA.isDiscovering()){ 
     mBTA.cancelDiscovery(); 
    } 
    //re-start discovery 
    mBTA.startDiscovery(); 

    //let's make a broadcast receiver to register our things 
    mReceiver = new SingBroadcastReceiver(); 
    IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    this.registerReceiver(mReceiver, ifilter); 
} 

private class SingBroadcastReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); //may need to chain this to a recognizing function 
     if (BluetoothDevice.ACTION_FOUND.equals(action)){ 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      // Add the name and address to an array adapter to show in a Toast 
      String derp = device.getName() + " - " + device.getAddress(); 
      Toast.makeText(context, derp, Toast.LENGTH_LONG); 
     } 
    } 
} 

}

+0

Nó sẽ giúp bạn biết được lỗi bạn đang nhận được ... hoặc ít nhất chính xác những gì đang dẫn bạn tin rằng 'startDiscovery()' hoạt động không chính xác. –

Trả lời

15

bối cảnh gì phương pháp này cần phải được đặt bên trong để hoạt động đúng.

Nói một cách đơn giản, bạn nên sử dụng startDiscovery() khi bạn muốn ứng dụng của bạn để khám phá các thiết bị Bluetooth cục bộ ... ví dụ, nếu bạn muốn thực hiện một ListActivity quét và tự động bổ sung các thiết bị Bluetooth gần đó để một ListView (xem DeviceListActivity).

sử dụng của bạn của phương pháp startDiscovery() nên tìm một cái gì đó như thế này:

  1. Định nghĩa một biến lớp đại diện cho các bộ chuyển đổi Bluetooth cục bộ.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
    
  2. Kiểm tra xem thiết bị của bạn đã "phát hiện" chưa. Nếu có, hãy hủy khám phá.

    if (mBtAdapter.isDiscovering()) { 
        mBtAdapter.cancelDiscovery(); 
    } 
    
  3. Ngay sau khi kiểm tra (và có thể hủy) phát hiện chế độ, bắt đầu khám phá bằng cách gọi,

    mBtAdapter.startDiscovery(); 
    
  4. Hãy rất cẩn thận trong việc tổng quát về vô tình để lại thiết bị của bạn trong khám phá chế độ. Thực hiện khám phá thiết bị là một thủ tục nặng nề cho bộ điều hợp Bluetooth và sẽ tiêu tốn rất nhiều tài nguyên của nó. Ví dụ, bạn muốn chắc chắn rằng bạn kiểm tra/hủy bỏ phát hiện trước khi cố gắng để thực hiện một kết nối. Bạn rất có thể muốn hủy khám phá trong phương thức onDestroy của mình.

Hãy cho tôi biết nếu điều này giúp ... và nếu bạn vẫn gặp sự cố, hãy cập nhật câu trả lời với đầu ra logcat và/hoặc bất kỳ thông báo lỗi nào bạn đang nhận được, và có thể tôi có thể giúp bạn một chút hơn.

+0

Điều đó đã giúp ích. Ngoài ra, chuyển kết quả đến một ArrayAdapter thay vì một Toast chắc chắn cũng đã giúp. – Lemminkainen

+0

là có cách nào để tiếp tục quét liên tục trong dịch vụ BG mà không cần đặt hẹn giờ ... bất kỳ API cấp hệ thống nào. – CoDe

+0

@Shubh Tôi không nghĩ vậy. Lý do tại sao hạn chế này được đưa ra là để đảm bảo rằng các ứng dụng không lạm dụng 'Bluetooth' bằng cách liên tục quét trong nền. –

Các vấn đề liên quan