2013-03-11 174 views
1

根据方法BluetoothAdapter.startDiscovery(),发现过程通常涉及大约12秒的查询扫描。有没有什么可以减少查询时间扫描(低于12秒)?更改蓝牙查询扫描时间

这是我MainActivity

package com.example.bluetoothsignal; 

import android.os.Bundle; 
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.view.Menu; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

    private EditText statusText; 
    private BluetoothAdapter mBtAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     statusText = (EditText) findViewById(R.id.statusText); 

     statusText.setText(""); 
     Intent discoverableIntent = new Intent(
       BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
     discoverableIntent.putExtra(
       BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
     startActivity(discoverableIntent); 

     IntentFilter localIntentFilter1 = new IntentFilter(
       "android.bluetooth.device.action.FOUND"); 
     registerReceiver(this.mReceiver, localIntentFilter1); 
     IntentFilter localIntentFilter2 = new IntentFilter(
       "android.bluetooth.adapter.action.DISCOVERY_FINISHED"); 
     registerReceiver(this.mReceiver, localIntentFilter2); 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     registerReceiver(mReceiver, filter); 
     this.mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
     this.mBtAdapter.startDiscovery(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     public void onReceive(Context paramContext, Intent paramIntent) { 
      String action = paramIntent.getAction(); 
      if ("android.bluetooth.device.action.FOUND".equals(action)) { 
       BluetoothDevice localBluetoothDevice = (BluetoothDevice) paramIntent 
         .getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 
       int s = paramIntent.getIntExtra(
         "android.bluetooth.device.extra.RSSI", -32768); 
       short s2 = paramIntent.getShortExtra(
         "android.bluetooth.device.extra.RSSI", Short.MIN_VALUE); 
       int s1 = paramIntent.getIntExtra(BluetoothDevice.EXTRA_RSSI, 
         Integer.MIN_VALUE); 

       String state = localBluetoothDevice.getAddress() + "\n" 
         + localBluetoothDevice.getName() + "\n" + s + "\n" + s1 
         + "\n" + s2; 
       statusText.setText(statusText.getText().toString() + state); 
      } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = paramIntent 
         .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // Add the name and address to an array adapter to show in a 
       // ListView 
       statusText.setText(statusText.getText().toString() 
         + device.getName() + "\n" + device.getAddress()); 
      } else if (("android.bluetooth.adapter.action.DISCOVERY_FINISHED" 
        .equals(action))) { 
       if (MainActivity.this.mBtAdapter.isDiscovering()) { 
        MainActivity.this.mBtAdapter.cancelDiscovery(); 
       } 
       statusText.setText(""); 
       MainActivity.this.mBtAdapter.startDiscovery(); 
      } 
     } 
    }; 
} 
+0

我不认为你可以控制这个,因为蓝牙发现协议需要时间扫描附近的设备,这是蓝牙堆栈的一部分。 – iTech 2013-03-11 22:12:22

+0

也许有什么选择,当蓝牙发现第一个设备时,它可以停止扫描?或者在蓝牙继续扫描时开始操作第一个发现的设备?谢谢 – 2013-03-11 22:16:29

+0

如果你想连接到一个特定的设备,你可以存储它的mac地址,并直接连接,而无需扫描 – iTech 2013-03-11 23:37:54

回答

0

如果你想连接到一个装置,其你不知道完整ADRESS,你必须做一个完整的发现与BluetoothAdapter.startDiscovery()和搜索接收到的地址为你想要的。

如果你直接使用.getRemoteDevice(address);知道你想连接到你可以直接连接到该设备符合BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

所以该设备的完整地址,你可以保存为的扫描设备。而是直接连接...

例子:

BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:1C:4D:02:A6:55"); 

sock = device.createRfcommSocketToServiceRecord(UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812")); 

然后sock.connect();等..希望你得到它

0

你可以调用startDiscovery当它停止。在你的boardcast接收器中:

if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
{ 
    btAdapter.startDiscovery(); 
}