2013-07-11 10 views
79

Ich habe Probleme, meine aktuellen Position Koordinaten mit dem NETWORK-Anbieter von Android-Standort-System.Wie bekomme ich den aktuellen Standort in Android

Bereits viele Tutorials gelesen und 4 oder 5 vorhandene Klassen in mein Projekt implementiert und alle geben mir die letzten Koordinaten, aber nicht die aktuellen.

Ich bin mir ziemlich sicher, dass das Problem etwas Grundlegendes ist, das ich vermisse, aber ich bin nicht in der Lage zu verstehen, was genau es ist.

Codes Ich verwende jetzt:

Das ist meine Hauptaktivität

package com.example.locationtests; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    GPSTracker mGPS = new GPSTracker(this); 

    TextView text = (TextView) findViewById(R.id.texts); 
    if(mGPS.canGetLocation){ 
    mGPS.getLocation(); 
    text.setText("Lat"+mGPS.getLatitude()+"Lon"+mGPS.getLongitude()); 
    }else{ 
     text.setText("Unabletofind"); 
     System.out.println("Unable"); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

Dies ist die Klasse I für Tracking-bin mit:

package com.example.locationtests; 

import android.app.AlertDialog; 
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.provider.Settings; 
import android.util.Log; 

public final class GPSTracker implements LocationListener { 

    private final Context mContext; 

    // flag for GPS status 
    public boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    // flag for GPS status 
    boolean canGetLocation = false; 

    Location location; // location 
    double latitude; // latitude 
    double longitude; // longitude 

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

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

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

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

    /** 
    * Function to get the user's current location 
    * 
    * @return 
    */ 
    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(Context.LOCATION_SERVICE); 

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

      Log.v("isGPSEnabled", "=" + isGPSEnabled); 

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

      Log.v("isNetworkEnabled", "=" + isNetworkEnabled); 

      if (isGPSEnabled == false && isNetworkEnabled == false) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        location=null; 
        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) { 
        location=null; 
        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; 
    } 

    /** 
    * 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(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

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

} 

Das ist mein AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.locationtests" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.location" android:required="true" /> 
    <uses-feature android:name="android.hardware.location.gps" android:required="false" /> 

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

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

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

</manifest> 

Acctualy GPS possitioning funktioniert gut, aber NETWORK Positionierung dosn't. Wenn Ive gedreht Geräte GPS auf cordinates während im Bewegungs ständig ändern, aber dosnt happence gleich, wenn ich es habe ausgeschaltet und das Relais auf der NETWORK_PROVIDER

+0

überprüfen Sie diese http://developer.android.com/training/location/retrieve-current.html – OMAK

+1

Der einfachste Weg ist, eine höhere Bibliothek wie folgt zu verwenden: https://github.com/delight-im/Android-SimpleLocation – caw

+0

gibt es eine einfache lib, dies zu tun ...... sehr einfach zu implementieren ..haben einen Blick https://github.com/Gaganjdeep/GetMyLocationLIbrary.git ODER http://shortcutsandroid.blogspot.in/2016/03/get-current-location-in -activity-in.html –

Antwort

107

Zuerst eine LocationListener definieren müssen Standortänderungen zu handhaben.

private final LocationListener mLocationListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(final Location location) { 
     //your code here 
    } 
}; 

erhalten dann die LocationManager und fragen Sie nach Standortaktualisierungen

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, 
      LOCATION_REFRESH_DISTANCE, mLocationListener); 
} 

Und schließlich stellen Sie sicher, dass Sie die Berechtigung für das Manifest hinzugefügt haben,

Für die Verwendung von nur Netzwerk-basierten Standort dieses verwenden

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

Für GPS-basierte Position, diese

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
+0

Acctualy GPS possitioning funktioniert gut, aber NETWORK Positionierung nicht. Wenn Ive Geräte gedreht GPS auf Kordinaten ändern sich während des Bewegens, aber Dosnt Geschehen gleich, wenn ich es ausschalten –

+4

Denken Sie daran, dass die Präzision zwischen GPS-und NETWORK-basierten Standort ist wirklich groß. Gestern habe ich es getestet, während ich den Bus bewegt habe, gab das GPS eine Genauigkeit von 3-5 Metern und das NETWORK wie 1Km. Also steigen Sie in einen Bus/Auto und sehen Sie den Unterschied zwischen diesen beiden. – Axxiss

+7

@Axxiss wie erhalten Sie LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mLocationListener); – Amitsharma

9

Sie müssen Code schreiben, in der Methode OnLocationChanged, weil diese Methode aufgerufen, wenn sich der Standort geändert hat. I.e. Sie müssen den neuen Speicherort speichern, um ihn zurückzugeben, wenn getLocation aufgerufen wird.

Wenn Sie nicht die onLocationChanged verwenden, wird es immer der alte Speicherort sein.

2

Ich benutze this tutorial und es funktioniert gut für meine Anwendung.

In meiner Tätigkeit habe ich diesen Code:

GPSTracker tracker = new GPSTracker(this); 
    if (!tracker.canGetLocation()) { 
     tracker.showSettingsAlert(); 
    } else { 
     latitude = tracker.getLatitude(); 
     longitude = tracker.getLongitude(); 
    } 

auch überprüfen, ob Ihr Emulator läuft mit Google API

+22

Was ist GPSTracker hier? –

+20

Flip die if pleassse – pomber

+1

was ist der Vorteil des Umdrehens der "wenn"? – drulabs

Verwandte Themen