登录用户获取位置数据并以用户ID发送到Firebase数据库

时间:2017-06-10 23:25:36

标签: android firebase geolocation geofire

我已经完成登录和注册电子邮件&&用户布局密码,Firebase运行正常。注册用户信息(名称,类型)已成功写入数据库。现在我将开发下一个布局,登录用户从android位置服务获取位置数据,位置数据将以其用户ID保存到数据库。我已经通过服务方法创建了位置活动。我的问题是如何在用户ID下在数据库中发送和写入位置数据?我在DriverActivity或我的GPS_Service中编码吗?

这是我的DriverActivity.class

    public class DriverActivity extends AppCompatActivity {

private Button btn_start, btn_stop;
private TextView textView;
private BroadcastReceiver broadcastReceiver;

@Override
protected void onResume() {
    super.onResume();
    if(broadcastReceiver == null){
        broadcastReceiver = new BroadcastReceiver() {
            //bila broadcastreceiver terima intent dari service, so kena ada onReceive untuk terima data yg di broadcast tersebut
            @Override
            public void onReceive(Context context, Intent intent) {
                //coordinates tu key dari service. dia type apa yang di assign atas nama coordinates
                textView.append("\n" +intent.getExtras().get("coordinates"));


            }
        };
    }
    //location_updates tu dari service java punya Intent filter. data location diberikan nama filter tu mcm nama kotak berisi data
    registerReceiver(broadcastReceiver,new IntentFilter("location_updates"));
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if(broadcastReceiver != null){
        unregisterReceiver(broadcastReceiver);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_driver);

    btn_start = (Button) findViewById(R.id.button);
    btn_stop = (Button) findViewById(R.id.button2);
    textView = (TextView) findViewById(R.id.textView);

    if(!runtime_permissions())
        enable_buttons();


}

private void enable_buttons() {

    btn_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i =new Intent(getApplicationContext(),GPS_Service.class);
            startService(i);

        }
    });

    btn_stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i =new Intent(getApplicationContext(),GPS_Service.class);
            stopService(i);

        }
    });
}

private boolean runtime_permissions() {
    if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){

        requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION},100);

        return true;
    }
    return false;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 100){
        if( grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
            enable_buttons();
        }else {
            runtime_permissions();
        }
    }
}

}

这是我的GPS_Service.class

    public class GPS_Service extends Service {

private LocationListener listener;
private LocationManager locationManager;

private DatabaseReference databaseReference;

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

@Override
public void onCreate() {

    databaseReference = FirebaseDatabase.getInstance().getReference("path/to/geofire");
    GeoFire geoFire = new GeoFire(databaseReference);

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            //data akan dikotakkan dalam kotak bernama location_updates
            Intent i = new Intent("location_updates");
            //lat+long akan ditulis ikut format dan di assign atas title coordinates
            i.putExtra("coordinates",location.getLongitude()+" "+location.getLatitude());
            sendBroadcast(i);
        }

                    @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {
            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(i);

        }
    };

    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    //noinspection MissingPermission
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,0,listener);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if(locationManager != null){
        locationManager.removeUpdates(listener);
    }
}

}

1 个答案:

答案 0 :(得分:0)

对于发送数据,通过在AsyncTask<String,Void,Void>方法中扩展doInBackground来创建一个后台任务,接受参数Userid,latitude,logitude。您将数据存储到firebase的代码将位于doInBackground。在此调用背景之后

BackGroundTask backgroundTask = new BackGroundTask(this);
backgroundTask.execute(User_id, latitude, longitude);

onLocationChanged方法中。

相关问题