Использование веб-камеры IP для изображений и передача URL в API
Я использую приложение IP Webcam в своем телефоне Android, чтобы использовать его в качестве IP-камеры, и я использую другой телефон Android для запуска своего приложения, которое распознает лица с помощью API Kairos. Я использую приложение 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);
1 ответ
Когда вы используете ip webcam, убедитесь, что все ваши устройства подключены к одному серверу. Во-вторых, вам нужно обновлять URL снова и снова, чтобы получить последнее изображение. Я думаю, что это ваша главная проблема в обновлении 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);
}
}