2011-08-18 58 views
1

我試圖創建一個android程序,不斷(每分鐘)獲取gps位置,然後將其發送到我的服務器在家裏(以便我總是知道我的手機在哪裏)。 我創建了一個啓動按鈕,一個圖形用戶界面,其啓動服務:在Android的gps監控服務

start.setOnClickListener(new View.OnClickListener() { 
     synchronized public void onClick(View v) { 
      startService(new Intent(GpsTest2.this, GTService.class)); 
     } 
}); 

然後,我的服務聲明如下:

public class GTService extends Service implements LocationListener { 
} 

這GTService具有檢索數據的方法:

public void onLocationChanged(Location location) { 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    LocationManager locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, interval * 1000, minDist, this); 
} 

在AndroidManifest.xml中我有:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <service android:name=".GTService"> 
    </service> 

這似乎不起作用:沒有數據記錄。 我在這裏做錯了什麼?

+0

你在你的onLocationChanged方法中設置了一個斷點並調試瞭解它何時被調用?還要確保GPS已啓用。 – Jack

+0

它永遠不會被調用,那就是問題:-)我也在使用永遠可用的網絡提供商 –

+0

您使用的是真實設備還是AVD? – Jack

回答

1

你的代碼似乎您正在使用LocationManager.NETWORK_PROVIDER

locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, interval * 1000, minDist, this); 

在哪裏,因爲它應該是LocationManager.GPS_PROVIDER

locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2 * 1000, 10, locationListener); 

希望這一定會爲你做的工作正常,除了這個,

。謝謝。

+1

奇怪,它的工作原理。我使用網絡提供商,因爲這也適用於gps關閉時,儘管分辨率較低。 –

+0

我以爲NETWORK_PROVIDER是錯誤的,這將使用WiFi,他沒有權限在他的清單(ACCESS_COARSE_LOCATION)。 GPS_PROVIDER很好,GPS提供商,需要ACCESS_FINE_LOCATION。 – Jack

+0

那現在問題解決了嗎? –

0

來自網絡供應商的位置不準確。請使用GPS代替。如果你真的想用戶僅限於網絡,那麼我會recomond設置minDistance纔會PARAM爲0

0

下應該可以正常工作,

清單:

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

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

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

    <service android:name=".GTService" /> 
</application> 

GTService:

import android.app.Service; 
import android.content.Context; 
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.widget.Toast; 

public class GTService extends Service implements LocationListener { 
LocationManager locMgr; 
@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate(){ 
    super.onCreate(); 
    locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1 * 1000, 0, this); 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    locMgr.removeUpdates(this); 
} 

@Override 
public void onLocationChanged(Location loc) { 
    Toast.makeText(getBaseContext(), String.valueOf(loc.getLatitude()) + "\n" + String.valueOf(loc.getLongitude()), Toast.LENGTH_SHORT).show(); 

} 

@Override 
public void onProviderDisabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
    // TODO Auto-generated method stub 

} 

} 

MainActivity:

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity { 

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

    Button btnStart = (Button)findViewById(R.id.btnStart); 
    btnStart.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      startService(new Intent(MainActivity.this,GTService.class)); 
     } 

    }); 
} 

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

} 

希望這會有所幫助。