【问题标题】:Send Current Location to server periodically in android在android中定期将当前位置发送到服务器
【发布时间】:2012-02-23 04:44:54
【问题描述】:

我必须定期将我当前的位置详细信息(纬度和经度)发送到服务器(例如:每 5 分钟一次)。有没有最好的方法?我知道如何获取当前位置以及如何将详细信息发送到服务器。但是我如何定期重复这个呢?

【问题讨论】:

  • 请查看这个,非常相似的应用程序并且运行良好,但我需要一些关于您在阅读我的帖子后会知道的功能的帮助,很抱歉我可以回答这个问题,t找到评论选项。 . stackoverflow.com/questions/14088095/…

标签: android gps


【解决方案1】:

使用AlarmManager 注册一个闹钟,在用户第一次打开应用程序 5 分钟后唤醒。创建一个服务(获取位置并更新到服务器)以在警报通知您的应用程序时运行。服务完成后,再次注册闹钟,5分钟后唤醒。通过这种方式,您可以完成您的任务。

参考

Android: How to periodically send location to a server

http://developer.android.com/reference/android/app/AlarmManager.html

http://developer.android.com/reference/android/app/Service.html

第一次编辑 - 添加代码示例

第 1 步 - 创建警报管理器并注册警报

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(Main.this, YourWakefulReceiver.class);
bool flag = (PendingIntent.getBroadcast(Main.this, 0,
                intent, PendingIntent.FLAG_NO_CREATE)==null);
/*Register alarm if not registered already*/
if(flag){
PendingIntent alarmIntent = PendingIntent.getBroadcast(Main.this, 0,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Create Calendar obj called calendar
        Calendar calendar = Calendar.getInstance();

/* Setting alarm for every one hour from the current time.*/
int intervalTimeMillis = 1000 * 60 * 60; // 1 hour 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), intervalTimeMillis,
                        alarmIntent);
}

第 2 步 - 创建接收器类

public class YourWakefulReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Intent service = new Intent(context, SimpleWakefulService.class);
            startWakefulService(context, service);
        }
    }
}

Setp 3 - 创建服务类

public class SimpleWakefulService extends IntentService {

    private static String tagName = "YourService";

    public SimpleWakefulService() {
        super("YourService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // Start your location
        LocationUtil.startLocationListener();
        try {
        // Wait for 10 seconds
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
        }
        //Stop location listener
        LocationUtil.stopLocationListener();
        // upload or save location
        uploadGps();

        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

}

第 4 步 - 注册服务和接收器

<service android:name="com.envision.ghari.services.SimpleWakefulService"></service>
        <receiver android:name="com.envision.ghari.receivers.YourWakefulReceiver"></receiver>

注意:这段代码是为了理解实现。它不会编译。

【讨论】:

  • 我希望这个答案更加充实。
  • 还添加了网络可用性检查。如果网络不可用,则将坐标存储在本地,并在有网络时将其发送到服务器
【解决方案2】:

使用BroadcastReceiver 是发送定期请求的好选择。

Here是BroadcastReceiver的使用教程。

【讨论】:

    【解决方案3】:

    使用AlarmManager 唤醒服务并将您获得的位置发布到服务器的最佳方式。

    【讨论】:

      【解决方案4】:

      由于它不需要UI交互,你应该为此创建一个服务,服务将调用requestLocationUpdates方法,在该方法中,传递参数最短时间为5分钟。

      【讨论】:

        【解决方案5】:

        我正在开发一个应用程序,它可以在服务中在 10 到 15 秒内全天获取手机的位置,它工作正常,但有时网络提供商侦听器的 OnLocationChanged 方法停止被调用。

         import android.location.Address;
            import android.location.Geocoder;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.view.View;
            import android.widget.AdapterView;
            import android.widget.ListView;
            import android.widget.SimpleCursorAdapter;
            import android.widget.TextView;
        
        
            import java.io.IOException;
            import java.util.List;
        
            import foodinn.databases.LocationUpdaterDatabase;
        
            public class LocationUpdatesActivity extends AppCompatActivity {
                private LocationUpdaterDatabase locationUpdaterDatabase;
        
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_location_updates);
        
                    locationUpdaterDatabase = new LocationUpdaterDatabase(this, "Locations.db", null, 1);
        
                    final Geocoder geocoder = new Geocoder(this);
        
                    ListView listView = (ListView) findViewById(R.id.locationUpdatesListView);
        
                    listView.setAdapter(new SimpleCursorAdapter(this, R.layout.location_updates_list_view_view, locationUpdaterDatabase.getLocationUpdates(), new String[] {"latitude", "longitude", "whenUpdated"}, new int[] {R.id.listViewTextView1, R.id.listViewTextView2, R.id.listViewTextView3}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER));
        
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                            double latitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView1)).getText().toString());
                            double longitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView2)).getText().toString());
        
                            try {
                                List<Address> addressList = geocoder.getFromLocation(latitude, longitude, 1);
        
                                String address = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                                String city = addressList.get(0).getLocality();
                                String state = addressList.get(0).getAdminArea();
                                String country = addressList.get(0).getCountryName();
                                String postalCode = addressList.get(0).getPostalCode();
                                String knownName = addressList.get(0).getFeatureName();
        
                                ((TextView) view.findViewById(R.id.listViewTextView4)).setText(address + ", " + city + ", " + country);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            }
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        相关资源
        最近更新 更多