授予位置权限后,位置跟踪应用程序崩溃。 Firebase数据库的实时位置

时间:2019-03-26 19:19:54

标签: java android firebase-realtime-database geolocation location

我正在构建位置跟踪应用程序。 “实时”位置将上传到Firebase数据库,然后用于在地图上向用户显示当前位置。

我已经修复了几个错误,但由于构建应用由于未知原因而崩溃,因此我现在无法继续进行操作。

我已通过android studio将我的应用连接到Firebase服务。 当我启动应用程序时,一切正常。我必须授予位置权限,然后执行此应用后崩溃。

在添加Firebase服务之前,这没有发生。 我被要求提供位置许可,并且按照代码进行编码,该应用程序仅在显示位置跟踪正在进行的通知时才自行关闭后台。

在构建或同步应用程序时,我绝对没有收到任何错误或警告。

附加了TrackerService.java中的代码

希望有人有一个主意,我的头现在空着。 这是我第一次使用像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);
    }
}

}

编辑:我检查了logcat协议,但确实有无效的服务通知渠道。

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)    

我必须为此创建一个通知渠道吗? 我知道错误发生在哪里,但不知道如何正确解决问题!?

第二次编辑: @Alex Mamo感谢您的“提示”,我是盲人,需要向正确方向的一点推动。 现在,我已经成功创建了一个NotificationChannel并为Notification分配了一个频道。该功能现在可以正常使用了! 非常感谢:)

0 个答案:

没有答案