【问题标题】:using IP Webcam for images and passing the url to API使用 IP 网络摄像头获取图像并将 URL 传递给 API
【发布时间】:2018-12-13 12:57:17
【问题描述】:

我在我的 Android 手机中使用 IP 网络摄像头应用程序将其用作 IP 摄像头,并且我正在使用另一部 Android 手机运行我的应用程序,该应用程序使用 Kairos API 识别人脸。我正在使用 IP 网络摄像头应用程序,图像在一个 url 上流式传输,类似于: “http://xxx.xxx.x.xxx:8080/photo.jpg”,我可以在所有设备上通过这个 url 查看图像,但是我使用的 API 有一个识别函数,它将图像 url 作为它的参数之一,但是当我使用流式传输时图片网址,无效。我试图通过日志弄清楚发生了什么,但我只能看到它抛出了一个 SocketTimeoutException(读取超时)并尝试了 SO 的解决方案,但没有任何效果,这里有什么建议吗?

代码:

    public void getUrlText(){

        try{
            url = new URL("http://xxx.xxx.x.xxx:8080/photo.jpg");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    Handler handler = new Handler();
    Runnable timedTask = new Runnable(){

        @Override
        public void run() {
            getUrlText();
            handler.postDelayed(timedTask, 1000);
    }};

这是在 onCreate 方法里面:

        getUrlText();
        handler.post(timedTask);
        recognizePhotoKairos(Uri.parse(url.toString()), userPhoneNumber);

【问题讨论】:

    标签: android ip-camera imageurl


    【解决方案1】:

    当您使用 ip webcam 时,请确保您的所有设备都连接到同一台服务器。 第二件事是您必须一次又一次地刷新网址才能获得最新的图像。我认为这是您刷新 url 的主要问题。我建议您为此使用处理程序,等待特定时间然后再次刷新 url 或在您的情况下刷新 api。 Read more about handler 我正在添加我一次又一次启动处理程序的项目的源代码

    公共类 CounterActivity 扩展 AppCompatActivity {

    TextView textView;
    private boolean started = false;
    private PowerManager.WakeLock wl;
    private Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter);
    
        textView=findViewById(R.id.points);
        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My:Tag");
    

    // 屏幕停留在此部分

        start();
    
    
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
    
    
                final String URL="http://172.16.16.108:8080/wallgame/api/game_points";
    
                StringRequest request=
                        new StringRequest(Request.Method.GET, URL,
                                new Response.Listener<String>() {
                                    @Override
                                    public void onResponse(String response) {
    
                                        try {
                                            JSONObject object=new JSONObject(response);
    
                                            JSONObject data=object.getJSONObject("data");
    
    
                                            int points=Integer.parseInt(data.getString("game_points"));
    
                                            textView.setText(points+"");
    
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
    
                                Toast.makeText(CounterActivity.this, "Error", Toast.LENGTH_SHORT).show();
                            }
                        }
                        );
                RequestQueue queue= Volley.newRequestQueue(CounterActivity.this);
                queue.add(request);
    
            }
        },1000);
    }
    
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
    
            final String URL="http://172.16.16.108:8080/wallgame/api/game_points";
    
            StringRequest request=
                    new StringRequest(Request.Method.GET, URL,
                            new Response.Listener<String>() {
                                @Override
                                public void onResponse(String response) {
    
                                    try {
                                        JSONObject object=new JSONObject(response);
    
                                        JSONObject data=object.getJSONObject("data");
    
    
                                        int points=Integer.parseInt(data.getString("game_points"));
    
                                        textView.setText(points+"");
    
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(CounterActivity.this, "Error", Toast.LENGTH_SHORT).show();
                        }
                    }
                    );
            RequestQueue queue= Volley.newRequestQueue(CounterActivity.this);
            queue.add(request);
            start();
        }
    };
    public void onDestroy() {
        super.onDestroy();
        started = false;
        handler.removeCallbacks(runnable);
        if (wl.isHeld())
            wl.release();
    }
    public void start(){
        started = true;
        handler.postDelayed(runnable, 1500);
    }
    

    }

    【讨论】:

    • 我尝试了所有这些,但没有任何效果。我在这里添加了一些代码,您能看看有什么遗漏吗?
    • 您没有再次声明处理程序。你只需启动一次。处理程序基本上等到时间结束,以便您可以完成工作。您必须一次又一次地启动处理程序并进行无限循环,以便获得最新的图片。
    • 我已经用示例代码编辑了我的答案,我一次又一次地启动处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2020-09-14
    相关资源
    最近更新 更多