首页 文章

无法在位置对象的字符串中存储纬度或经度

提问于
浏览
0

我正在制作一个需要设备位置的应用程序 . 我没有权限问题,位置存储在Location对象中 . 来自对象的纬度和经度也在文本视图中显示 . 但是,当我写:

double d = mLastLocation.getLatitude();

应用程序崩溃 .

我写的代码是:

import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;

import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;

import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Map;

public class NodeList extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
    private FusedLocationProviderClient mFusedLocationClient;
    private Location mLastLocation;
    private TextView lat;
    private TextView lon;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_node_list);
        mListView = (ListView)findViewById(R.id.listView);
        myRef = FirebaseDatabase.getInstance().getReference().child("Users");
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, latitudes);
        mListView.setAdapter(arrayAdapter);
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        lat = (TextView)findViewById(R.id.recLat);
        lon = (TextView)findViewById(R.id.recLon);
        getLastLocation();
        double d = mLastLocation.getLatitude();
    }

    @Override
    public void onStart() {
        super.onStart();
        if (!checkPermissions()) {
            requestPermissions();
        }
    }



    private void startLocationPermissionRequest() {
        ActivityCompat.requestPermissions(NodeList.this,
                new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }

    private void requestPermissions() {
        boolean shouldProvideRationale =
                ActivityCompat.shouldShowRequestPermissionRationale(this,
                        android.Manifest.permission.ACCESS_COARSE_LOCATION);
        if (shouldProvideRationale) {
            Log.i(TAG, "Displaying permission rationale to provide additional context.");

            showSnackbar(R.string.permission_rationale, android.R.string.ok,
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            // Request permission
                            startLocationPermissionRequest();
                        }
                    });
        } else {
            Log.i(TAG, "Requesting permission");
            startLocationPermissionRequest();
        }
    }

    @SuppressWarnings("MissingPermission")
    private void getLastLocation() {
        mFusedLocationClient.getLastLocation()
                .addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful() && task.getResult() != null) {
                            mLastLocation = task.getResult();
                            lat.setText("Latitude: " + Double.toString(mLastLocation.getLatitude()));

                            lon.setText("Longitude: "+Double.toString(mLastLocation.getLongitude()));
                        } else {
                            Log.w(TAG, "getLastLocation:exception", task.getException());
                            showSnackbar(getString(R.string.no_location_detected));
                        }
                    }
                });

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        Log.i(TAG, "onRequestPermissionResult");
        if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
            if (grantResults.length <= 0) {
                Log.i(TAG, "User interaction was cancelled.");
            } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getLastLocation();
            } else {
                showSnackbar(R.string.permission_denied_explanation, R.string.settings,
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                // Build intent that displays the App settings screen.
                                Intent intent = new Intent();
                                intent.setAction(
                                        Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package",
                                        BuildConfig.APPLICATION_ID, null);
                                intent.setData(uri);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                            }
                        });
            }
        }
    }

}

这真的让我感到沮丧,因为我无法弄清楚错误是什么 .

日志cat中的错误是:

10-11 12:58:51.817 9285-9285/com.mohana.pdc E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mohana.pdc/com.mohana.pdc.NodeList}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
                                                                     at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:154)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:6123)
                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
                                                                  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
                                                                     at com.mohana.pdc.NodeList.onCreate(NodeList.java:83)
                                                                     at android.app.Activity.performCreate(Activity.java:6672)
                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
                                                                     at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                     at android.os.Looper.loop(Looper.java:154) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:6123) 
                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
10-11 12:58:52.048 9285-9285/com.mohana.pdc E/AndroidRuntime: FATAL EXCEPTION: main
                                                              Process: com.mohana.pdc, PID: 9285
                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mohana.pdc/com.mohana.pdc.NodeList}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
                                                                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                  at android.os.Looper.loop(Looper.java:154)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:6123)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
                                                               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
                                                                  at com.mohana.pdc.NodeList.onCreate(NodeList.java:83)
                                                                  at android.app.Activity.performCreate(Activity.java:6672)
                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
                                                                  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                  at android.os.Looper.loop(Looper.java:154) 
                                                                  at android.app.ActivityThread.main(ActivityThread.java:6123) 
                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 

提前致谢!

2 回答

  • 1

    您的方法 getLastLocation() 异步更新您的 mLastLocation 变量 . 您可以通过必须使用 OnCompleteListener 来看到它是异步的 .

    这意味着当你写:

    getLastLocation();
    double d = mLastLocation.getLatitude();
    

    机会是 extremely 高, mLastLocation 此时仍然为空,所以你的应用程序将崩溃 NullPointerException .

    您必须将依赖于 mLastLocation 的任何内容移动到回调中,或者在尝试使用 mLastLocation 之前提供一些其他方法来保证回调已执行 .

  • 0

    你可以像这样将Double转换为String

    String latitudeStr=String.valueOf(mLastLocation.getLatitude());
    

相关问题