Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Написать программу со следующими требованиями


Автор: vegstr 21.6.2012, 08:07
Возникло желание написать приложение с определенными требованиями. В программировании не силен. На Java никогда не писал. Немного работал с Pascal/Delphi. Поэтому для начала хотел бы узнать - возможно ли в принципе написать такое. 
  
 Требования следующие: 
 Программа должна по расписанию через определенные промежутки времени записывать звук с микрофона и уметь его проигрывать. Так же крайне желательно, чтоб записанное можно было скидывать на комп. Прога не должна мешать обычному использованию телефона (звонки/смс/инет и т.п). Необходима возможность настраивать время начала и конца записи, интервал между записями и их длительность. Например - записывать с 08:00 до 23:00 через каждые 30 минут длительностью 10 мин. 
  
 Прога нужна для телефонов Nokia 5310 и Samsung GT-S5230. 
  
 Просьба к знающим людям, подскажите, возможно ли такое на этих телефонах?

Автор: Kalisnik 21.6.2012, 16:31
007 не стал бы использовать J2Me, потому что получится в 02 раза дороже. IMHO, я бы пересмотрел форму подачи вопроса(ов).

Автор: vegstr 21.6.2012, 18:47
Все намного прозаичнее. 007 и 02 тут абсолютно ни при чем. smile Проверка одной теории насчет работы человеческой памяти. На научное исследование не тянет, конечно. Так... Баловстово.

Прога не должна скрываться. Надо чтобы она НЕ МЕШАЛА пользоваться телефоном.

Автор: Kalisnik 21.6.2012, 21:38
честно говоря я не совсем компетентен, но надеюсь форумчане меня поправят. 

1.     Не мешать прога будет только в свернутом виде - но эту функцию поддерживают не все телефоны и нет гарантий ее стабильной работы, т.к. всеми java-приложениями управляет собственно телефон, и если он посчитает что ему не хватает ресурсов, он может запросто Ваше приложение пришлепнуть.  На счет  Nokia и Samsung не знаю, но в SE свернуть мидлет возможно (ну может в самых древних моделях такая функция отсутствует).

2.     Записывать то можно, только хранилище телефона (постоянное хранение данных) не резиновое. На карту памяти телефона java-приложение не пишет на сколько мне известно (может конечно и существуют такие модели телефонов, но это исключение), и на каждой модели телефона размер хранилища данных индивидуален (определяется производителем). Не рассчитывайте на бесчисленные мегабайты памяти - все много скромнее. Так что записывать с 8:00 до 23:00 может просто физически не хватить памяти. И на ПК записанное Вы сможете сбросить только через саму (написанную Вами) программу. Т.к. все данные в телефоне приложение сохраняет в байт-коде и не на всех телефонах доступ к хранилищу телефона открыт пользователю через обычное подключение телефон-компьютер (есть конечно методы выдергивания этих данных и т.д., но это все костыли). И даже если Вы выдерните этот байт-код, то получить из него информацию в оригинальном виде тоже будет непросто - так как методы кодирования данных у каждого производителя телефона свои собственные. smile В общем довольно муторно будет, если Вы не в курсе чего и как делать smile

Я бы порекомендовал диктофон и 1 день Вашего времени - это будет быстрее чем параллельно с написанием программы изучать java. Если такой вариант все же неприемлем, то советую Android smile

Автор: oxigen 22.6.2012, 11:23
Соглашусь насчет Android. Если нужно именно решить конкретную задачу, то самое простое - поискать уже готовый диктофон с таймером под андроид.

А под MIDP столкнетесь с довольно большими сложностями и не факт, что в итоге вообще будет работать на этих моделях.

Автор: vegstr 22.6.2012, 13:05
Согласен, что на Android или с каким-либо аппаратным диктофоном было-бы проще. Но дело в том, что в данном случае это просто баловство, своего рода хобби. Если не получится - ничего страшного не произойдет. smile И тратить деньги нет возможности\желания. Так что я все-таки попробую. Хотя-бы немного Java изучу. Все польза.

Оба телефона поддерживают File Connection API. Я правильно понимаю, что писать на карту памяти они умеют?

Автор: Kalisnik 22.6.2012, 13:27
Цитата(vegstr @  22.6.2012,  13:05 Найти цитируемый пост)
Оба телефона поддерживают File Connection API. Я правильно понимаю, что писать на карту памяти они умеют? 


Да, умеют.

P.S. Видимо поддерживающих File Connection API телефонов не так уж и мало, как мне казалось. )

Автор: vegstr 27.6.2012, 13:40
Пытаюсь разобраться с запуском мидлета с помощью PushRegistry.

Правильно ли я понял, что невозможно просто указать определенное время, в которое приложение будет запускаться каждый день, а требуется указать конкретные дату и время запуска и в дальнейшем каждый раз обновлять дату (+1 день например)?


Код

/**
 *  Schedule this MIDlet's launch.
 *  @param deltatime the length of time in
 *  milliseconds before expiration.
 */
private void scheduleMIDlet(long deltatime)
    throws ClassNotFoundException,
        ConnectionNotFoundException,
       SecurityException {

    String cn = this.getClass().getName();
    // Get the current time by calling Date.getTime()
    Date alarm = new Date();
    long t = PushRegistry.registerAlarm(cn,
         alarm.getTime()+deltatime);
}


