Geofence在Kotlin中不起作用,尽管相同的代码在Java中也起作用。我是科特林的新手,因此无法理解这个问题。
MainGeofence.kt
活动中的服务类
MainActivity
以下是代码
主围栏。千吨
public class MainGeofence : IntentService("MyService"), LocationListener {
internal var mGeofencePendingIntent: PendingIntent? = null
private var mGeofenceList: ArrayList<Geofence>? = null
private var mGoogleApiClient: GoogleApiClient? = null
val TAG = "Activity"
internal lateinit var mLocationRequest: LocationRequest
internal var currentLatitude = <<lat value
internal var currentLongitude = <<long value
override fun onCreate() {
super.onCreate()
}
override fun onHandleIntent(p0: Intent?) {
mGeofenceList = ArrayList<Geofence>()
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this)
== ConnectionResult.SUCCESS) {
initGoogleAPIClient()
createGeofences(currentLatitude, currentLongitude)
} else {
Log.e(TAG, "Your Device doesn't support Google Play Services.")
}
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(1 * 1000)
.setFastestInterval(1 * 1000)
}
public fun initGoogleAPIClient(): Unit {
mGoogleApiClient = GoogleApiClient.Builder(this)
.addApi(API)
.addConnectionCallbacks(connectionAddListener)
.addOnConnectionFailedListener(connectionFailedListener)
.build()
mGoogleApiClient?.connect()
}
private val connectionAddListener = object : GoogleApiClient.ConnectionCallbacks {
@SuppressLint("MissingPermission")
override fun onConnected(bundle: Bundle?) {
Log.i(TAG, "onConnected")
@SuppressLint("MissingPermission")
val location = FusedLocationApi.getLastLocation(mGoogleApiClient)
if (location == null) {
FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this@MainGeofence)
} else {
currentLatitude = location.latitude
currentLongitude = location.longitude
Log.i(TAG, currentLatitude.toString() + " WORKS " + currentLongitude)
}
try {
GeofencingApi.addGeofences(
mGoogleApiClient,
getGeofencingRequest(),
getGeofencePendingIntent()
).setResultCallback(ResultCallback<Status> { status ->
if (status.isSuccess) {
Log.i(TAG, "Saving Geofence")
} else {
Log.e(TAG, "Registering geofence failed: " + status.statusMessage +
" : " + status.statusCode)
}
})
} catch (securityException: SecurityException) {
Log.e(TAG, "Error")
}
}
override fun onConnectionSuspended(i: Int) {
Log.e(TAG, "onConnectionSuspended")
}
}
fun createGeofences(latitude: Double, longitude: Double) {
val id = UUID.randomUUID().toString()
println("latnlon " + latitude + " " + longitude)
val fence = Geofence.Builder()
.setRequestId(id)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)
.setCircularRegion(latitude, longitude, 50f)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.build()
mGeofenceList?.add(fence)
}
private fun getGeofencingRequest(): GeofencingRequest {
val builder = GeofencingRequest.Builder()
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
builder.addGeofences(mGeofenceList)
return builder.build()
}
private fun getGeofencePendingIntent(): PendingIntent {
if (mGeofencePendingIntent != null) {
return mGeofencePendingIntent!!
}
val intent = Intent(this, GeofenceIntentService::class.java)
return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
private val connectionFailedListener = GoogleApiClient.OnConnectionFailedListener { Log.e(TAG, "onConnectionFailed") }
override fun onLocationChanged(location: Location?) {
if (location != null) {
currentLatitude = location.latitude
currentLongitude = location.longitude
Log.i(TAG, "onLocationChanged")
}
}
}
主要活动。千吨
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dummyBtn = findViewById(R.id.dummyBtn)
dummyTv = findViewById(R.id.dummyTv)
dummyBtn.setOnClickListener(View.OnClickListener {
startService(Intent(this, MainGeofence::class.java))
...
})
....
}
GeofenceIntentService。千吨
public class GeofenceIntentService : IntentService("GeofenceIntentService") {
private final var TAG: String = "Geofence"
override fun onHandleIntent(intent: Intent?) {
Log.i(TAG, "onHandleIntent")
val geofencingEvent = fromIntent(intent)
if (geofencingEvent.hasError()) {
Log.e(TAG, "Goefencing Error " + geofencingEvent.errorCode)
return
}
var am: AudioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val geofenceTransition = geofencingEvent.geofenceTransition
Log.i(TAG, "geofenceTransition = " + geofenceTransition + " Enter : " +
Geofence.GEOFENCE_TRANSITION_ENTER + "Exit : " + Geofence.GEOFENCE_TRANSITION_EXIT)
when (geofenceTransition) {
Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_DWELL -> {
showNotification("Entered", "Entered the Location")
am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE)
}
Geofence.GEOFENCE_TRANSITION_EXIT -> {
showNotification("Exited", "Exited the Location")
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL)
}
else -> {
println("oh cow's eye! something bad happened!")
Log.e(TAG, "Error ")
}
}
}
fun showNotification(text: String, bigText: String) {
val notificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingNotificationIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT)
val notification = NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title")
.setContentText(text)
.setContentIntent(pendingNotificationIntent)
.setStyle(NotificationCompat.BigTextStyle().bigText(bigText))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.build()
notificationManager.notify(0, notification)
}
}
土工围栏点很少起火,这也是唯一的原因
Exit
一但是代码在Java中工作得很好。这是语言问题还是实现问题?
非常感谢您的帮助!