在android appwidget中实现位置监听器时出现问题

时间:2009-11-26 06:23:52

标签: android gps android-widget listener

我正在开发一个Widget,它将获取当前GPS位置并将此值传递给远程PHP页面以获取信息并将其显示在Widget中。这就是我想要做的。

我在为appWidget实现Location Listener时遇到了问题。它不是用当前位置更新它显示初始小部件,即“加载小部件”(这里我把这个文本)

我们可以为AppWidgetProvider实现位置监听器吗?
  或
  您能否建议我在App Widget中获取GPS位置的可能解决方案?

我在Manifest文件中放置了所有必要的权限 这是我的代码片段:

public class test extends AppWidgetProvider {
static LocationManager locMan;
static Location curLocation;
static Boolean locationChanged;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    // To prevent any ANR timeouts, we perform the update in a service
    context.startService(new Intent(context, UpdateService.class));
}

public static class UpdateService extends Service {
    // GPS Listener Class
    LocationListener gpsListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Log.w("GPS", "Started");
            if (curLocation == null) {
                curLocation = location;
                locationChanged = true;
            }

            if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude())
                locationChanged = false;
            else
                locationChanged = true;

            curLocation = location;

            if (locationChanged) 
                locMan.removeUpdates(gpsListener);

        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {
            // Log.w("GPS", "Location changed", null);
        }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            if (status == 0)// UnAvailable
            {

            } else if (status == 1)// Trying to Connect
            {

            } else if (status == 2) {// Available

            }
        }

    };

    // In service start method, I am registering for GPS Updates
    @Override
    public void onStart(Intent intent, int startId) {

        locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
        } else {
            this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
        }

        if (curLocation != null) {
            double lat = curLocation.getLatitude();
            double lng = curLocation.getLongitude();
            Toast.makeText(getBaseContext(),"Lat : " + String.valueOf(lat) + "\n Long : "+ String.valueOf(lng), Toast.LENGTH_LONG).show();

        }
        // Build the widget update for today
        RemoteViews updateViews = buildUpdate(this);

        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this,InKakinadaWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);

    }

    public RemoteViews buildUpdate(Context context) {
        // Here I am updating the remoteview
        return updateViews;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't need to bind to this service
        return null;
    }

}
}

public class test extends AppWidgetProvider { static LocationManager locMan; static Location curLocation; static Boolean locationChanged; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { // To prevent any ANR timeouts, we perform the update in a service context.startService(new Intent(context, UpdateService.class)); } public static class UpdateService extends Service { // GPS Listener Class LocationListener gpsListener = new LocationListener() { public void onLocationChanged(Location location) { // Log.w("GPS", "Started"); if (curLocation == null) { curLocation = location; locationChanged = true; } if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude()) locationChanged = false; else locationChanged = true; curLocation = location; if (locationChanged) locMan.removeUpdates(gpsListener); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { // Log.w("GPS", "Location changed", null); } public void onStatusChanged(String provider, int status, Bundle extras) { if (status == 0)// UnAvailable { } else if (status == 1)// Trying to Connect { } else if (status == 2) {// Available } } }; // In service start method, I am registering for GPS Updates @Override public void onStart(Intent intent, int startId) { locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) { locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener); } else { this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS")); } if (curLocation != null) { double lat = curLocation.getLatitude(); double lng = curLocation.getLongitude(); Toast.makeText(getBaseContext(),"Lat : " + String.valueOf(lat) + "\n Long : "+ String.valueOf(lng), Toast.LENGTH_LONG).show(); } // Build the widget update for today RemoteViews updateViews = buildUpdate(this); // Push update for this widget to the home screen ComponentName thisWidget = new ComponentName(this,InKakinadaWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, updateViews); } public RemoteViews buildUpdate(Context context) { // Here I am updating the remoteview return updateViews; } @Override public IBinder onBind(Intent intent) { // We don't need to bind to this service return null; } } }

提前致谢...

关心, Raghavendra K。

2 个答案:

答案 0 :(得分:8)

我看到的问题是你在调用requestLocationUpdates()之后正在尝试检查onStart()中的curLocation。 LocationManager.requestLocationUpdates()是异步的,这意味着在返回onStart()之后才会调用LocationListener。让LocationListener在收到位置后更新UI,不要尝试在onStart中执行。

答案 1 :(得分:3)

您是在模拟器中还是在设备上遇到此问题?如果在模拟器上,请确保使用DDMS设置GPS位置。但最简单的方法可能是在设备上运行您的代码,看看您是否以这种方式获得GPS更新。