Камера Android на фиксированной частоте
Я пишу приложение, которое должно иметь следующий вариант использования: пользователь нажимает кнопку "Старт!" Кнопка и приложение начинает щелкать изображения (используя класс CameraPreview внутри) каждую 1 минуту и изменяет текст кнопки на "Готово!".
Когда пользователь нажимает ту же кнопку (но с новым текстом кнопки "Готово!"), Приложение должно остановиться.
Мне удалось написать код, который нажимает на картинку каждую минуту, когда пользователь нажимает "Старт!" кнопка. Но как только начинается захват изображения, кнопка зависает.
Как я могу запустить свою логику захвата изображения каждую минуту так, чтобы кнопка не зависала? Каковы лучшие практики вокруг этого? Спасибо!
Вот код для OnClick():
@Override
public void onClick(View v) {
Button button = (Button)v;
String buttonText = button.getText().toString();
if(buttonText.equals(Constant.trainButtonText)) {
Log.i(TAG, "Robot Training started...");
while(true) {
surfaceView.capture(new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.v("Still", "Image data received from camera");
String[] params = new String[] {
Constant.Server, // Server URL
Long.toString(new Date().getTime()), // Image Timestamp
Constant.userId // Unique user ID for each customer
};
new UploadImageToWebServiceTask(data).execute(params);
camera.startPreview();
}
});
try {
// Capture every 1 minute until 'training done!' is not clicked
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(buttonText.equals(Constant.doneTrainingButtonText)) {
Log.i(TAG, "Robot Training completed...");
button.setText(Constant.trainButtonText);
button.clearFocus();
}
}
В коде используется та же кнопка - только то, что мы решаем, что делать, основываясь на тексте кнопки.
1 ответ
Не блокируйте поток пользовательского интерфейса, переключитесь на Runnable. Также вы фотографируете каждую секунду: 1000
одна секунда, 60000
одна минута
Сначала создайте новую переменную поля:
public class MainActivity extends Activity {
Runnable takePictures = new Runnable() {
@Override
public void run() {
// I'll trust that this code works
surfaceView.capture(new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.v("Still", "Image data received from camera");
String[] params = new String[] {
Constant.skynetNNServer, // Server URL
Long.toString(new Date().getTime()), // Image Timestamp
Constant.userId // Unique user ID for each customer
};
new UploadImageToCloudTask(data).execute(params);
camera.startPreview();
}
});
// Call this runnable again in 60 seconds (60000 milliseconds)
surfaceView.postDelayed(this, 60000);
}
};
// Rest of your code
Затем поменяй onClick
метод:
@Override
public void onClick(View v) {
Button button = (Button)v;
String buttonText = button.getText().toString();
if(buttonText.equals(Constant.trainButtonText)) {
Log.i(TAG, "Robot Training started...");
surfaceView.post(takePictures);
}
else if(buttonText.equals(Constant.doneTrainingButtonText)) {
Log.i(TAG, "Robot Training completed...");
surfaceView.removeCallbacks(takePictures);
button.setText(Constant.trainButtonText);
button.clearFocus();
}
}