#android #service #webcam #photo #intentservice
#Android #Обслуживание #Вебкам #фото #intentservice
Вопрос:
Извините, если я допустил основную ошибку или что-то в этом роде в своей программе, но я довольно новичок в Android. Я создал приложение, чтобы сделать снимок через определенное время, сохранить его и затем загрузить на сервер. Я использовал BackgroundService для загрузки, но я не совсем уверен, правильно ли оно создано. Проблема в том, что приложение всегда отключается через случайное время, и я не могу понять, почему это происходит. Были бы очень рады некоторым идеям или предложениям, как это решить, спасибо!
Мой таймер
public void timedWebcam()
{
Timer myTimer = new Timer();
//Initialize the Timer Task
WebcamTimer webcamTimer = new WebcamTimer();
if(intervall != 0)
{
//Starting the Timer
myTimer.scheduleAtFixedRate(webcamTimer, 0, 60000*intervall);
}
else
{
Toast.makeText(this, "interval not set", Toast.LENGTH_LONG).show();
}
}
WebcamTimer
private class WebcamTimer extends TimerTask
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
Date date = new Date();
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
actualHour = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println("Actual Hour= " actualHour);
System.out.println("Start Time= " startTime);
System.out.println("Stop Time= " stopTime);
if( (actualHour >= startTime) amp;amp; (actualHour < stopTime) )
{
takePhoto(); //Takes the Picture
uploadToFTP(); //Uploads taken Picture to FTP
}
else
{
nightMode();
}
}
});
}
}
Вызов службы
Intent intent = new Intent(this,UploadService.class);
this.startService(intent);
Наконец, класс UploadService
public class UploadService extends IntentService
{
//Server Properties
public String server = "sample.aon.at";
public int port = addPort;
public String user = "user";
public String pass = "password";
FTPClient ftpClient = new FTPClient();
public UploadService()
{
super("UploadService");
}
@Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
@Override
protected void onHandleIntent(Intent intent)
{
// For each start request, send a message to start a job and deliver the
// start ID so we know which request we're stopping when we finish the job
try
{
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.changeWorkingDirectory("webcam");
// uploads file using an InputStream
File firstLocalFile = new File(MainActivity.path);
System.out.println("Path used for upload: " MainActivity.path);
String firstRemoteFile = "webcam.jpg";
InputStream inputStream = new FileInputStream(firstLocalFile);
boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
inputStream.close();
if (done)
{
System.out.println("Upload finished");
}
}
catch (IOException ex)
{
System.out.println("Error: " ex.getMessage());
ex.printStackTrace();
}
finally
{
try {
if (ftpClient.isConnected())
{
ftpClient.logout();
ftpClient.disconnect();
stopSelf();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
Комментарии:
1. вы тестируете это на эмуляторе или реальном устройстве. Я бы не стал доверять эмулятору, чтобы давать правильные отзывы о любом приложении, связанном с камерой
2. На данный момент я тестирую на Samsung Galaxy S4, но в конце он должен работать для HTC Legend (установлена самая низкая версия Android)
Ответ №1:
Я попытаюсь поместить экземпляр timer в ваш верхний класс обработчика. Я не уверен, но я предполагаю, что если вы создали экземпляр объекта Timer внутри метода, эта ссылка будет уничтожена после закрытия метода. Затем позже сборщик мусора (GC) уничтожит все ресурсы, которые были предоставлены экземпляру таймера при создании.
Итак, создайте экземпляр timer из верхнего класса и просто вызовите timer.schedule(…) внутри метода.