当前位置: 首页 > 面试题库 >

代码只会在抛出NullPointerException时返回0.0、0.0 GPS坐标

曾骁
2023-03-14
问题内容

这是我对Android Location
API的第n次尝试,但我似乎无法使其正常运行。本教程似乎是最有前途的,但是我似乎只能让此代码返回GPS坐标0.0、0.0,这不是很有用…

getLocation()返回java.lang.NullPointerException错误似乎有些线索,但是我不确定我应该从哪里开始寻找它。

这是错误:

 W/System.err: java.lang.NullPointerException
 W/System.err:     at android.content.ContextWrapper.checkPermission(ContextWrapper.java:557)

我尝试制作一个新的权限块,粘贴在底部,但是它给出了相同的错误。

有人可以在这里指出正确的方向吗?

该代码分为两个类文件:MainActivity.java和GPSTracker.java。

GPSTracker.java

    package com.tutorial.android.location.api;

// http://www.androidhive.xyz/2016/07/android-gps-location-manager-tutorial.html
// with some modifications, especially for new permissions

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {
    private String TAG = "¤¤";
    private final Context mContext;

    public GPSTracker(Context mContext) {
        this.mContext = mContext;
        this.getLocation();
    }

    boolean isGPSEnabled = false;
    boolean isNetworkEnabled = false;
    boolean canGetLocation = false;

    Location location;
    double latitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATE = 10; // 10 meters
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 30 sec

    protected LocationManager locationManager;

    public Location getLocation() {
        try {

            if(locationManager == null) {
                locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
            }
            if(isGPSEnabled != true) {
                isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            }
            if(isNetworkEnabled != true) {
                isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            }

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no provider enabled :p
                Log.e(TAG, "getLocation() no provider :(");
            } else {
                this.canGetLocation = true;
                // get network location
                if (isNetworkEnabled) {
                    // permission block:
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_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 TODO;
                    } else {
                        Log.e(TAG, "getLocation() permission DENIED");
                    }
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATE, this);
                    if(locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // get GPS location
                if(isGPSEnabled) {
                    if(location == null) {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATE, this);
                        Log.d(TAG, "getLocation() GPS Enabled");
                        if(locationManager != null){
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if(location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "getLocation() ERROR...: " + e);
            e.printStackTrace();
        }
        return location;
    }

    public double getLatitude() {
        if(location != null) {
            latitude = location.getLatitude();
        }
        return latitude;
    }

    public double getLongitude() {
        if(location != null) {
            longitude = location.getLongitude();
        }
        return longitude;
    }

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

    @Override
    public void onLocationChanged(Location location) {

    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {
        // GPS is ON
        Log.d(TAG, "GPS is ON");
    }

    @Override
    public void onProviderDisabled(String provider) {
        // GPS is OFF
        Log.d(TAG, "GPS is OFF");
    }

    // GPS dialog
    public boolean canGetLocation() {
        return this.canGetLocation;
    }
    // don't really need this when testing
    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        alertDialog.setTitle(R.string.gps_settings_title);

        alertDialog.setMessage(R.string.gps_settings_msg);
        alertDialog.setPositiveButton(R.string.gps_settings_word, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivities(new Intent[]{intent}); // hm...
            }
        });
        alertDialog.show();
    }

    public void stopUsingGPS() {
        if(locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }
}

重写但仍无法在GPSTracker.java中工作的权限块:

int permissionCheck = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if(!(permissionCheck == PackageManager.PERMISSION_GRANTED)) {
    if(ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, Manifest.permission.ACCESS_FINE_LOCATION)) {
        // explanation :p
        Log.i(TAG, "NOpe...");
    } else {
        // request permission
        Log.d(TAG, "Requestion new permission");
        ActivityCompat.requestPermissions((Activity) mContext, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

MainActivity.java

package com.tutorial.android.location.api;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    String TAG = "¤";

    GPSTracker gps;

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

        gps = new GPSTracker(this);

        if(gps.canGetLocation()) {
            Log.i(TAG, "onCreate() GPS is ON");
            Log.i(TAG, "onCreate() " + gps.getLatitude()+ ", " + gps.getLongitude());
        } else {
            Log.d(TAG, "onCreate() GPS is OFF");
        }

    }
}

问题答案:

本教程似乎是最有前途的

这真是糟糕的代码。

我似乎只能得到此代码以返回0.0、0.0的GPS坐标,这不是很有用

那是因为,如果getLastKnownLocation()碰巧返回一个位置,它将永远只有一个位置。不太可能这样做。

重写但仍无法在GPSTracker.java中工作的权限块:

这里有两个问题:

  1. 您不能从服务请求权限。

  2. 这不是真正的服务。该代码的作者选择创建一个扩展类,Service而该扩展类没有实际实现或正确使用服务。这是造成您的原因NullPointerException,因为未正确初始化Context

有人可以在这里指出正确的方向吗?

把所有这些扔掉。

FWIW,这是我使用LocationManagerAPI的示例应用程序。

食谱很简单:

步骤#1:LocationManager通过调用getSystemService(Context.LOCATION_SERVICE)some
获得一个Context。我碰巧做了一个片段:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    template=getActivity().getString(R.string.url);
    mgr=(LocationManager)getActivity()
      .getSystemService(Context.LOCATION_SERVICE);
  }

