Hello I’m working on simple BLE scanning app with java but it doesn’t work.
I referred https://github.com/benlc/ble, android developers and completed the source code.
JavaScript
x
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button btnScanAdvStart;
private ArrayList<ItemDevice> arrayList;
private LeDeviceListAdapter leDeviceListAdapter;
private RecyclerView recyclerViewDevice;
private LinearLayoutManager linearLayoutManager;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mBluetoothLeScanner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnScanAdvStart = findViewById(R.id.btn_start);
recyclerViewDevice = findViewById(R.id.rv_device);
linearLayoutManager = new LinearLayoutManager(this);
recyclerViewDevice.setLayoutManager(linearLayoutManager);
arrayList = new ArrayList<>();
leDeviceListAdapter = new LeDeviceListAdapter(arrayList);
recyclerViewDevice.setAdapter(leDeviceListAdapter);
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
btnScanAdvStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startReceiving();
}
});
}
@Override protected void onDestroy() {
super.onDestroy();
stopReceiving();
}
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
ItemDevice item = new ItemDevice(
result.getDevice().getName(),
result.getDevice().getAddress(),
result.getRssi(),
result.getTimestampNanos());
arrayList.add(item);
leDeviceListAdapter.notifyDataSetChanged();
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Toast.makeText(MainActivity.this, "Scan fail", Toast.LENGTH_SHORT).show();
}
};
private void startReceiving() {
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
mBluetoothLeScanner.startScan(mScanCallback);
}
private void stopReceiving() {
mBluetoothLeScanner.stopScan(mScanCallback);
}
}
also permission is added in manifest file
JavaScript
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
I want to know why it isn’t work and how to make it work. I checked ScanResult with toast message but it does not show any result…
Advertisement
Answer
That’s a very old example. Nowadays Android needs runtime permissions for ACCESS_FINE_LOCATION. See https://developer.android.com/training/permissions/requesting for a tutorial.