2012-07-04 3 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 может занять до нескольких минут в зависимости от вашего местоположения, также возможно, что вы не получите исправления местоположения вообще, если ваш телефон не может видеть достаточно спутников. Это может быть из-за вас в помещении или из-за плохой погоды. Я советую вам проявить терпение, также было бы лучше, зарегистрировать свой локатор LocationListener внутри метода 'onCreate (...)' вашей деятельности и отменить его в 'onDestroy (...)'. Продолжайте проверять свои журналы в LogCat, вы сможете узнать, есть ли у вас исправление или нет. –

+0

какие настоящие устройства вы используете i, e какая компания из них .......... потому что какая-то китайская вкладка не поддерживает gps, в то время как для этого вам необходимо использовать сетевой или Wi-Fi-провайдер ... ..... –

+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

Спасибо за ответ. В моем коде, если я использую Network в качестве провайдера местоположения, тогда он работает отлично. Но если я использую gps как сетевой провайдер, он не дает никакого выхода. Любое предложение .. спасибо за ваш ан. Я попробую ваш ответ. – nilkash

0

Nilkash, я испытал те же проблемы на моем Samsung Galaxy 5.

я получил моя проблема решена из-за вашего предложения, чтобы изменить в сети провайдера. Спасибо за это Бадди. Я получил решение.

«Поставщик сети» определяет местоположение на основе доступности точек сотовой связи и точек доступа WiFi. Результаты извлекаются с помощью сетевого поиска. Требуется либо разрешение android.permission.ACCESS_COARSE_LOCATION, либо android.permission.ACCESS_FINE_LOCATION.

Но «GPS-провайдер» определяет местоположение с использованием спутников. В зависимости от условий этот провайдер может занять некоторое время, чтобы вернуть исправление местоположения. Требуется разрешение android.permission.ACCESS_FINE_LOCATION.

Это проблема с устройством, наше устройство не поддерживает gps без Интернета, он использует только поставщика услуг.

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