Question

I am trying to track the gps location to be used in my application,

Here is my code,

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;
}

I dont know what I am missing, the variable "locationManager" is shown as null.

This is my manifest file,

<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>

this is my 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

calling in another activity,

 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);
}

I have added all th epermissions. I enabled the gps in my device. Even though an exception is raised saying that "locationManager" null and also "chkGooglePlayServices" is null. I ma having Google play services installed in my device.

What's wrong in my code? Please correct me.. Thanks in advance!!

Was it helpful?

Solution

You are initializing a Service from an Activity. This is not the right method to initialize a Service. Service needs to be initialized by Frameworks. So your Service class does not have a initialized Context. So any calls to methods of Context will fail. So try this

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

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

OTHER TIPS

This is a wrong way to Initialize LocationManager,

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

Instead of mContext you need to use direct Context class as below,

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

you have not initialized locationmanager, please use

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

before using locationManager

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top