java - 在 Firebase 数据库中保存一个孩子下的多个 android 活动的数据
问题描述
我是 Android Studio 和 firebase 的新手。为我最后一年的项目制作一个安卓应用程序。我想在 BusinessOwner 字段下的用户名下保存用户的位置。我想在登录时保存用户的位置。非常感谢您的帮助
BusinessOwnerRegister.java
package com.example.android.onroadsupport;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class BusinessOwnerRegister extends AppCompatActivity {
//Variables
TextInputLayout regName, regUsername, regEmail, regPhoneNo, regPassword,regFullAddress,regLandmark,regPinCode,regVoterID,regServiceType;
Button regBtn;
FirebaseDatabase rootNode;
DatabaseReference reference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_business_owner_register);
getSupportActionBar().hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//Hooks to all xml elements in activity_user_register.xml
regName = findViewById(R.id.reg_name);
regUsername = findViewById(R.id.reg_username);
regEmail = findViewById(R.id.reg_email);
regPhoneNo = findViewById(R.id.reg_phoneNumber);
regPassword = findViewById(R.id.reg_password);
regBtn = findViewById(R.id.reg_btn);
regFullAddress = findViewById(R.id.reg_address);
regLandmark = findViewById(R.id.reg_landmark);
regPinCode = findViewById(R.id.reg_pinCode);
regVoterID = findViewById(R.id.reg_voterID);
regServiceType = findViewById(R.id.reg_serviceType);
}
private Boolean validateName() {
String val = regName.getEditText().getText().toString();
if (val.isEmpty()) {
regName.setError("Field cannot be empty");
return false;
} else {
regName.setError(null);
regName.setErrorEnabled(false);
return true;
}
}
private Boolean validateUsername() {
String val = regUsername.getEditText().getText().toString();
String noWhiteSpace = "\\A\\w{4,20}\\z";
if (val.isEmpty()) {
regUsername.setError("Field cannot be empty");
return false;
} else if (val.length() >= 15) {
regUsername.setError("Username too long");
return false;
} else if (!val.matches(noWhiteSpace)) {
regUsername.setError("White Spaces are not allowed");
return false;
} else {
regUsername.setError(null);
regUsername.setErrorEnabled(false);
return true;
}
}
private Boolean validateEmail() {
String val = regEmail.getEditText().getText().toString();
String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
if (val.isEmpty()) {
regEmail.setError("Field cannot be empty");
return false;
} else if (!val.matches(emailPattern)) {
regEmail.setError("Invalid email address");
return false;
} else {
regEmail.setError(null);
regEmail.setErrorEnabled(false);
return true;
}
}
private Boolean validatePhoneNo() {
String val = regPhoneNo.getEditText().getText().toString();
if (val.isEmpty()) {
regPhoneNo.setError("Field cannot be empty");
return false;
} else {
regPhoneNo.setError(null);
regPhoneNo.setErrorEnabled(false);
return true;
}
}
private Boolean validatePassword() {
String val = regPassword.getEditText().getText().toString();
String passwordVal = "^" +
//"(?=.*[0-9])" + //at least 1 digit
//"(?=.*[a-z])" + //at least 1 lower case letter
//"(?=.*[A-Z])" + //at least 1 upper case letter
"(?=.*[a-zA-Z])" + //any letter
"(?=.*[@#$%^&+=])" + //at least 1 special character
"(?=\\S+$)" + //no white spaces
".{4,}" + //at least 4 characters
"$";
if (val.isEmpty()) {
regPassword.setError("Field cannot be empty");
return false;
} else if (!val.matches(passwordVal)) {
regPassword.setError("Password is too weak");
return false;
} else {
regPassword.setError(null);
regPassword.setErrorEnabled(false);
return true;
}
}
private Boolean validateFullAddress() {
String val = regFullAddress.getEditText().getText().toString();
if (val.isEmpty()) {
regFullAddress.setError("Field cannot be empty");
return false;
} else {
regFullAddress.setError(null);
regFullAddress.setErrorEnabled(false);
return true;
}
}
private Boolean validateLandmark() {
String val = regLandmark.getEditText().getText().toString();
if (val.isEmpty()) {
regLandmark.setError("Field cannot be empty");
return false;
} else {
regLandmark.setError(null);
regLandmark.setErrorEnabled(false);
return true;
}
}
private Boolean validatePinCode() {
String val = regPinCode.getEditText().getText().toString();
if (val.isEmpty()) {
regPinCode.setError("Field cannot be empty");
return false;
} else {
regPinCode.setError(null);
regPinCode.setErrorEnabled(false);
return true;
}
}
private Boolean validateVoterID() {
String val = regVoterID.getEditText().getText().toString();
if (val.isEmpty()) {
regVoterID.setError("Field cannot be empty");
return false;
} else {
regVoterID.setError(null);
regVoterID.setErrorEnabled(false);
return true;
}
}
private Boolean validateServiceType() {
String val = regServiceType.getEditText().getText().toString();
if (val.isEmpty()) {
regServiceType.setError("Field cannot be empty");
return false;
} else {
regServiceType.setError(null);
regServiceType.setErrorEnabled(false);
return true;
}
}
//This function will execute when user click on Sign up Button
public void registerBusinessOwner(View view) {
//Save data in firebase on button click
rootNode = FirebaseDatabase.getInstance();
reference = rootNode.getReference("BusinessOwners");
if (!validateName() | !validateUsername() | !validateEmail() | !validatePhoneNo() | !validatePassword() |
!validateFullAddress() | !validateLandmark() | !validatePinCode() | !validateVoterID() | !validateServiceType()) {
return;
}
//Get all the values in Strings
String name = regName.getEditText().getText().toString();
String username = regUsername.getEditText().getText().toString();
String email = regEmail.getEditText().getText().toString();
String phoneNo = regPhoneNo.getEditText().getText().toString();
String password = regPassword.getEditText().getText().toString();
String fullAddress = regFullAddress.getEditText().getText().toString();
String landmark = regLandmark.getEditText().getText().toString();
String pinCode = regPinCode.getEditText().getText().toString();
String voterID = regVoterID.getEditText().getText().toString();
String serviceType = regServiceType.getEditText().getText().toString();
//Storing data in Firebase
MechanicHelperClass mechanicHelperClass = new MechanicHelperClass(name, username, email, phoneNo, password, fullAddress, landmark, pinCode, voterID, serviceType);
//Adding multiple users
//Adding username as unique ID
reference.child(username).setValue(mechanicHelperClass);
Toast.makeText(this, "Your Account has been Created Successfully!", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "Add Your Location", Toast.LENGTH_SHORT).show();
//Calling Login screen after Sign up completed
Intent intent = new Intent(getApplicationContext(), MapsActivity.class);
startActivity(intent);
finish();
}
}
MapsActivity.java
package com.example.android.onroadsupport;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.media.audiofx.BassBoost;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.example.android.onroadsupport.databinding.ActivityMapsBinding;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.FirebaseDatabase;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
com.google.android.gms.location.LocationListener {
Button callLogin;
private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
private Location mLocation;
private LocationManager mLocationManager;
private LocationRequest mLocationRequest;
private com.google.android.gms.location.LocationListener listener;
private long UPDATE_INTERVAL = 2000;
private long FASTEST_INTERVAL = 5000;
private LocationManager locationManager;
private LatLng latLng;
private boolean isPermission;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
//Call login from map
callLogin = findViewById(R.id.callLoginFromMap);
callLogin.setOnClickListener(v -> {
Intent intent = new Intent(MapsActivity.this, BusinessOwnerLogin.class);
startActivity(intent);
});
if (requestSinglePermission()) {
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationManager =(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
checkLocation();
}
}
private boolean checkLocation() {
if (!isLocationEnabled()){
showAlert();
}
return isLocationEnabled();
}
private void showAlert() {
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Enable Location")
.setMessage("Your location setting is set to off \n Please enable location to" + "use this app")
.setPositiveButton("Location Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
private boolean isLocationEnabled() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
private boolean requestSinglePermission() {
Dexter.withActivity(this)
.withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
isPermission = true;
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
//Check for permanent denial of permission
if (response.isPermanentlyDenied()) {
isPermission = false;
}
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
}
}).check();
return isPermission;
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (latLng!=null){
mMap.addMarker(new MarkerOptions().position(latLng).title("You"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,14f));
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
startLocationUpdates();
mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLocation == null){
startLocationUpdates();
}
else{
Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
}
}
private void startLocationUpdates() {
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL).setFastestInterval(FASTEST_INTERVAL);
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient
,mLocationRequest,this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(@NonNull Location location) {
String msg = "Updated Location : " +
Double.toString(location.getLatitude()) + "," +
Double.toString(location.getLongitude());
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
LocationHelper locationHelper = new LocationHelper(
location.getLongitude(),
location.getLatitude()
);
FirebaseDatabase.getInstance().getReference("BusinessOwners").child("Current Location")
.setValue(locationHelper).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
Toast.makeText(MapsActivity.this, "Location Saved", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MapsActivity.this, "Location Not Saved", Toast.LENGTH_SHORT).show();
}
}
});
latLng = new LatLng(location.getLatitude(),location.getLongitude());
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
super.onStart();
if (mGoogleApiClient != null){
mGoogleApiClient.connect();
}
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
}
解决方案
推荐阅读
- powershell - 在保留 Set-Location 开关的同时扩展 cd 功能
- reactjs - React Table 数据显示不正确
- javascript - Javascript 数组在第二次运行后变为空
- typescript - 在 TypeScript 中,我可以从函数重载中推断出映射类型吗?
- operating-system - 有没有一种方法可以在不关闭的情况下更新应用程序或系统?
- heroku - 在 Heroku 上使用 PointDNS 配置域但导致 403
- java - 从firebase成功下载pdf后,我在真实设备的下载文件夹中找不到pdf
- php - Laravel:在提交//出租评级功能后从表单中获取另一个 id
- html - 我可以在单行中填充图片并使用 css 网格布局保持纵横比简单吗
- javascript - 具有滑动效果的模态