2010-05-08 33 views
1

我已经为摩托罗拉Droid构建了一个应用程序,该应用程序应该使用手机的位置自动更新服务器。用户在主活动屏幕上执行特定任务后,会设置一个警报,以使用服务定期更新用户的位置。当用户完成另一项任务时,警报被明确停止。将获取的位置设置为文本视图:如何维护?

事情是,我已经在主要活动的onCreate()方法中设置了一个位置管理器,该方法应该将第一个获得的经纬度放在两个textview字段中。即使清单设置为获取粗略和细小的坐标,并且我正在使用requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener),但将minTime和minDistance设置为零,我没有看到屏幕上显示的坐标。因此,我不记录服务器上的任何位置。

当我使用sample coords播种文本视图时,它们在服务器上录制得很好。我不在一台可以运行IDE的计算机上,所以目前没有代码,但绝望寻求这方面的帮助。

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

Mark。

回答

0

对于这样复杂的事情,没有代码,很难帮助你。

在黑暗中进行总刺击,尝试使用requestLocationUpdates()AlarmManager报警并且服务很难做到。例如,如果该服务是IntentService,并且它正在注册位置更新,则在最好的情况下,它只会失败,而在最坏的情况下,您会像筛一样泄漏内存。还有一件事是确保在等待定位进入时设备处于清醒状态,因为设备可能倾向于要回去睡觉。

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

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请求的一部分,响应处理机制。
`//在几秒钟内获得投票时间。 String [] 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分钟,以便修复可以进来吗?请让我知道这些代码片段是否有帮助,如果可以更新位置的想法,谢谢。