地理围栏在 Kotlin 中不起作用

艾哈迈德·S·杜拉尼

Geofence 在 Kotlin 中不起作用,尽管相同的代码在 Java 中起作用。我是 Kotlin 的新手,因此无法理解这个问题。实际上我正在MainGeofence.ktMainActivity以下活动中调用服务类是代码

主地理围栏.kt

 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 {
                //If everything went fine lets get latitude and longitude
                currentLatitude = location.latitude
                currentLongitude = location.longitude

                Log.i(TAG, currentLatitude.toString() + " WORKS " + currentLongitude)

                //createGeofences(currentLatitude, currentLongitude);
                //registerGeofences(mGeofenceList);
            }

            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) {
                // Catch exception generated if the app does not use ACCESS_FINE_LOCATION permission.
                Log.e(TAG, "Error")
            }

        }

        override fun onConnectionSuspended(i: Int) {

            Log.e(TAG, "onConnectionSuspended")

        }
    }

    /**
     * Create a Geofence list
     */
    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 {
        // Reuse the PendingIntent if we already have it.
        if (mGeofencePendingIntent != null) {
            return mGeofencePendingIntent!!
        }
        val intent = Intent(this, GeofenceIntentService::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        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")
        }
    }

}

主活动.kt

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 {
            //            startLocationUpdates()
            startService(Intent(this, MainGeofence::class.java))
              ...
        })
              ....
    }

GeofenceIntentService.kt

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
        }
        //Create AudioManager object to change phone profile
        var am: AudioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
        // Get the transition type.
        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) //put ringer to vibration
            }
            Geofence.GEOFENCE_TRANSITION_EXIT -> {
                showNotification("Exited", "Exited the Location")
                am.setRingerMode(AudioManager.RINGER_MODE_NORMAL) //put ringer to normal
            }
            else -> {
                println("oh cow's eye! something bad happened!")
                Log.e(TAG, "Error ")
            }
        }

    }

    fun showNotification(text: String, bigText: String) {

        // 1. Create a NotificationManager
        val notificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        // 2. Create a PendingIntent for AllGeofencesActivity
        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)

        // 3. Create and send a notification
        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 中完美运行。这是语言问题还是实现问题?非常感谢帮助!

迈克尔·安德森

我认为你的问题是中的 when 子句 onHandleIntent

你基本上有

when (x) {
        A or B -> { ... }
        C -> { ... }
        else -> { ... }
}

我认为Geofence.GEOFENCE_TRANSITION_ENTERetc 是Int类型,因此您最终会使用infix fun or(other: Int): Int (source).

我认为你真正想要的是:

when (x) {
        A, B -> { ... }
        C -> { ... }
        else -> { ... }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

woocommerce中的地理围栏产品

来自分类Dev

在android中的服务中添加地理围栏

来自分类Dev

后台Windows Phone 8.1(WinRT)中的地理围栏

来自分类Dev

如何知道我在哪个地理围栏中?

来自分类Dev

WeakReference在Kotlin中不起作用

来自分类Dev

Hibernate Transient在Kotlin中不起作用

来自分类Dev

同步注释在Kotlin中不起作用

来自分类Dev

Hibernate Transient在Kotlin中不起作用

来自分类Dev

Spring @Autowire在Kotlin中不起作用

来自分类Dev

onClick xml 在 kotlin 中不起作用

来自分类Dev

Android BindingConversion 在 kotlin 中不起作用?

来自分类Dev

Kotlin扩展属性在Kotlin脚本中不起作用

来自分类Dev

Kotlin扩展属性在Kotlin脚本中不起作用

来自分类Dev

Kotlin AddOnPageChangeListener不起作用

来自分类Dev

如何将区域的地理围栏添加到监视中。

来自分类Dev

Windows Phone 8.1中的地理围栏后台任务-无法从BackgroundExecutionManager请求访问

来自分类Dev

地理围栏didEnterRegion,didExitRegion函数未在iPhone 5S iOS8.1中调用

来自分类Dev

尝试在android中安装和设置地理围栏时发生错误

来自分类Dev

如何将区域的地理围栏添加到监视中。

来自分类Dev

Android App在同一服务中添加地理围栏并接收意图

来自分类Dev

如何通过地理围栏避免Android中的多个回调级别

来自分类Dev

Android:地理围栏到期

来自分类Dev

Android:地理围栏到期

来自分类Dev

如何使地理围栏准确?

来自分类Dev

ElasticSearch中的地理排序和距离计算不起作用

来自分类Dev

地理定位在简单的 js 中不起作用

来自分类Dev

在Intent中覆盖OnActivityResult不起作用-Kotlin

来自分类Dev

用Mockito在Kotlin中模拟队列似乎不起作用

来自分类Dev

Kotlin语言翻译器中的“ <”字符不起作用

Related 相关文章

  1. 1

    woocommerce中的地理围栏产品

  2. 2

    在android中的服务中添加地理围栏

  3. 3

    后台Windows Phone 8.1(WinRT)中的地理围栏

  4. 4

    如何知道我在哪个地理围栏中?

  5. 5

    WeakReference在Kotlin中不起作用

  6. 6

    Hibernate Transient在Kotlin中不起作用

  7. 7

    同步注释在Kotlin中不起作用

  8. 8

    Hibernate Transient在Kotlin中不起作用

  9. 9

    Spring @Autowire在Kotlin中不起作用

  10. 10

    onClick xml 在 kotlin 中不起作用

  11. 11

    Android BindingConversion 在 kotlin 中不起作用?

  12. 12

    Kotlin扩展属性在Kotlin脚本中不起作用

  13. 13

    Kotlin扩展属性在Kotlin脚本中不起作用

  14. 14

    Kotlin AddOnPageChangeListener不起作用

  15. 15

    如何将区域的地理围栏添加到监视中。

  16. 16

    Windows Phone 8.1中的地理围栏后台任务-无法从BackgroundExecutionManager请求访问

  17. 17

    地理围栏didEnterRegion,didExitRegion函数未在iPhone 5S iOS8.1中调用

  18. 18

    尝试在android中安装和设置地理围栏时发生错误

  19. 19

    如何将区域的地理围栏添加到监视中。

  20. 20

    Android App在同一服务中添加地理围栏并接收意图

  21. 21

    如何通过地理围栏避免Android中的多个回调级别

  22. 22

    Android:地理围栏到期

  23. 23

    Android:地理围栏到期

  24. 24

    如何使地理围栏准确?

  25. 25

    ElasticSearch中的地理排序和距离计算不起作用

  26. 26

    地理定位在简单的 js 中不起作用

  27. 27

    在Intent中覆盖OnActivityResult不起作用-Kotlin

  28. 28

    用Mockito在Kotlin中模拟队列似乎不起作用

  29. 29

    Kotlin语言翻译器中的“ <”字符不起作用

热门标签

归档