2012-07-04 31 views
0

我正在开发小型Android应用程序,我在其中查找用户当前位置。 我的用于检测用户位置的代码结构看起来像。无法检测到用户在Android设备上的当前位置

private void sendSMS(Context context, Intent intent) 
{ 
    final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters 
    final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds 

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

    locationManager.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 
    MINIMUM_TIME_BETWEEN_UPDATES, 
    MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
    new MyLocationListener() 
    ); 

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    String loc_message = null; 

    if (location != null) 
    { 
    loc_message =String.format(
     "Current Location \n Longitude: %1$s \n Latitude: %2$s", 
     location.getLongitude(), location.getLatitude() 
    ); 
    Toast.makeText(context, loc_message,Toast.LENGTH_LONG).show(); 
    } 
} 
private class MyLocationListener implements LocationListener { 

     public void onLocationChanged(Location location) { 
     String message = String.format(
       "New Location \n Longitude: %1$s \n Latitude: %2$s", 
       location.getLongitude(), location.getLatitude() 
     ); 
    } 

    public void onStatusChanged(String s, int i, Bundle b) { 

    } 

    public void onProviderDisabled(String s) { 
    } 

    public void onProviderEnabled(String s) { 
    } 
    } 
} 

在我从DDMS发送坐标的模拟器上正常工作。但是当我在设备上运行它不会给我输出。在我的设备上,我保持使用GPS卫星启用。但是当我试图找到用户的位置它没有给任何输出....需要帮助...谢谢.......

+0

请注意,根据您的位置获取GPS坐标可能需要几分钟的时间,但如果您的手机看不到足够的卫星,则根本无法获得定位。这可能是因为你在室内,或者因为天气不好。我建议你要耐心,也最好是在活动的'onCreate(...)'方法中注册LocationListener,并在'onDestroy(...)'中注销它。继续检查LogCat中的日志,你将能够发现你是否得到了修复。 –

+0

哪个真正的设备,你正在使用我,E哪些公司..........因为一些中国标签不支持GPS,而你必须使用网络或WiFi提供商的....... ..... –

+0

谢谢你的答复。我使用samsunge(android 2.1)。 – nilkash

回答

1

这里是GPS的骨架Service我用我的跟踪应用程序,它已经过测试,并且工作正常,我可以保证。我希望它能帮助你。

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Notification; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.preference.PreferenceManager; 
import android.util.Log; 

public class TrackingService extends Service { 
    private static final String TAG = TrackingService.class.getSimpleName(); 

    private static final long TIME_BETWEEN_UPDATES = 1000L; 
    private static final long MINIMUM_DISTANCE_CHANGE = 0L; 

    private WakeLock mWakeLock; 

    private LocationManager mLocationManager; 

    private final Timer mTimer = new Timer(); 
    private Handler mHandler = new Handler(); 

    private LocationListener mLocationListenerGps = new LocationListener() { 

     public void onLocationChanged(Location location) { 
      // Your code here 
     } 

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

     public void onProviderEnabled(String provider) { 
     } 

     public void onProviderDisabled(String provider) { 
     } 
    }; 

    private void registerLocationListener() { 
     if (mLocationManager == null) { 
      Log.e(TAG, "TrackingService: Do not have any location manager."); 
      return; 
     } 
     Log.d(TAG, "Preparing to register location listener w/ TrackingService..."); 
     try { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE, mLocationListenerGps); 
      Log.d(TAG, "...location listener now registered w/ TrackingService @ " + TIME_BETWEEN_UPDATES); 
     } catch (RuntimeException e) { 
      Log.e(TAG, "Could not register location listener: " + e.getMessage(), e); 
     } 
    } 

    private void unregisterLocationListener() { 
     if (mLocationManager == null) { 
      Log.e(TAG, "TrackingService: Do not have any location manager."); 
      return; 
     } 
     mLocationManager.removeUpdates(mLocationListenerGps); 
     Log.d(TAG, "Location listener now unregistered w/ TrackingService."); 
    } 

    private TimerTask mCheckLocationListenerTask = new TimerTask() { 
     @Override 
     public void run() { 
      mHandler.post(new Runnable() { 
       public void run() { 
        Log.d(TAG, "Re-registering location listener with TrackingService."); 
        unregisterLocationListener(); 
        registerLocationListener(); 
       } 
      }); 
     } 
    }; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

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

     registerLocationListener(); 

     mTimer.schedule(mCheckLocationListenerTask, 1000 * 60 * 5, 1000 * 60); 

     acquireWakeLock(); 

     Log.d(TAG, "Service started..."); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     handleStartCommand(intent, startId); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handleStartCommand(intent, startId); 
     return START_STICKY; 
    } 

    private void handleStartCommand(Intent intent, int startId) { 
     Notification notification = new Notification(R.drawable.ic_launcher, 
       getText(R.string.trackingservice_notification_rolling_text), 
       System.currentTimeMillis()); 

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       new Intent(this, MainActivity.class), 
       PendingIntent.FLAG_UPDATE_CURRENT); 

     notification.setLatestEventInfo(this, 
       getText(R.string.trackingservice_notification_ticker_title), 
       getText(R.string.trackingservice_notification_ticker_text), 
       contentIntent); 

     startForeground(1, notification); 
    } 

    @Override 
    public void onDestroy() { 
     stopForeground(true); 
     mTimer.cancel(); 
     mTimer.purge(); 
     mHandler.removeCallbacksAndMessages(null); 
     unregisterLocationListener(); 
     releaseWakeLock(); 
     super.onDestroy(); 
     Log.d(TAG, "Service stopped..."); 
    } 

    private void acquireWakeLock() { 
     try { 
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      if (pm == null) { 
       Log.e(TAG, "TrackRecordingService: Power manager not found!"); 
       return; 
      } 
      if (mWakeLock == null) { 
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
       if (mWakeLock == null) { 
        Log.e(TAG, "TrackRecordingService: Could not create wake lock (null)."); 
        return; 
       } 
      } 
      if (!mWakeLock.isHeld()) { 
       mWakeLock.acquire(); 
       if (!mWakeLock.isHeld()) { 
        Log.e(TAG, "TrackRecordingService: Could not acquire wake lock."); 
       } 
      } 
     } catch (RuntimeException e) { 
      Log.e(TAG, "TrackRecordingService: Caught unexpected exception: " 
        + e.getMessage(), e); 
     } 
    } 

    /** 
    * Releases the wake lock if it's currently held. 
    */ 
    private void releaseWakeLock() { 
     if (mWakeLock != null && mWakeLock.isHeld()) { 
      mWakeLock.release(); 
      mWakeLock = null; 
     } 
    } 
} 

而在你的AndroidManifest.xml文件,你需要

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

只需填写GPS位置监听器,在您的AndroidManifest.xml注册服务,从活动启动该服务,并享受。

+0

谢谢你的答复..在我的代码,如果我使用网络作为位置提供商,那么它的工作很好。但如果我使用gps作为网络提供商,它不提供任何输出。任何建议..谢谢你的答案。我也会尝试你的答案。 – nilkash

0

Nilkash,我经历了同样的问题在我的三星Galaxy 5

我得到了我的问题解决了,因为你的建议更改为网络供应商。感谢那个好友。我得到了解决方案。

“网络提供商”根据小区塔和WiFi接入点的可用性确定位置。通过网络查找检索结果。需要android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION的权限。

但“GPS提供者”使用卫星确定位置。根据条件,此提供程序可能需要一段时间才能返回定位修复。需要权限android.permission.ACCESS_FINE_LOCATION。

这是设备的问题,我们的设备不支持没有互联网的GPS它只使用位置提供商。

相关问题