2013-09-21 103 views
0

Accesing GPS定位錯誤我試圖讓GPS的位置,但它顯示了以下錯誤在Android

09-21 16:01:57.316: E/AndroidRuntime(8775): FATAL EXCEPTION: main 
09-21 16:01:57.316: E/AndroidRuntime(8775): java.lang.NullPointerException 
"09-21 16:01:57.316: E/AndroidRuntime(8775): at com.mgrs.converter.pro.Geocoord.getLocation(Geocoord.java:26)" 

我試圖修復它,但我不知道如何糾正它。

請幫助

MainActivity.java

public class MainActivity extends Activity { 

    TextView site1_lat, site1_lon, site2_lat, site2_lon, distance_kilo, distance_miles, azimuth1_content, azimuth2_content; 
    TextView current_lat, current_lon, current_mgrs_result; 
    Variables vari; 

    //for geoCoord 
    //Context mContext; 
    LocationManager mLocMan; 
    String mProvider; 
    //Location location; 
    Context context; 

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

     //for geoCoord 
     //mLocMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     //mProvider = mLocMan.getBestProvider(new Criteria(), true); 
     //LocationListener mListener = new Geocoord(); 

     //mLocMan.requestLocationUpdates(mProvider, 6000, 10, mListener); 
     // 

    //Button 0 
    Button btn = (Button)findViewById(R.id.btn); 
    btn.setOnClickListener(new Button.OnClickListener() { 
    public void onClick(View v) { 
     //1st site 
     EditText mgrs_site1 = (EditText)findViewById(R.id.editText1); 
     String site1 = mgrs_site1.getText().toString().toUpperCase(); 

     Converter converter = new Converter(); 
     Geocoord geocoord = new Geocoord(); 
     geocoord.getLocation(context); 

     converter.MGRStoUTM(site1); 

     ///get Lat, Longitude 
     site1_lat = (TextView)findViewById(R.id.site1_lat); 
     site1_lon = (TextView)findViewById(R.id.site1_lon);  
     site1_lat.setText(String.format("%6f", converter.getinitLat())); 
     site1_lon.setText(String.format("%6f", converter.getinitLon())); 

     //2nd site 
     EditText mgrs_site2 = (EditText)findViewById(R.id.editText2); 
     String site2 = mgrs_site2.getText().toString().toUpperCase(); 
     converter.MGRStoUTM(site2); 

     ///get Lat, Longitude 
     site2_lat = (TextView)findViewById(R.id.site2_lat); 
     site2_lon = (TextView)findViewById(R.id.site2_lon);  
     site2_lat.setText(String.format("%6f", converter.getinitLat())); 
     site2_lon.setText(String.format("%6f", converter.getinitLon())); 

     //current Lat, Longitude 
     current_lat = (TextView)findViewById(R.id.current_lat); 
     current_lon = (TextView)findViewById(R.id.current_lon); 

     current_lat.setText(String.format("%6f", converter.getLatitude())); 
     current_lon.setText(String.format("%6f", converter.getLongitude())); 

     //get current MGRS 
     String str; 
     converter.LLtoMGRS(converter.getLatitude(),converter.getLongitude(),10); 
     str=converter.getMGRS(); 
     System.out.println("MGRS result"); 
     System.out.println(str); 

     current_mgrs_result = (TextView)findViewById(R.id.current_mgrs_result); 
     current_mgrs_result.setText(str); 


    } 
    }); //ends button0 

    //Button 1 

    }//ends onCreate 

}//ends Activity 

Geocoord.java

public class Geocoord { 
    Variables vari; 
    Context mContext; 
    LocationManager mLocMan; 
    String mProvider; 

    double latitude; 
    double longitude; 


    public void getLocation(Context context){ 
     mContext = context; 
     mLocMan = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
     mProvider = mLocMan.getBestProvider(new Criteria(), true); 
     mLocMan.requestLocationUpdates(mProvider, 6000, 10, mListener); 

    } 

