1 |
public override fun onCreate(savedInstanceState: Bundle?) {
|
2 |
super.onCreate(savedInstanceState)
|
3 |
setContentView(R.layout.activity_main)
|
4 |
|
5 |
val bluetoothLeScanner = (getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager).adapter.bluetoothLeScanner
|
6 |
|
7 |
val rssi_msg = findViewById<View>(R.id.textView1) as TextView
|
8 |
val rssi_list = findViewById<View>(R.id.textView2) as TextView
|
9 |
val scroll = findViewById<View>(R.id.TimelineScrollbar) as ScrollView
|
10 |
|
11 |
val BuStart = findViewById<View>(R.id.button_start) as Button
|
12 |
val BuStop = findViewById<View>(R.id.button_stop) as Button
|
13 |
|
14 |
val settings = ScanSettings.Builder()
|
15 |
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
|
16 |
.build()
|
17 |
|
18 |
val filters = mutableListOf<ScanFilter>() // Leere Liste von Filtern sieht alle devices
|
19 |
//filters.add(ScanFilter.Builder().setDeviceName("AirTag").build())
|
20 |
filters.add(ScanFilter.Builder().setDeviceAddress("D6:49:48:05:D3:51").build())
|
21 |
// Replace MAC Address with your own value or rem the above line out to see all Beacon
|
22 |
|
23 |
val scanCallback = object : ScanCallback() {
|
24 |
override fun onScanResult(callbackType: Int, result: ScanResult) {
|
25 |
//Toast.makeText(getApplicationContext(), " Callback triggered ", Toast.LENGTH_SHORT).show()
|
26 |
//rssi_msg.text = "Callback Triggered"
|
27 |
//if (result.device.name != null && result.device.name == "AirTag") {
|
28 |
//if (result.device.name != null) {
|
29 |
//val name = result.device.name //"" //result.device.name
|
30 |
val deviceAddress = result.device.address
|
31 |
val rssi = result.rssi
|
32 |
// Hier können Sie den RSSI-Wert des AirTag-Beacons verwenden
|
33 |
Log.d("RSSI", "Device: $deviceAddress" + " " + "RSSI: $rssi")
|
34 |
rssi_list.text = rssi_list.text.toString() + deviceAddress + " => " + rssi + "dBm\n"
|
35 |
scroll.fullScroll(View.FOCUS_DOWN)
|
36 |
rssi_msg.text = String.format("%02d dBm", rssi)
|
37 |
//}
|
38 |
}
|
39 |
}
|
40 |
|
41 |
BuStart.setOnClickListener {
|
42 |
if (ActivityCompat.checkSelfPermission(
|
43 |
this,
|
44 |
Manifest.permission.BLUETOOTH_SCAN
|
45 |
) != PackageManager.PERMISSION_GRANTED
|
46 |
) {
|
47 |
// TODO: Consider calling
|
48 |
// ActivityCompat#requestPermissions
|
49 |
// here to request the missing permissions, and then overriding
|
50 |
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
|
51 |
// int[] grantResults)
|
52 |
// to handle the case where the user grants the permission. See the documentation
|
53 |
// for ActivityCompat#requestPermissions for more details.
|
54 |
Toast.makeText(getApplicationContext(), " No Scan Permission ", Toast.LENGTH_SHORT)
|
55 |
.show()
|
56 |
rssi_list.text = " No Scan Permission \n"
|
57 |
return@setOnClickListener
|
58 |
|
59 |
} else {
|
60 |
// Hier wird der Scanner gestartet
|
61 |
//bluetoothLeScanner?.startScan(filters, settings, scanCallback)
|
62 |
bluetoothLeScanner?.startScan(filters, settings, scanCallback)
|
63 |
Toast.makeText(getApplicationContext(), " Scanner Started ", Toast.LENGTH_SHORT)
|
64 |
.show()
|
65 |
rssi_list.text = " Scanner Started \n"
|
66 |
}
|
67 |
}
|
68 |
|
69 |
BuStop.setOnClickListener {
|
70 |
// Hier wird der Scanner gestopped
|
71 |
bluetoothLeScanner?.stopScan(scanCallback)
|
72 |
Toast.makeText(getApplicationContext(), " Scanner Stopped ", Toast.LENGTH_SHORT)
|
73 |
.show()
|
74 |
rssi_list.text = rssi_list.text.toString() + " Scanner Stopped \n"
|
75 |
scroll.fullScroll(View.FOCUS_DOWN)
|
76 |
|
77 |
// Hier wird die Liste respeichert (for API 34 ext7 only)
|
78 |
// Zu finden unter : /storage/emulated/0/Documents/YourCustomDirectory/RSSIwerte.txt
|
79 |
val content = rssi_list.text as String
|
80 |
val fileName = "RSSIwerte.txt"
|
81 |
saveStringToMediaStore(this, fileName, content)
|
82 |
}
|
83 |
}
|
84 |
|
85 |
// allgemeine File-Speicherfunktion (for API 34 ext7 only)
|
86 |
// Files werden in : Documents/BeaconTest/ abgelegt
|
87 |
fun saveStringToMediaStore(context: Context, fileName: String, content: String) {
|
88 |
val values = ContentValues().apply {
|
89 |
put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
|
90 |
put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")
|
91 |
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS + "/BeaconTest")
|
92 |
}
|
93 |
|
94 |
val uri = context.contentResolver.insert(MediaStore.Files.getContentUri("external"), values)
|
95 |
|
96 |
uri?.let { outputStream ->
|
97 |
context.contentResolver.openOutputStream(outputStream).use { it?.write(content.toByteArray()) }
|
98 |
}
|
99 |
}
|
100 |
|
101 |
@SuppressLint("MissingPermission")
|
102 |
override fun onDestroy() {
|
103 |
super.onDestroy()
|
104 |
//bluetoothLeScanner?.stopScan(scanCallback)
|
105 |
}
|