首页 > 解决方案 > 使用 IP 网络摄像头拍摄图像并将 URL 传递给 API

问题描述

我在我的安卓手机中使用 IP 网络摄像头应用程序将其用作 IP 摄像头,我正在使用另一部安卓手机运行我的应用程序,该应用程序使用 Kairos API 识别人脸。我正在使用 IP 网络摄像头应用程序,图像在一个类似于以下内容的 url 上流式传输:“ http://xxx.xxx.x.xxx:8080/photo.jpg ”,我可以通过它查看图像url 在所有设备上,但是我使用的 API 有一个识别函数,它将图像 url 作为它的参数之一,但是当我使用流式图像 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);

标签: androidip-cameraimageurl

解决方案


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

公共类 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);
}

}


推荐阅读