android - 使用 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);
解决方案
当您使用 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);
}
}