     LocationListener mListener =new LocationListener(){ 
      public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 
      setLatitude(latitude); 
      setLongitude(longitude); 
      } 

     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 
      System.out.println("provider disabled"); 

     } 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 
      System.out.println("provider enabled"); 

     } 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 
      System.out.println("status changed"); 
     } 


    }; 


    public void setLatitude(double gps_latitude) 
    {vari.gps_latitude = gps_latitude;} 
    public void setLongitude(double gps_longitude) 
    {vari.gps_longitude = gps_longitude;} 

    public double getLatitude() 
    {return vari.gps_latitude;} 
    public double getLongitude() 
    {return vari.gps_longitude;} 


} 
+0

你可以發佈完整的trace.are你使用設備還是模擬器? – Harshid

+0

Geocoord.java的第26行是什麼 –

回答

0

嘗試使用此GPS類,這是對你更好。

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
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.util.Log; 

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 

    // flag for GPS status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    // flag for GPS status 
    boolean canGetLocation = false; 

    Location location = null; // location 
    double latitude; // latitude 
    double longitude; // longitude 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

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

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

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

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

      // 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 
//    this.canGetLocation = false; 
      } 

      else { 
       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "Network Enabled"); 
        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", "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; 
    } 

    /** 
    * Stop using GPS listener Calling this function will stop using GPS in your 
    * app 
    * */ 
    public void stopUsingGPS() { 
     if (locationManager != null) { 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    /** 
    * Function to get latitude 
    * */ 
    public double getLatitude() { 
     if (location != null) { 
      latitude = location.getLatitude(); 
     } 

     // return latitude 
     return latitude; 
    } 

    /** 
    * Function to get longitude 
    * */ 
    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 

     // return longitude 
     return longitude; 
    } 

    /** 
    * Function to check GPS/wifi enabled 
    * 
    * @return boolean 
    * */ 
    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 

    /** 
    * Function to show settings alert dialog On pressing Settings button will 
    * lauch Settings Options 
    * */ 
    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     // Setting Dialog Title 
     alertDialog.setTitle("GPS is settings"); 

     // Setting Dialog Message 
     alertDialog 
       .setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         Intent intent = new Intent(
           Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         mContext.startActivity(intent); 
        } 
       }); 

     // on pressing cancel button 
     alertDialog.setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 


    public void onLocationChanged(Location location) { 
    } 


    public void onProviderDisabled(String provider) { 
    } 


    public void onProviderEnabled(String provider) { 
    } 


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


    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 
+0

它仍然顯示錯誤(它不能正常工作) – user1349407

+0

相同的NullPointerException? –

+0

你在哪裏運行這個項目?模擬器/設備? –

0

NPE是這個東西的常見問題,請嘗試下面的代碼,我張貼。

記住GPS需要時間來加載,所以你可能需要重試3-4次,還要確保你在你的mainfest

public Location getLocation() { 
try { 
    locationManager = (LocationManager) mContext 
      .getSystemService(LOCATION_SERVICE); 

    // 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; 
     if (isNetworkEnabled) { 
      locationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 
        MIN_TIME_BW_UPDATES, 
        MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
      Log.d("Network", "Network Enabled"); 
      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", "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; 

}

的代碼添加必要的權限,工作了我希望它也適用於你

0

你通過Geocoord.getLocation(上下文)傳遞一個上下文。但是這個上下文從不初始化,並且爲空。

傳遞活動的this指針像這樣:

btn.setOnClickListener(new Button.OnClickListener() { 
public void onClick(View v) { 
    //1st site 
    EditText mgrs_site1 = (EditText)findViewById(R.id.editText1); 
    String site1 = mgrs_site1.getText().toString().toUpperCase(); 

    Converter converter = new Converter(); 
    Geocoord geocoord = new Geocoord(); 
    geocoord.getLocation(MainActivity.this); // use the MainActivitys context 
    ... 
} 
} 

現在你可以在你的活動擺脫語境場和NPE應該消失。