简体   繁体   English

定位服务未发送响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM