当前位置: 首页 > 知识库问答 >
问题:

使用OkHttp3 WebSocket和改型来持续跟踪android设备的位置

鱼渝
2023-03-14

我有下面的java代码,我想在android应用程序中使用它来查询api中运行客户端应用程序的设备的连续LAT/LNG变化,我想跟踪该设备。我认为我试图使用的WebSocketCall方法是不推荐的。据我所知,如何使用webSocket调用来创建Referfit客户机并将来自WebSocketListner的数据排队到Referfit中存在一个问题。我已经研究了几个WebSocketListener示例,由于完全是n00b,我还没有弄清楚代码。我的想法是通过WebSocket保持连接对api开放,并使用Retrifit处理数据响应。如能提供任何协助,将不胜感激。

private WebSocketCall webSocket;

    private void createWebSocket() {
        final MainApplication application = (MainApplication) getActivity().getApplication();
        application.getServiceAsync(new MainApplication.GetServiceCallback() {
            @Override
            public void onServiceReady(final OkHttpClient client, final Retrofit retrofit, WebService service) {
                User user = application.getUser();
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(
                        new LatLng(user.getLatitude(), user.getLongitude()), user.getZoom()));
                service.getDevices().enqueue(new WebServiceCallback<List<Device>>(getContext()) {
                    @Override
                    public void onSuccess(retrofit2.Response<List<Device>> response) {
                        for (Device device : response.body()) {
                            if (device != null) {
                                devices.put(device.getId(), device);
                            }
                        }

                        Request request = new Request.Builder().url(retrofit.baseUrl().url().toString() + "api/socket").build();
                        webSocket = WebSocketCall.create(client, request);
                        webSocket.enqueue(new WebSocketListener() {
                            @Override
                            public void onOpen(WebSocket webSocket, Response response) {
                            }

                            @Override
                            public void onFailure(IOException e, Response response) {
                                reconnectWebSocket();
                            }

                            @Override
                            public void onMessage(ResponseBody message) throws IOException {
                                final String data = message.string();
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            handleMessage(data);
                                        } catch (IOException e) {
                                            Log.w(MainFragment.class.getSimpleName(), e);
                                        }
                                    }
                                });
                            }

                            @Override
                            public void onClose(int code, String reason) {
                                reconnectWebSocket();
                            }
                        });
                    }
                });
            }

            @Override
            public boolean onFailure() {
                return false;
            }
        });
    }

共有1个答案

郑星辰
2023-03-14

因为我是一个完全的n00b,所以花了一些时间和很多问题来解决这个问题。也许将来会帮到别人。

 private WebSocket webSocket;

private void createWebSocket() {
        final MainApplication application = (MainApplication) getActivity().getApplication();
        application.getServiceAsync(new MainApplication.GetServiceCallback() {
            @Override
            public void onServiceReady(final OkHttpClient client, final Retrofit retrofit, WebService service) {
                User user = application.getUser();
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(
                    new LatLng(user.getLatitude(), user.getLongitude()), user.getZoom()));

                service.getDevices().enqueue(new WebServiceCallback<List<Device>>(getContext()) {
                    @Override
                    public void onSuccess(retrofit2.Response<List<Device>> response) {
                        for (Device device : response.body()) {
                            if (device != null) {
                                devices.put(device.getId(), device);
                            }
                        }

                        Request request = new Request.Builder().url(retrofit.baseUrl().url().toString() + "api/socket").build();
                        Log.e("WebSockets", "Headers: " + request.headers().toString());
                        WebSocketListener webSocketListener = new WebSocketListener() {
                            private static final int NORMAL_CLOSURE_STATUS = 1000;
                            @Override
                            public void onOpen(WebSocket webSocket, Response response) {
                                webSocket.send("{Auth-Token:secret-api-token-here}");
                                Log.e("WebSockets", "Connection accepted!");
                            }

                            @Override
                            public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @Nullable Response response) {
                                reconnectWebSocket();
                            }

                            @Override
                            public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) {
                                final String data = text;
                                Log.e("WebSockets", "Receiving : " + text);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            handleMessage(data);
                                        } catch (IOException e) {
                                            Log.w(MainFragment.class.getSimpleName(), e);
                                        }
                                    }
                                });
                            }
                            @Override
                            public void onMessage(WebSocket webSocket, ByteString bytes) {
                                Log.e("WebSockets", "Receiving bytes : " + bytes.hex());
                            }

                            @Override
                            public void onClosing(WebSocket webSocket, int code, String reason) {
                                webSocket.close(NORMAL_CLOSURE_STATUS, null);
                                Log.e("WebSockets", "Closing : " + code + " / " + reason);
                            }

                            @Override
                            public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) {
                                reconnectWebSocket();
                            }
                        };

                        webSocket = client.newWebSocket(request, webSocketListener);
                    }
                });
            }

            @Override
            public boolean onFailure() {
                return false;
            }
        });
    }
 类似资料:
  • 我正在为中国开发一个需要GPS位置跟踪的android应用程序。对于位置跟踪,android需要访问Google play服务。但Google play服务在中国被屏蔽。 这个问题有解决办法吗?有没有推荐的第三方库或实现? 谢谢

  • 问题内容: 如果对http请求的响应是带有cookie的重定向(http代码302), 您如何指示Go客户使用收到的Cookie跟踪新位置? 在CURL中,可以通过以下方式轻松设置客户端: 您如何在Go中做到这一点? 问题答案: 使用Go 1.1,您可以使用。 这是一个工作示例:

  • 我尝试使用R标记编写所有数据分析报告,因为我可以有一个可复制的文档,可以以多种输出格式(Pdf、html和MS Word)共享。 然而,我的大多数同事都使用MS Word,他们不知道R、Markdown等。 使用R Markdown的一个优点是,我可以在MS Word中生成报告,并直接与同事共享。 缺点是协作对我来说变得很麻烦,因为我也会收到MS Word的反馈(通常使用跟踪更改),并且我必须手动

  • 问题内容: 我希望每t毫秒定期跟踪一次鼠标光标的位置。因此,从本质上讲,当页面加载时- 该跟踪器应该启动,并且每(例如)每100毫秒启动一次,我应该获取posX和posY的新值并以表格形式打印出来。 我尝试了以下代码-但值没有刷新-表单框中仅显示posX和posY的初始值。关于如何启动和运行它的任何想法? 问题答案: 在事件处理程序接收到的对象上报告鼠标的位置,您可以将其附加到窗口(事件冒泡):

  • 问题内容: 我的同事在工作中提出了一个我无法回答的问题(由于缺乏经验),该问题与跟踪表中相关字段的变化有关。 想象一下,我们有3个表,每个表20个字段。在此示例中,我们考虑这些表中的每一个都有2个字段,一个名为LastUpdatedOn,另一个名为LastUpdatedBy。 如果我们只想跟踪这3个表中的更改,而只跟踪几个特定字段,而没有为每个表创建包含更新前最新版本的历史表,那么我们如何跟踪这些

  • 我尝试记录JPA实体的任何更改。因此,每个实体都继承自一个抽象实体类,该类具有日志条目对象列表。 AbstractEntity类: LogEntry类: 我的方法是创建一个新的LogEntry对象,并在实体更新或持久化之前将其添加到实体的LogEntry列表中。 我尝试了以下解决方案: 几乎所有这些试验都使我能够更改受影响实体的属性(如名称或validTo)。但没有任何解决方案提供创建新LogEn