1

我已经为 Motorola Droid 构建了一个应用程序,它应该会自动使用手机的位置更新服务器。在用户在主活动屏幕上执行特定任务后,设置警报以使用服务定期更新用户的位置。当用户完成另一个任务时,警报会显式停止。

问题是,我在主要活动的 onCreate() 方法中设置了一个位置管理器,该方法应该将第一个获取的纬度/经度放入两个文本视图字段中。即使清单设置为获取粗略和精细坐标并且我正在使用 requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)minTime 和 minDistance 设置为零,但我没有看到屏幕上出现坐标。这样,我就不会在服务器上记录任何位置。

当我用示例坐标播种文本视图时,它们在服务器上被很好地记录。我不在可以运行 IDE 的计算机上,所以目前没有代码,但我迫切需要一些帮助。

另一件事是,在用户手动单击“发送数据”之前,主活动屏幕会调用摄影应用程序。我怀疑我可能需要覆盖主要活动的 onResume()方法来进行此位置获取。请帮忙,谢谢。

标记。

4

2 回答 2

0

感谢CommsWare。由于评论区的空间限制,我用这种方式来回应。

用户应该为他们将要提取的物品拍照并将其发送到服务器。完成此操作后,服务器会发回一个轮询周期,以便电话定期发送其位置。我已经设置了 textViews显示获得的纬度/经度(见下文),但这部分直到两晚前才起作用。在我稍微耐心一点之后,它终于奏效了,让电话慢慢地获得一个位置。我认为当时的问题是我不允许手机进行定位,所以它不起作用。现在问题仍然存在,定期更新可能不起作用,根据你所说的,并且基于我在完全晴朗的天空下站在外面大约 2 分钟才得到位置修复的事实。

这是一些代码的快照(这部分在主要活动的 onCreate 覆盖中以获取第一个位置修复):

`LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
            0, new LocationListener() {
                public void onStatusChanged(String provider, int status,
                        Bundle extras) {
                    // called when the provider status changes. Possible
                    // status: OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE or
                    // AVAILABLE.
                }

                public void onProviderEnabled(String provider) {
                    // called when the provider is enabled by the user
                }

                public void onProviderDisabled(String provider) {
                    // called when the provider is disabled by the user, if
                    // it's already disabled, it's called immediately after
                    // requestLocationUpdates
                }

                public void onLocationChanged(Location location) {
                    double latitute = location.getLatitude();
                    double longitude = location.getLongitude();
                    tv5.setText(""+latitute);
                    tv6.setText(""+longitude);
                }
            });

`

下面是 SOAP 请求和响应处理机制的一部分。
`//以秒为单位获取轮询周期。字符串[] getPollNumber; getPollNumber = resultParams[2].split(";");

            //Set up the intent to be passed to the tracking service.
            Intent updateLocation = new Intent (this,TrackUser.class);  
            PendingIntent pendingIntent = PendingIntent.getService(PickUp.this, 0, updateLocation, 0);

            //Set up the alarm manager to be used to periodically send updates.
            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

            //If instruction = 1, start tracking the user.
            if(instruction == 1)
            {                   
                //Start tracking service on phone.
                pollPeriod = Integer.parseInt(getPollNumber[0]);
                alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (pollPeriod*1000), pollPeriod*1000, pendingIntent);
            }
            else
            {
                if(instruction == 0)
                {
                    //Stop tracking service.
                    stopService(new Intent(this,TrackUser.class));
                    alarmManager.cancel(pendingIntent);
                }
            }

'

在跟踪服务类中,我使用从其 onStart() 覆盖调用的方法,该方法简单地将当前坐标打包到 SOAP 对象中并更新服务器。我担心如果手机像你说的那样进入睡眠状态,GPS 可能没有足够的时间在这些更新期间锁定。我想知道当服务启动时我是否应该有某种计时器(可能是 requestLocationUpdates 的 minTime 设置?)让手机保持唤醒状态约 3 分钟,以便可以进行修复?请让我知道这些代码片段是否有帮助,以及更新位置的想法是否可行,谢谢。

于 2010-05-10T13:19:54.780 回答
0

对于这么复杂的东西,没有代码,很难帮助你。

在黑暗中完全刺伤,尝试requestLocationUpdates()与警报和服务结合使用AlarmManager是很难做到的。例如,如果服务是IntentService,并且它正在注册位置更新,那么在最好的情况下它只会失败,在最坏的情况下,你会像筛子一样泄漏内存。还有一个问题是在您等待定位修复时确保设备处于唤醒状态,因为设备可能倾向于重新进入睡眠状态。

我不知道TextViews所有这些在哪里发挥作用,或者它们与某些服务器有什么关系onResume(),或者它们与 . 有什么关系,或者它们与“摄影应用程序”有什么关系。

于 2010-05-08T23:05:37.087 回答