Kaynağa Gözat

Receiving location in service.

Thomas Chef 3 yıl önce
ebeveyn
işleme
1f914425a3

+ 14 - 41
app/src/main/java/com/flacksta/chef/journeygpstracker/MainScreenActivity.kt

@@ -4,11 +4,9 @@ import android.Manifest
 import android.content.Intent
 import android.content.pm.PackageManager
 import android.os.Bundle
-import android.os.Looper
 import android.util.Log
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AppCompatActivity
-import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
 import com.flacksta.chef.journeygpstracker.databinding.ActivityMainScreenBinding
@@ -17,10 +15,9 @@ import com.google.android.gms.location.*
 class MainScreenActivity : AppCompatActivity() {
 
     private lateinit var binding: ActivityMainScreenBinding
-    private lateinit var locationCallback: LocationCallback
-    private lateinit var mLocationRequest: LocationRequest
-    //private var mTrackingService: TrackingService = TrackingService()
     private var mPermApproved: Boolean = false
+    private lateinit var mTrackingServiceIntent: Intent
+    private lateinit var mTrackingService: TrackingService
 
     private val mTag: String = "MainScreenActivity"
 
@@ -77,45 +74,12 @@ class MainScreenActivity : AppCompatActivity() {
             mPermApproved = true
         }
 
-        /*mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
-
-        mLocationRequest = LocationRequest()
-        mLocationRequest.interval = 1000
-        mLocationRequest.fastestInterval = 1000
-        mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
-
-        locationCallback = object : LocationCallback() {
-            override fun onLocationResult(locationResult: LocationResult?) {
-                locationResult ?: return
-                for (location in locationResult.locations){
-                    Log.i(TAG,"Got location.")
-                    // Update UI with location data
-                    // ...
-                }
-            }
-        }
-
-        startLocationUpdates()*/
-
-        Intent(this, TrackingService::class.java).also { intent ->
-            startForegroundService(intent)
-        }
+        mTrackingService = TrackingService()
+        mTrackingServiceIntent = Intent(this, mTrackingService.javaClass)
+        startForegroundService(mTrackingServiceIntent)
 
     }
 
-    private fun startLocationUpdates() {
-
-        if (ActivityCompat.checkSelfPermission(
-                        this,
-                        Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED )
-        {
-            return
-        }
-        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
-            locationCallback,
-            Looper.getMainLooper())
-    }
-
     private fun loadFragment(fragment: Fragment) {
         supportFragmentManager
                 .beginTransaction()
@@ -123,5 +87,14 @@ class MainScreenActivity : AppCompatActivity() {
                 .commit()
     }
 
+    override fun onDestroy() {
+        if (::mTrackingServiceIntent.isInitialized) {
+            stopService(mTrackingServiceIntent)
+            Log.i(mTag,"Stopping service")
+        }
+        Log.i(mTag,"onDestroy()")
+        super.onDestroy()
+    }
+
 }
 

+ 78 - 39
app/src/main/java/com/flacksta/chef/journeygpstracker/TrackingService.kt

@@ -1,22 +1,63 @@
 package com.flacksta.chef.journeygpstracker
 
+import android.Manifest
 import android.app.*
 import android.content.Context
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.graphics.Bitmap
 import android.graphics.BitmapFactory
-import android.os.Build
 import android.os.IBinder
+import android.os.Looper
 import android.util.Log
+import androidx.core.app.ActivityCompat
 import androidx.core.app.NotificationCompat
