Android服务locationlistener未激活

时间:2013-03-14 20:38:24

标签: android service intervals locationlistener

我已经实现了一个在启动时启动的android服务: MyService.java

package com.example.testservicelogging;

import com.example.testservicelogging.MyBroadcastReceiver;

import android.app.PendingIntent;
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 MyService extends Service implements LocationListener {

    LocationManager lm;
    PendingIntent pendingIntent;
    LocationListener locationListener;

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO do something useful
        //Toast.makeText(getBaseContext(), "Got in!!!", Toast.LENGTH_SHORT).show();
        System.out.println("Got in");

         Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();        

            //---use the LocationManager class to obtain locations data---
            lm = (LocationManager)
                    getSystemService(Context.LOCATION_SERVICE);


            Intent i = new Intent(this, MyBroadcastReceiver.class);
            pendingIntent = PendingIntent.getBroadcast(
                    this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

          //---request for location updates using GPS---
            lm.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    6000,
                    5,
                    pendingIntent);     

        return START_STICKY;
      }


    @Override
    public void onDestroy() {
        //---remove the pending intent---
        lm.removeUpdates(pendingIntent);

        super.onDestroy();
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();        
    }

    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "onLocationChanged", Toast.LENGTH_LONG).show();   

    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "onProviderDisabled", Toast.LENGTH_LONG).show();   

    }

    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "onProviderEnabled", Toast.LENGTH_LONG).show();   

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "onStatusChanged", Toast.LENGTH_LONG).show();   

    }


}

也是BroadcastReceiver类:

package com.example.testservicelogging;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;


public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {


        Intent t=new Intent(context, MyService.class);
        t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(t);

        String locationKey = LocationManager.KEY_LOCATION_CHANGED;
        String providerEnabledKey = LocationManager.KEY_PROVIDER_ENABLED;

        //Toast.makeText(context, "INSIDE!!!", Toast.LENGTH_SHORT).show(); 
        System.out.println("INSIDE");

        if (intent.hasExtra(providerEnabledKey)) {
            if (!intent.getBooleanExtra(providerEnabledKey, true)) {
                Toast.makeText(context,
                        "Provider disabled",
                        Toast.LENGTH_SHORT).show();              
            } else {
                Toast.makeText(context,
                        "Provider enabled",
                        Toast.LENGTH_SHORT).show();
            }
        }

        if (intent.hasExtra(locationKey)) {
            Location loc = (Location)intent.getExtras().get(locationKey);
            Toast.makeText(context,
                    "Location changed : Lat: " + loc.getLatitude() +
                    " Lng: " + loc.getLongitude(),
                    Toast.LENGTH_SHORT).show();



            //do something with the coordinates returned


        }

    }


}

我遇到了一些问题:

  1. (最重要的):启动时服务负载,但即使我看到GPS图标闪烁,它也永远不会返回坐标!我做错了什么?
  2. 我希望以预定义的时间间隔获取坐标(例如,每天从08:00到18:00每隔15分钟)。我该如何实现?
  3. 即使我提高了100000毫秒和500激活requestLocationUpdates的距离,它有时也会每隔2-5秒运行一次,即使我静止不动!我怎么能克服这个?
  4. 非常感谢您的帮助!!!

2 个答案:

答案 0 :(得分:1)

您正在请求位置更新,并提供应在发生位置更新时广播的PendingIntent。但是,您的服务也implements LocationListener,所以看起来您可能有点困惑。我不确定你到底想要做什么,但是开始我只是让你的服务直接得到回调。在这种情况下,您不需要BroadcastReceiver,您应该更改此内容:

//---request for location updates using GPS---
lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 6000, 5, pendingIntent);

到此:

//---request for location updates using GPS---
lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 6000, 5, this);

这会导致位置服务定期回复您已在服务类(onLocationChanged()onProviderEnabled()等中实施的方法。)

此外,您为minTime和minDistance提供的参数非常小。 minTime为6000秒为6秒,minDistance为5米。这将导致GPS不断耗尽电池,因此您可能需要重新考虑这些参数。

我建议您尝试并添加一些日志记录以查看会发生什么。我建议使用日志框架(即:Log.v()Log.e()等)并查看logcat而不是尝试使用toast。 Toast对于调试来说非常不可靠。

此外,所有设备上的位置服务实施都不同。每个制造商都提供自己的实施方案,它们在可靠性,稳健性和操作特性方面差异很大。无法在特定时间间隔或特定时间可靠地坚持GPS更新。您所能做的就是为操作系统提供合适的提示,了解您希望拥有的内容。无论您指定的参数如何,位置框架都会随时回复您。您只需要相应地了解它并编写代码。

如果您希望每15分钟获得一次更新,您可以指定15分钟的最小时间(这将是15 * 60 * 1000的值)或者您可以每隔15分钟和警报管理器安排一次唤醒警报警报响起,您可以立即请求位置更新(虽然您可能需要一些时间才能获得它们)。

希望我已经为您提供了足够的材料,以便您可以在这里取得一些进展。如果您需要更多帮助,请随时添加评论。

答案 1 :(得分:1)

确保根据您的需要将其中一个添加到清单中:

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