2014-02-21 13 views
1

Я создаю приложение, чтобы найти текущее местоположение пользователей. Я ссылался на эту ссылку What is the simplest and most robust way to get the user's current location on Android?Местоположение Android не отображается на реальном устройстве

для создания моего приложения. . Моя проблема: я попытался с обоими провайдерами, но не обнаружил каких-либо поставщиков, и результат всегда равен нулю = null. Почему эта проблема и как я могу получить местоположение в своем телефоне? Спасибо заранее ...

Мой код идет здесь Это класс MyLocation.java

package com.example.locationupadates; 

import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.util.Log; 

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 
    LocationResult locationResult; 
    boolean gps_enabled=false; 
    boolean network_enabled=false; 

    public boolean getLocation(Context context, LocationResult result) 
    { 
     //I use LocationResult callback class to pass location value from MyLocation to user code. 
     locationResult=result; 
     if(lm==null) 
      lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

     //exceptions will be thrown if provider is not permitted. 
     try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     Log.v("Ansar",""+"Network Enabled");}catch(Exception ex){} 
     try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     Log.v("Ansar",""+"Network Enabled");}catch(Exception ex){} 

     //don't start listeners if no provider is enabled 
     if(!gps_enabled && !network_enabled){ 
      Log.v("Ansar",""+"Not anything Enabled"); 
      return false; 
     } 
     if(gps_enabled){ 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
      Log.v("Ansar",""+"Location Listener Gps"); 
     } if(network_enabled){ 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
      Log.v("Ansar",""+"Location Listener Network"); 
     } timer1=new Timer(); 
     timer1.schedule(new GetLastLocation(), 20000); 
     return true; 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerNetwork); 
      Log.v("Ansar",""+location.getLongitude()); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    LocationListener locationListenerNetwork = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerGps); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    class GetLastLocation extends TimerTask { 
     @Override 
     public void run() { 
      lm.removeUpdates(locationListenerGps); 
      lm.removeUpdates(locationListenerNetwork); 

      Location net_loc=null, gps_loc=null; 
      if(gps_enabled) 
       gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if(network_enabled) 
       net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      //if there are both values use the latest one 
      if(gps_loc!=null && net_loc!=null){ 
       if(gps_loc.getTime()>net_loc.getTime()) 
        locationResult.gotLocation(gps_loc); 
       else 
        locationResult.gotLocation(net_loc); 
       return; 
      } 

      if(gps_loc!=null){ 
       locationResult.gotLocation(gps_loc); 
       return; 
      } 
      if(net_loc!=null){ 
       locationResult.gotLocation(net_loc); 
       return; 
      } 
      locationResult.gotLocation(null); 
     } 
    } 

    public static abstract class LocationResult{ 
     public abstract void gotLocation(Location location); 
    } 
} 

MainActivity.java

package com.example.locationupadates; 

import android.app.Activity; 
import android.location.Location; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.TextView; 

import com.example.locationupadates.MyLocation.LocationResult; 

public class MainActivity extends Activity { 
    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv=(TextView) findViewById(R.id.tv); 
     Log.d("Ansar",""+"oncreate"); 
     LocationResult locationResult = new LocationResult(){ 
      @Override 
      public void gotLocation(Location location){ 
       Log.v("Ansar",""+location.getLongitude()); 
       tv.setText("location:"+location+"latitude: "+location.getLatitude()+"longitude "+location.getLongitude()); 
      } 
     }; 
     MyLocation myLocation = new MyLocation(); 
     myLocation.getLocation(this, locationResult); 

    } 

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

} 

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.locationupadates" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="18" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.locationupadates.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> 

Exception

02-21 11:39:05.963: W/dalvikvm(18909): threadid=11: thread exiting with uncaught exception (group=0x410e4390) 
02-21 11:39:05.963: E/AndroidRuntime(18909): FATAL EXCEPTION: Timer-0 
02-21 11:39:05.963: E/AndroidRuntime(18909): java.lang.NullPointerException 
02-21 11:39:05.963: E/AndroidRuntime(18909): at com.example.locationupadates.MainActivity$1.gotLocation(MainActivity.java:23) 
02-21 11:39:05.963: E/AndroidRuntime(18909): at com.example.locationupadates.MyLocation$GetLastLocation.run(MyLocation.java:102) 
02-21 11:39:05.963: E/AndroidRuntime(18909): at java.util.Timer$TimerImpl.run(Timer.java:284) 
02-21 11:39:05.963: W/dalvikvm(18909): threadid=11: thread exiting with uncaught exception (group=0x410e4390) 
02-21 11:39:05.963: E/AndroidRuntime(18909): FATAL EXCEPTION: Timer-0 
02-21 11:39:05.963: E/AndroidRuntime(18909): java.lang.NullPointerException 
02-21 11:39:05.963: E/AndroidRuntime(18909): at com.example.locationupadates.MainActivity$1.gotLocation(MainActivity.java:23) 
02-21 11:39:05.963: E/AndroidRuntime(18909): at com.example.locationupadates.MyLocation$GetLastLocation.run(MyLocation.java:102) 
02-21 11:39:05.963: E/AndroidRuntime(18909): at java.util.Timer$TimerImpl.run(Timer.java:284) 
+2

Вы можете вставить код с Manifest.xml и журнал ошибок, если таковые имеются. – Kedarnath

+0

Вопрос, отредактированный с кодом – Ansar

+0

попробуйте добавить эти разрешения ' ' – Kedarnath

ответ

0

Попробуйте ниже класса .... Я думаю, что поможет вам ...

добавить главный acivity ...

GPSTracker GPS = новый GPSTracker (ActivityNearBy.this);

if (gps.canGetLocation()) { 
    latitude = gps.getLatitude(); 
    longitude = gps.getLongitude(); 
} 

услуги GPS

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

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

/** 
* 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 IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

} 

public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 

public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onRebind(Intent intent) { 
    // TODO Auto-generated method stub 
    super.onRebind(intent); 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    // TODO Auto-generated method stub 
    return super.onUnbind(intent); 
} 

public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 
}} 

обновление manifest.xml

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

Я пробовал этот код. На самом деле этот код отлично работает на эмуляторе, но не на устройстве. – Ansar

+0

, пожалуйста, обновите библиотеку магазина игр и PLZ, убедитесь, что GPS включен или нет. –

+0

этот код работает нормально в режиме реального времени в игровом магазине (приложение cqpon) –

Смежные вопросы