[英]Location Service doesn't send the response
I want to check the device position. 我要检查设备位置。 So, I made a service called GeoService that you pass it an intent, and it send you the response. 因此,我创建了一个名为GeoService的服务,您将其传递给它一个意图,然后它将响应发送给您。 The point is that the response never go back, and I don't know why. 关键是响应永远都不会退缩,我也不知道为什么。
public class GeoService extends IntentService implements LocationListener{
public static final int GET_DATA=1;
public static final int LOCATION_ACTUALIZED=2;
private static int WAITING_TIME=90000;
private static LocationManager locationManager;
private static Location place=null;
private static ResultReceiver recev=null;
public GeoService() {
super("GeoService");
}
@Override
public void onCreate(){
super.onCreate();
locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
}
@Override
protected void onHandleIntent(Intent intent) {
int command=intent.getIntExtra("CMD", -1);
Bundle bun=new Bundle();
switch(command){
case GeoService.GET_DATA:{
ResultReceiver receiver=intent.getParcelableExtra("receiver");
getGeoData(receiver,bun);
break;
}
case GeoService.LOCATION_ACTUALIZED:{
if(recev!=null){
double longi=intent.getDoubleExtra("longitude", -1);
double lati=intent.getDoubleExtra("latitude", -1);
long utcT=intent.getLongExtra("utc", -1);
bun.putDouble("longitude", longi);
bun.putDouble("latitude", lati);
bun.putLong("utc", utcT);
Log.d("geoService","sending response");
recev.send(ConstantsIntents.STATUS_OK, bun);
}
}
default:{
ResultReceiver receiver=intent.getParcelableExtra("receiver");
receiver.send(ConstantsIntents.INVALID_COMMAND, bun);
}
}
}
protected void getGeoData(ResultReceiver receiver, Bundle b){
int elapsedTime=WAITING_TIME;
recev=receiver;
}
@Override
public void onLocationChanged(Location location) {
Log.d("geoService","onLocationChanged");
Intent inte= new Intent(getBaseContext(), GeoService.class);
inte.putExtra("CMD", GeoService.LOCATION_ACTUALIZED);
inte.putExtra("longitude", location.getLongitude());
inte.putExtra("latitude", location.getLatitude());
inte.putExtra("utc", location.getTime());
place=location;
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1, this);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
The code above has some methods without implementation because I don't need to implement them but I need them (or it won't compile). 上面的代码有一些没有实现的方法,因为我不需要实现它们,但是我需要它们(否则它将无法编译)。 And this it is the MainActivity when I call the service: 这是我调用服务时的MainActivity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent(Intent.ACTION_SYNC,null,this,GeoService.class);
intent.putExtra("CMD", GeoService.GET_DATA);
intent.putExtra("receiver",new ResultReceiver(new Handler()){
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
Log.d(TAG,"Response received");
if (resultCode == ConstantsIntents.STATUS_OK) {
double latitud=resultData.getDouble("latitude");
double longitud=resultData.getDouble("longitude");
long utc=resultData.getLong("utc");
}
}
});
startService(intent);
}
And here it's the manifest file 这是清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hikokibest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="hikoki.services.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="hikoki.services.FlightStatusService"></service>
<service android:enabled="true" android:name="hikoki.services.NotificationsService"></service>
<service android:name="hikoki.services.ExperiencesService"></service>
<service android:name="hikoki.services.FlightDealService"></service>
<service android:name="hikoki.services.GeoService"></service>
</application>
By the way, thanks! 顺便说一句,谢谢! Cheers! 干杯!
So that this question has an answer, and to provide more information for anyone finding this... check this Stackoverflow question . 为了使该问题有答案,并为发现此问题的任何人提供更多信息,请检查此Stackoverflow问题 。
The solution in this case was needing to send a location to the emulator. 在这种情况下,解决方案是需要将位置发送到仿真器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.