Приложение веб-камеры перестает работать после случайного времени

#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(…) внутри метода.