我已经完成登录和注册电子邮件&&用户布局密码,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);
}
}
}
答案 0 :(得分:0)
对于发送数据,通过在AsyncTask<String,Void,Void>
方法中扩展doInBackground
来创建一个后台任务,接受参数Userid,latitude,logitude。您将数据存储到firebase的代码将位于doInBackground
。在此调用背景之后
BackGroundTask backgroundTask = new BackGroundTask(this);
backgroundTask.execute(User_id, latitude, longitude);
在onLocationChanged
方法中。