Объясните, плз, как правильно вычислять deltatime в вышеуказанном коде? Допустим надо запустить приложение в 10:00 следующего дня.
Описание класса Date читал. Но что-то пока никак не соображу.  smile

Автор: math64 28.6.2012, 09:57
При использовании File Connection API мидлет должен быть подписан - иначе он перед каждой записью на карту памяти будут просить разрешения.
Если в телефоне симкарта с безлимитным интернетом, можно на компьютере запустить сервер, который будет принимать данные с телефона через интернет.
deltatime вычислять не надо - нужно просто указать время запуска приложения (предватительно проверив что это время ещё не наступило)
При использовании сервера на компьютере можно возложить планирование записей на компьютер - компьютер посылает на телефон запрос, телефон записывает данные с микрофона и отсылает на компьютер.

Автор: vegstr 28.6.2012, 10:11
Цитата

мидлет должен быть подписан - иначе он перед каждой записью на карту памяти будут просить разрешения

Я в курсе. Он и про использование микрофона спрашивает.
Цитата

можно на компьютере запустить сервер, который будет принимать данные с телефона через интернет.
 
Спасибо за совет. В данной ситуации не особо нужно. Телефон всегда со мной и записи больше на нем нужны, чем на компе.
Цитата

deltatime вычислять не надо - нужно просто указать время запуска приложения (предватительно проверив что это время ещё не наступило)

Можно по-подробнее? Желательно с примером кода.  Заранее огромное спасибо! smile

Автор: math64 28.6.2012, 10:43
Код

Calendar calendar = Calendar.getInstance();
calendar.set(YEAR, year);
calendar.set(MONTH, month);
calendar.set(DATE, date);
calendar.set(HOUR_OF_DAY, hour);
calendar.set(MINUTE, min);
calendar.set(SECOND, sec);
calendar.computeTime();
long t = PushRegistry.registerAlarm(cn,  calendar.getTimeInMillis());


Автор: vegstr 3.7.2012, 12:46
math64, 
Спасибо за помощь. С этим разобрался.

Теперь возникла другая проблема. Нижеприведенный код нормально работает на Nokia 5310. Создается нормальный аудиофайл, который можно прослушать на компе или телефоне. На Samsung GT-S5230 создается файл нулевой длины, а приложение, когда запись останавливается, выдает ошибку: java.io.IOException: I/O error occurs during commit.

Код

protected void recordAudio() {
        StringItem errorItem;
        Player p;    
        errorItem = new StringItem("", "");
        mainForm.append(errorItem);
    
try {
              // Создание файла на флешке
              FileConnection fc = (FileConnection) Connector.open(createFileName());
              if(!fc.exists()) {    
                    fc.create();
              }
              p = Manager.createPlayer("capture://audio");
              p.realize();
              RecordControl rc = (RecordControl)p.getControl("RecordControl");
              OutputStream output = fc.openOutputStream();
    rc.setRecordStream(output);
    rc.startRecord();
              p.start();
              Thread.currentThread().sleep(30000); // Записывать 30 сек
              rc.commit();
              p.close();
    fc.close();
        } catch (IOException ioe) {
            errorItem.setLabel("Error");
            errorItem.setText(ioe.toString());
        } catch (MediaException me) {
            errorItem.setLabel("Error");
            errorItem.setText(me.toString());
        } catch (InterruptedException ie) {
            errorItem.setLabel("Error");
            errorItem.setText(ie.toString());
        }
}


Заработало smile
Вместо setRecordStream() использовал setRecordLocation()

Автор: vegstr 17.7.2012, 18:29
Люди добрые, подскажите! Нижеприведенный код нормально работает в эмуляторе. Процедура записи запускается таймером через равные промежутки времени. На телефоне (Samsung s5230) тоже работает в активном приложении. А вот в свернутом состоянии выдает исключение:

    javax.microedition.media.MediaException: unable to realize - initialize fail

При этом файлы создаются нормально, но нулевой длины. Никак не могу понять в чем дело :(

Код

protected void recordAudio() {
        StringItem errorItem;
        Player p;

        errorItem = new StringItem("", "");
        mainForm.append(errorItem);

        try {
            // Создание файла на флешке
            FileConnection fc = (FileConnection) Connector.open(createFileName());
            if(!fc.exists()) {    
                fc.create();
            }
            // create the Player object
            p = Manager.createPlayer("capture://audio");
            p.realize();
            // get the RecordControl over this Player
            RecordControl rc = (RecordControl)p.getControl("RecordControl");
            p.prefetch();
            rc.setRecordLocation(fc.getURL());
            // start recording
            rc.startRecord();
            p.start();
            Thread.currentThread().sleep(300000); // Записывать 5 мин
            rc.stopRecord();
            rc.commit();
            p.close();
            fc.close();
        } catch (IOException ioe) {
            errorItem.setLabel("Error");
            errorItem.setText(ioe.toString());
        } catch (MediaException me) {
            errorItem.setLabel("Error");
            errorItem.setText(me.toString());
        } catch (InterruptedException ie) {
            errorItem.setLabel("Error");
            errorItem.setText(ie.toString());
        }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)