【问题标题】:Location(Longitude, Latitude) returns 0位置(经度,纬度)返回 0
【发布时间】:2016-10-10 18:39:54
【问题描述】:

我正在尝试获取当前位置的经度和纬度并将其保存在 Firebase 数据库中。源码运行正常,但是经纬度保存为0.0

如何解决此问题并获取正确的当前位置?不要介意几十个导入类,我还没有删除任何东西。

如果这是一个重复的问题,我真的很抱歉。

public class Register extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    EditText edtemail, edtpass, edtnumber;
    Button btnRegister, btnLogin, forgotpwdbtn;
    private FirebaseAuth auth;
    private DatabaseReference mDatabase;


    private GoogleApiClient googleApiClient;
    private Location location;
    private double longitude;
    private double latitude;
    String mUserId;


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


        btnRegister = (Button) findViewById(R.id.btnRegister);
        btnLogin = (Button) findViewById(R.id.btnLogin);
        forgotpwdbtn = (Button) findViewById(R.id.forgotpwdbtn);

        btnRegister.setOnClickListener(this);
        btnLogin.setOnClickListener(this);
        forgotpwdbtn.setOnClickListener(this);
        auth = FirebaseAuth.getInstance();


        mDatabase = FirebaseDatabase.getInstance().getReference();
        mUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();

        edtemail = (EditText) findViewById(R.id.edtemail);
        edtpass = (EditText) findViewById(R.id.edtpass);
        edtnumber = (EditText) findViewById(R.id.edtnumber);


    }


    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.forgotpwdbtn:
                Intent passwordIntent = new Intent(Register.this, ForgotPasswordActivity.class);
                startActivity(passwordIntent);
                break;
            case R.id.btnLogin:
                Intent intent = new Intent(Register.this, LoginActivity.class);
                startActivity(intent);
                break;
            case R.id.btnRegister:
                googleApiClient = new GoogleApiClient.Builder(this)
                        .addConnectionCallbacks(this)
                        .addOnConnectionFailedListener(this)
                        .addApi(LocationServices.API)
                        .build();

                final String key = mDatabase.child("data").push().getKey();
                final String email = edtemail.getText().toString().trim();
                final String password = edtpass.getText().toString().trim();
                final String number = edtnumber.getText().toString().trim();
                if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                }
                location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
                if (location != null) {
                    //Getting longitude and latitude
                    longitude = location.getLongitude();
                    latitude = location.getLatitude();
                }

                String lon = String.valueOf(longitude);
                String lat = String.valueOf(latitude);

                Item newItem = new Item(email, password, number, lon, lat);
                Map<String, Object> itemValues = newItem.toMap();
                Map<String, Object> childUpdates = new HashMap<>();
                childUpdates.put("/data/" + mUserId + "/" + key, itemValues);
                mDatabase.updateChildren(childUpdates);

                    auth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {


                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                            if (task.isSuccessful()) {

                                Toast.makeText(Register.this, "Registration success", Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(Register.this, LoginActivity.class);
                                startActivity(intent);

                            } else {
                                Toast.makeText(Register.this, "Registration failed." + task.getException(), Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                    break;
                }
        }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}

【问题讨论】:

    标签: android google-maps firebase google-api firebase-realtime-database


    【解决方案1】:

    您没有连接到 GoogleApiClient。在 onCreate 方法中创建 GoogleApiClient 对象。覆盖另外两个方法,onStartonStop。在onStart 方法中,通过调用googleapiclient.connect() 连接到GoogleApiClient。而在onStop方法中,通过调用if(googleapiclient.isConnected()) { googleapiclient.disconnect() }断开客户端。

    【讨论】:

    • 我按照你说的做了,但是当我按下注册按钮时出现了一个新的错误。 “java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void com.google.android.gms.common.api.GoogleApiClient.connect()'”
    • 您是否将googleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); 代码移至onCreate 方法??
    • 是的,我做到了,还是一样。按下注册按钮后停止。
    • 停止是什么意思?你现在遇到什么错误?
    • 哦,我的错,我错过了 super.onStart();在 onStart 方法中。显然现在我每次注册它的意图到 LoginActivity 后都会有新的错误,错误是“java.lang.Throwable: setStateLocked”..(意图发生后应用程序崩溃)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多