Я разрабатываю сканер приложений маяка (в фоновом режиме, когда Bluetooth активирован) с Android Beacon Library .
Проблема заключается в том, что всякий раз, когда я активирую сканер в качестве фона и пытаюсь воспроизвести видео с MediaController в другом действии или загрузить некоторые данные API, видео не воспроизводится или иногда воспроизводится с задержкой и аналогично загрузке API действие.
Но при отключении сканера все работает нормально.
Я не знаю, выполняет ли библиотека свои сервисы в другом потоке или в том же потоке, который блокирует пользовательский интерфейс, поэтому я хочу знать, как решить эту проблему с помощью многозадачного решения, если это возможно.
Я использовал huawei HOL-19, API19
это файл CustomApplication:
import android.R
import android.app.*
import android.content.Context
import android.content.Intent
import android.os.*
import android.util.Log
import com.example.anymarketmobile.views.subactivities.HomeActivity
import org.altbeacon.beacon.*
import org.altbeacon.beacon.powersave.BackgroundPowerSaver
import org.altbeacon.beacon.startup.BootstrapNotifier
import org.altbeacon.beacon.startup.RegionBootstrap
class BackgrounApplicationBeacons : Application(), BeaconConsumer, RangeNotifier {
// Init Properties
lateinit var mBeaconManager: BeaconManager
var mRegion: Region? = null
var mMonitor = false
var mLastDetectedBeacon: Beacon? = null
val TAG = "==>"
// Actions & Callbacks
override fun onBeaconServiceConnect() {
mBeaconManager.addRangeNotifier(this)
try {
mBeaconManager.startRangingBeaconsInRegion(mRegion!!)
} catch (e: RemoteException) {
}
}
override fun didRangeBeaconsInRegion(beacons: MutableCollection<Beacon>?, region: Region?) {
Log.i("==>Beacons:", "${beacons?.size}")
if (beacons?.size!! > 0) {
val beacon = beacons.iterator().next()
if (beacon.id1 != mLastDetectedBeacon?.id1) {
Log.i("${TAG}beacon detected:", "${beacon.id1} , ${beacon.distance} m")
mLastDetectedBeacon = beacon
}
}
}
// Start monitoring beacons
fun startMonitoring() {
mBeaconManager = BeaconManager.getInstanceForApplication(this)
Log.i("==>", "Application launched:")
if (mBeaconManager.isMainProcess) {
mBeaconManager.beaconParsers.clear()
mBeaconManager.beaconParsers.add(
BeaconParser().setBeaconLayout(Constants.DEFAULT_BEACONS_LAYOUT)
)
mBeaconManager.setEnableScheduledScanJobs(false)
val backgroundPowerSaver = BackgroundPowerSaver(this)
mBeaconManager.backgroundBetweenScanPeriod = 0
mBeaconManager.backgroundScanPeriod = 2100
mRegion = Region("test", null, null, null)
// mRegionBootstrap = RegionBootstrap(this, mRegion)
mMonitor = true
val builder = notificationBuilder()
mBeaconManager.enableForegroundServiceScanning(builder.build(), 456)
Log.i(TAG, "startMonitoring")
mBeaconManager.applySettings()
mBeaconManager.bind(this)
}
}
// Stop monitoring beacons
fun stopMonitoring() {
mRegion = null
mBeaconManager.removeRangeNotifier(this)
mBeaconManager.unbind(this)
/*mRegionBootstrap?.disable()
mRegionBootstrap = null*/
Log.i(TAG, "stopMonitoring")
mMonitor = false
mLastDetectedBeacon = null
}
fun isMonitoring() = mMonitor
// Forground notification builder
private fun notificationBuilder(): Notification.Builder {
val builder = Notification.Builder(this)
builder.setSmallIcon(R.drawable.ic_search_category_default)
builder.setContentTitle("Scanning for Beacons")
val intent = Intent(this, HomeActivity::class.java)
intent.putExtra(Constants.FOREGROUND_SERVICE_COMMUNICATION_BEACON_SCAN, mMonitor)
val pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
)
builder.setContentIntent(pendingIntent)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
"My Notification Channel ID",
"My Notification Name", NotificationManager.IMPORTANCE_DEFAULT
)
channel.description = "My Notification Channel Description"
val notificationManager = getSystemService(
Context.NOTIFICATION_SERVICE
) as NotificationManager
notificationManager.createNotificationChannel(channel)
builder.setChannelId(channel.id)
}
return builder
}
}
Я ожидал избежать задержки или медленного исполнения.