Location Tracking App crashing after granted location permission. live location to firebase database

0

I am building a location tracking app. The "live" location will be uploaded to a firebase database and then taken to display the users current location on a map.

I have already fixed several errors, but I cant proceed right now, because the build app crashes for unkown reasons.

I have connected my app to the firebase service via android studio. When I am starting the app everything works fine. I have to grant the locations permission and after I do this app just crashes.

This didn't happen before I added the firebase service. I got asked for the locations permission and as coded the app closed itself to the background just displaying a notification that the location tracking is in progress.

I am getting absolutely no errors or warning when building or syncing the app.

The code from the TrackerService.java is attached

Hope someone has an idea, my head is empty right now. It is the first time I am working with an "external" service like firebase :)

public class TrackerService extends Service {

private static final String TAG = TrackerService.class.getSimpleName();

@Override
public IBinder onBind(Intent intent) {return null;}

@Override
public void onCreate() {
    super.onCreate();
    buildNotification();
    loginToFirebase();
}

private void buildNotification() {
    String stop = "stop";
    registerReceiver(stopReceiver, new IntentFilter(stop));
    PendingIntent broadcastIntent = PendingIntent.getBroadcast(
            this, 0, new Intent(stop), PendingIntent.FLAG_UPDATE_CURRENT);
    // Create the persistent notification
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(getString(R.string.notification_text))
            .setOngoing(true)
            .setContentIntent(broadcastIntent)
            .setSmallIcon(R.drawable.ic_tracker);
    startForeground(1, builder.build());
}

protected BroadcastReceiver stopReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "received stop broadcast");
        // Stop the service when the notification is tapped
        unregisterReceiver(stopReceiver);
        stopSelf();
    }
};

private void loginToFirebase() {
    // Authenticate with Firebase, and request location updates
    String email = getString(R.string.firebase_email);
    String password = getString(R.string.firebase_password);
    FirebaseAuth.getInstance().signInWithEmailAndPassword(
            email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>(){
        @Override
        public void onComplete(Task<AuthResult> task) {
            if (task.isSuccessful()) {
                Log.d(TAG, "firebase auth success");
                requestLocationUpdates();
            } else {
                Log.d(TAG, "firebase auth failed");
            }
        }
    });
}

private void requestLocationUpdates() {
    LocationRequest request = new LocationRequest();
    request.setInterval(10000);
    request.setFastestInterval(5000);
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
    final String path = getString(R.string.firebase_path) + "/" + getString(R.string.transport_id);
    int permission = ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION);
    if (permission == PackageManager.PERMISSION_GRANTED) {
        // Request location updates and when an update is
        // received, store the location in Firebase
        client.requestLocationUpdates(request, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                DatabaseReference ref = FirebaseDatabase.getInstance().getReference(path);
                Location location = locationResult.getLastLocation();
                if (location != null) {
                    Log.d(TAG, "location update " + location);
                    ref.setValue(location);
                }
            }
        }, null);
    }
}

}

Edit: I checked my logcat protocol and i do have an invalid channel for service notification.

android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=null pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0 semMissedCount=0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1855)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:6981)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)    

Do I have to create an notification channel for this one? I know where the error occurs but don't know how to solve the problem properly!?

2nd Edit: @Alex Mamo thank you for the "hint", I was blind and needed that little push in the right direction. I have now succesfully created a NotificationChannel and assigned my Notification a channel. The function is now working as intended! Huge thanks :)

java
android
firebase-realtime-database
geolocation
location
asked on Stack Overflow Mar 26, 2019 by Higher X • edited Mar 27, 2019 by Higher X

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0