2017-03-11 3 views
1

ist, also habe ich versucht, einen BLE-Scanner zu implementieren. Das einzige Ding ist, dass ich es nicht bekommen konnte, um mir irgendwelche Ausgaben zu geben. Hier ist mein Code:BluetoothLeScanner scannt nicht; Keine Ahnung, ob der Fehler in der Software oder in meinem Code

MainActivity.java

public class MainActivity extends Activity 

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

     //Creating the BTManager and the BTAdapter 
     final BluetoothManager bluetoothManager =(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE); 
     final BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); 
     final BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); 


     Button scanButton = (Button)findViewById(R.id.scanButton); 
     Button locateButton = (Button)findViewById(R.id.locateButton); 

    /* Ensures Bluetooth is available on the device and it is enabled. If not, 
    displays a dialog requesting user permission to enable Bluetooth.*/ 
    if(bluetoothAdapter == null || bluetoothAdapter.isEnabled()) { 
     Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, 1); 
    } 

     scanButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       StartScan(bluetoothLeScanner); 
      } 
     }); 

     locateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Locate(); 
      } 
     }); 


} 



    public void StartScan(final BluetoothLeScanner bluetoothLeScanner) { 
    //Perform the Scan actions here 
    Log.v("Scan","Has Started"); 

    ScanSettings scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_BALANCED).build(); 

    final ScanCallback scanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) 
     { 
      String new_result = result.toString(); 
      Log.v(new_result, "Visible?"); 
      TextView textView = (TextView)findViewById(R.id.textView); 
      textView.setText(new_result); 
     } 

     @Override 
     public void onScanFailed(int errorCode) 
     { 
      super.onScanFailed(errorCode); 
      Log.e("Error","Error Occurred"); 
     } 
    }; 

    //The list for the filters 
    ArrayList<ScanFilter> filters= new ArrayList<>(); 

    //mac addresses of ble devices 
    String[] filterList = {"D4:B4:C8:7E:D1:35","00:1A:7D:DA:71:11","58:49:BA:0D:69:2A"}; 

    //Adding the MAC addresses to the filters list 
    for(int i=0; i< filterList.length ; i++) { 
     ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(filterList[i]).build(); 
     filters.add(filter); 

    } 


    bluetoothLeScanner.startScan(filters, scanSettings, scanCallback); 

    Handler handler = new Handler(); 
    int scanPeriod = 60000; 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      bluetoothLeScanner.stopScan(scanCallback); 
     } 
    },scanPeriod); 

} 

public void Locate() { 
    //Perform the Locate actions here 
    Toast.makeText(MainActivity.this, "Locate Started", Toast.LENGTH_LONG).show(); 

} 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="teamfour.bluetoothtracker.MainActivity"> 

<Button 
    android:layout_width="75pt" 
    android:layout_height="wrap_content" 
    android:id="@+id/scanButton" 
    android:text="Scan"/> 

<Button 
    android:layout_width="75pt" 
    android:layout_height="wrap_content" 
    android:id="@+id/locateButton" 
    android:text="Locate" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentEnd="true" /> 

<TextView 
    android:text="TextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/scanButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="59dp" 
    android:id="@+id/textView" /> 


</RelativeLayout> 

Können sie herausfinden, was ich falsch mache? Oder ist es die Software, die mich daran hindert, etwas auszugeben?

+0

'if (Bluetoothadapter == null || bluetoothAdapter.isEnabled())' - das 'bluetoothAdapter.isEnabled()' sein sollte - - die zweite Bedingung negiert? –

+0

@RoddyoftheFrozenPeas Ja, wahr. Das sollte negiert werden. Die Funktion gibt True zurück, ist BtAdapter ist ON. Fixiere es und überprüfe, ob die Anwendung funktioniert. Allerdings glaube ich nicht, dass die Anwendung nicht ausgeführt wird. Ich gebe es trotzdem ab. – thatrockbottomprogrammer

Antwort

1

Ich fand die Antwort auf meine Frage. Unter Android DOCS müssen alle Geräte mit Android 6.0 und höher explizit die Berechtigungen des Benutzers erfragen. Ich tat es nicht und daher scannte das Gerät nichts. Sie benötigen entweder FINE_LOCATION oder COARSE_LOCATION, damit Ihr BLE-Scan funktioniert. Prost!

Der Code, den ich verwendet, um die Lage zu beantragen war:

private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1 ; 

    if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 
        android.Manifest.permission.ACCESS_FINE_LOCATION)) { 

       // Show an explanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 

       // No explanation needed, we can request the permission. 

       ActivityCompat.requestPermissions(MainActivity.this, 
         new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 

      } 
     } 
Verwandte Themen