+import androidx.core.content.ContextCompat
+import com.google.android.gms.location.*
 
 class TrackingService : Service() {
 
     private val mTag: String = "TrackingService"
 
+    var counter = 0
+    private lateinit var mFusedLocationClient: FusedLocationProviderClient
+    private lateinit var mLocationRequest: LocationRequest
+    private lateinit var mLocationCallback: LocationCallback
+
+
     override fun onCreate() {
         super.onCreate()
         Log.i(mTag,"onCreate()")
+        requestLocationUpdates()
+
+    }
+
+    private fun requestLocationUpdates() {
+
+        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
+        mLocationRequest = LocationRequest.create().apply {
+            interval = 2000
+            fastestInterval = 2000
+            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
+        }
+
+        mLocationCallback = object : LocationCallback() {
+            override fun onLocationResult(locationResult: LocationResult?) {
+                locationResult ?: return
+                for (location in locationResult.locations){
+                    counter += 1
+                    Log.i(mTag, "Got location: $counter")
+
+                }
+            }
+        }
+
+        val permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
+        if (permission == PackageManager.PERMISSION_GRANTED ) {
+            mFusedLocationClient.requestLocationUpdates(mLocationRequest,
+                    mLocationCallback,
+                    Looper.getMainLooper())
+        }
     }
 
     override fun onBind(intent: Intent): IBinder? {
@@ -33,48 +74,46 @@ class TrackingService : Service() {
 
     private var iconNotification: Bitmap? = null
     private var notification: Notification? = null
-    var mNotificationManager: NotificationManager? = null
+    private var mNotificationManager: NotificationManager? = null
     private val mNotificationId = 123
 
     private fun generateForegroundNotification() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            val intentMainLanding = Intent(this, MainScreenActivity::class.java)
-            val pendingIntent =
-                    PendingIntent.getActivity(this, 0, intentMainLanding, PendingIntent.FLAG_IMMUTABLE)
-            iconNotification = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
-            if (mNotificationManager == null) {
-                mNotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-            }
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                assert(mNotificationManager != null)
-                mNotificationManager?.createNotificationChannelGroup(
-                        NotificationChannelGroup("chats_group", "Chats")
-                )
-                val notificationChannel =
-                        NotificationChannel("service_channel", "Service Notifications",
-                                NotificationManager.IMPORTANCE_MIN)
-                notificationChannel.enableLights(false)
-                notificationChannel.lockscreenVisibility = Notification.VISIBILITY_SECRET
-                mNotificationManager?.createNotificationChannel(notificationChannel)
-            }
-            val builder = NotificationCompat.Builder(this, "service_channel")
-
-            builder.setContentTitle(StringBuilder(resources.getString(R.string.app_name)).append(" service is running").toString())
-                    .setTicker(StringBuilder(resources.getString(R.string.app_name)).append("service is running").toString())
-                    .setContentText("Touch to open") //                    , swipe down for more options.
-                    .setSmallIcon(R.drawable.ic_baseline_map_24)
-                    .setPriority(NotificationCompat.PRIORITY_LOW)
-                    .setWhen(0)
-                    .setOnlyAlertOnce(true)
-                    .setContentIntent(pendingIntent)
-                    .setOngoing(true)
-            if (iconNotification != null) {
-                builder.setLargeIcon(Bitmap.createScaledBitmap(iconNotification!!, 128, 128, false))
-            }
-            builder.color = resources.getColor(R.color.purple_200)
-            notification = builder.build()
-            startForeground(mNotificationId, notification)
+        val intentMainLanding = Intent(this, MainScreenActivity::class.java)
+        val pendingIntent =
+                PendingIntent.getActivity(this, 0, intentMainLanding, PendingIntent.FLAG_IMMUTABLE)
+        iconNotification = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
+        if (mNotificationManager == null) {
+            mNotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+        }
+
+        assert(mNotificationManager != null)
+        mNotificationManager?.createNotificationChannelGroup(
+                NotificationChannelGroup("chats_group", "Chats")
+        )
+        val notificationChannel =
+                NotificationChannel("service_channel", "Service Notifications",
+                        NotificationManager.IMPORTANCE_MIN)
+        notificationChannel.enableLights(false)
+        notificationChannel.lockscreenVisibility = Notification.VISIBILITY_SECRET
+        mNotificationManager?.createNotificationChannel(notificationChannel)
+
+        val builder = NotificationCompat.Builder(this, "service_channel")
+
+        builder.setContentTitle(StringBuilder(resources.getString(R.string.app_name)).append(" service is running").toString())
+                .setTicker(StringBuilder(resources.getString(R.string.app_name)).append("service is running").toString())
+                .setContentText("Touch to open") //                    , swipe down for more options.
+                .setSmallIcon(R.drawable.ic_baseline_map_24)
+                .setPriority(NotificationCompat.PRIORITY_LOW)
+                .setWhen(0)
+                .setOnlyAlertOnce(true)
+                .setContentIntent(pendingIntent)
+                .setOngoing(true)
+        if (iconNotification != null) {
+            builder.setLargeIcon(Bitmap.createScaledBitmap(iconNotification!!, 128, 128, false))
         }
+        builder.color = ContextCompat.getColor(this, R.color.purple_200)
+        builder.build().also { notification = it }
+        startForeground(mNotificationId, notification)
     }
 
     override fun onDestroy() {