步骤#2:调用requestUpdates(),传入实现的东西LocationListener。就我而言,这恰好是片段本身:

  @Override
  @SuppressWarnings({"MissingPermission"})
  public void onStart() {
    super.onStart();

    mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3600000,
      1000, this);
  }

步骤#3:在onLocationChanged()您的中LocationListener,对Location您得到的进行一些操作,在我的情况下,执行AsyncTask以获得天气预报:

  @Override
  public void onLocationChanged(Location location) {
    new FetchForecastTask().execute(location);
  }

步骤4:完成后致电removeUpdates()

  @Override
  @SuppressWarnings({"MissingPermission"})
  public void onStop() {
    mgr.removeUpdates(this);

    super.onStop();
  }

就是这样(除了运行时权限之类的东西,我将其抽象为AbstractPermissionsActivity)。

如果需要,可以将其getLastKnownLocation()用作 优化 ,但不要依赖它。



 类似资料:
  • 问题内容: 考虑以下Java源代码: 该是。 为什么该语句有时会抛出? 谢谢。 问题答案: 线程安全 如果您的代码是多线程的,则有可能。例如: 如果在语句执行之后(但在循环之前)立即将另一个线程设置为,则您将获得一个。通过使用访问器(与延迟初始化结合使用)可以避免这种情况。 另外,如其他人所提到的,如果可能,请避免使用有利于泛型的此类循环构造。有关详细信息,请参见其他答案。 配件提供保护 如果始终

  • 问题内容: 我正在尝试从服务器中获取数据。有时我的代码由于导致失败。这是为什么?这个问题是什么原因造成的? 问题答案: 如果在DNS服务器中发生了打cup,则可能会发生这种情况。除了使DNS服务器更强大或寻找另一台服务器之外,您还可以使用完整的IP地址代替主机名。这样,就无需根据主机名查找IP地址。但是,我宁愿解决DNS问题,也更喜欢DNS,因为IP地址可能会不时更改。

  • 我想了解为什么一段代码不会抛出NullPointerException。 请考虑以下代码: 方法被重复调用,同时以下代码在单独的线程中运行: 只有一个实例。 从不引发NullPointerException。 但是,当方法暂停时,即使暂停0毫秒,也会按预期引发NullPointerException: 我的理解是,在理论上,在检查和调用之间存在竞争条件。在实践中,如果不引入暂停(即从后续方法调用中

  • 我试图用apache 2.4配置PHP,每次我运行localhost/phpinfo.php,它都会向我显示代码。 使用的浏览器:apache服务器http pd conf文件中的chrome更改:LoadMoulesphp7_module"C:/php/php7apache2_4.dll"addHandler应用程序/x-http pd-php. php PHPIniDir"c:/php" ph

  • 我使用spring-boot(v2 M3)和Spring-WebFlux进行一个项目。在编写一个特性时,我看到我的微服务返回一个HTTP200状态代码,同时在流量中返回一个错误。 使用一个简单的异常处理程序: 我在集成测试中用webTestClient测试结果: 结果,我的测试失败了,因为返回错误通量的控制器返回的是200状态码,而不是503状态码(异常日志“test”在我的控制台中被很好地跟踪)

  • 下面的代码抛出,但我不明白为什么,该对象不是null。