2011-08-18 57 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; 
} 

} 

希望这会有所帮助。