2017-05-31 82 views
0

這裏是我的代碼應用廣播接收器無法檢測附近可用的藍牙設備,但手機檢測

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.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (BluetoothDevice.ACTION_FOUND.equals(action)) {     
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       devices.add(device.getName());     
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       mBtAdapter.startDiscovery(); 
       Toast.makeText(MainActivity.this,"Discovering "+devices.size(),Toast.LENGTH_SHORT).show(); 
       ArrayAdapter arrayAdapter=new ArrayAdapter(MainActivity.this,android.R.layout.simple_list_item_1,devices); 
       listView.setAdapter(arrayAdapter); 
       } 
      } 

    }; 

    ListView listView; 
    ArrayList<String> devices; 
    private BluetoothAdapter mBtAdapter; 

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

     listView=(ListView) findViewById(R.id.listView); 
     devices=new ArrayList<String>(); 

     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     this.registerReceiver(mReceiver, filter); 

     filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     this.registerReceiver(mReceiver, filter); 

     mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 

     if(!mBtAdapter.isEnabled()){ 
      mBtAdapter.enable(); 
     } 

     mBtAdapter.startDiscovery();   
    } 

    @Override 
    protected void onDestroy(){ 
     super.onDestroy(); 
     mBtAdapter.cancelDiscovery(); 
     unregisterReceiver(mReceiver); 
    } 
} 

問題是,它總是顯示發現0作爲設備的ArrayList的大小始終爲0,但手機檢測附近的可用設備如下圖所示Screenshot of phone bluetooth settings。我認爲我的應用廣播接收器不檢測藍牙設備可用,因爲我的代碼中有錯誤。請幫助我

+0

您是否試圖在API 18+設備上運行此代碼? – CzarMatt

回答

1

您不必註冊您的接收器兩次,意圖過濾器可以容納多個動作。

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(BluetoothDevice.ACTION_FOUND); 
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
registerReceiver(yourReceiver, intentFilter); 

檢查是否有權限所必需的掃描:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

並非所有的藍牙設備都在正常模式下可發現,請大家看看藍牙適配器的BluetoothLeScanner和startLeScan方法:

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); 

bluetoothAdapter.getBluetoothLeScanner().startScan(yourCallback); // API 21+ 
bluetoothAdapter.startLeScan(yourCallback); // API 18+ 

同樣需要一段時間才能打開設備上的藍牙,您應該聽取藍牙狀態更改並在發現藍牙狀態後開始發現打開並準備好使用,看看這個answer

+1

可能還需要指定權限'android.permission.ACCESS_COARSE_LOCATION'。 – CzarMatt

+0

你是對的,謝謝。 –

相關問題