位置管理器显示为null

时间:2013-06-04 13:43:36

标签: android gps locationmanager locationlistener

我正在尝试跟踪我的应用程序中使用的gps位置,

这是我的代码,

public class GetGpsCoordinates extends Service implements LocationListener {

boolean isGPSEnabled ;

boolean isNetworkEnabled ;
boolean canGetLocation ;
Location location;
double latitude;
double longitude;

// The minimum distance to change Updates in meters
public static final float MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10
                                                                    // meters

// The minimum time between updates in milliseconds
public static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

private  final Context Context = GetGpsCoordinates.this;
public final android.content.Context mContext = GetGpsCoordinates.this;
LocationManager locationManager;

public Location getLocation() {
    try {
        int chkGooglePlayServices = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(Context);
        if (chkGooglePlayServices != ConnectionResult.SUCCESS) {
            GooglePlayServicesUtil.getErrorDialog(chkGooglePlayServices,
                    (Activity) mContext, 1122).show();
        } else {

            locationManager = (LocationManager) getSystemService(mContext.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();

                            }
                        }
                    }
                }
            }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

我不知道我缺少什么,变量“locationManager”显示为null。

这是我的清单文件,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bu"
android:versionCode="2"
android:versionName="2.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.bu.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:theme="@style/NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".HomeScreen"
        android:label="@string/app_name" 
         android:theme="@android:style/Theme.Light">
    </activity>

    <activity
        android:name=".PropertySearchTypes.CameraSearch"
        android:label="@string/camera_search" 
        android:screenOrientation="unspecified"/>
    <activity
        android:name=".PropertySearchTypes.MapSearch"
        android:label="@string/map_search" />
    <service
        android:name=".PropertySearchTypes.PropertyRequestService" >   

    </service>
     <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="API_KEY" />
</application>

</manifest>

这是我的logcat,

06-04 19:21:08.960: D/BatteryService(1499): update start
06-04 19:21:10.101: D/dalvikvm(16760): GC_EXPLICIT freed 17K, 49% free 2778K/5379K,  external 688K/1036K, paused 54ms
06-04 19:21:10.210: E/StatusBarPolicy(1552): ecio: 255
06-04 19:21:10.210: E/StatusBarPolicy(1552): iconLevel: 4
06-04 19:21:12.109: D/dalvikvm(18597):   JDWP invocation returning with exceptObj=0x40614540 (Ljava/lang/NullPointerException;)
06-04 19:21:12.906: D/dalvikvm(18597):   JDWP invocation returning with exceptObj=0x406146a0 (Ljava/lang/NullPointerException;)
06-04 19:21:15.265: D/dalvikvm(15818): GC_EXPLICIT freed 481K, 49% free 3529K/6791K, external 688K/1036K, paused 53ms
06-04 19:21:18.992: D/BatteryService(1499): update start
06-04 19:21:20.265: D/dalvikvm(14873): GC_EXPLICIT freed 199K, 47% free 3590K/6727K, external 688K/1036K, paused 50ms

调用另一项活动,

 protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_fragment);
    progressDialog = new ProgressDialog(MapSearch.this);

            /* getting latitude and longitude*/
    GetGpsCoordinates getgpslatlng = new GetGpsCoordinates();
    getgpslatlng.getLocation();

    Latitude = getgpslatlng.getLatitude();
    Longitude = getgpslatlng.getLongitude();
    SupportMapFragment sfm = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    map = sfm.getMap();
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    map.setMyLocationEnabled(true);
}

我添加了所有的操作。我在设备中启用了gps。即使引发异常,说“locationManager”null以及“chkGooglePlayServices”为空。我在我的设备上安装了Google Play服务。

我的代码有什么问题?请纠正我..  在此先感谢!!

3 个答案:

答案 0 :(得分:2)

这是初始化LocationManager的错误方法,

locationManager = (LocationManager) getSystemService(mContext.LOCATION_SERVICE);

您需要使用直接的Context类,而不是mContext,

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

答案 1 :(得分:2)

您正在从活动初始化服务。这不是初始化服务的正确方法。服务需要由Frameworks初始化。 因此,您的Service类没有初始化的Context。因此,对Context方法的任何调用都将失败。 所以试试这个

   GetGpsCoordinates getgpslatlng = new GetGpsCoordinates();
   getgpslatlng.getLocation(this);

public Location getLocation(Context mContext) {
//use passed Context instead of field mContext 
}

答案 2 :(得分:0)

您尚未初始化位置管理员,请使用

  

locationManager =(LocationManager)context.getSystemService(LOCATION_SERVICE);

使用locationManager之前