Pull to refresh

Словарь для Android

Идея


Купил себе HTC Legend. Читал статьи на английском. Но так как знаю его не очень хорошо, то понадобился словарик. Желательно с произношением слов (что бы слова лучше запоминались) и с возможность выделить часто употребляемые слова (что бы не изучать все слова, а только самые распростанённые). Такого не нашёл (может плохо искал) и решил написать свой. Плюс изучаю программирование под Android, так что написание своей программы было для меня ещё плюсом в изучении языка.

Структура программы


Программа состоит из 2-х частей:
1. Сама программа для Android. Она показывает слова, производит поиск слов по словарю, произносит слова.
2. Вспомогательные программы для создания словарей. Анализирует текст с выделением часто употребляемых слов, скачивает с google translater перевод слова, заполняет базу.
image

Программа для Android


Расскажу про общую структуру.

В программе есть 4 окна:
1. Со списком слов.
image

2. С настройками фильтрации по частоте употребления и количеству слов. В дальнейшем это окно уберу за ненадобностью.
image

3. С выбором БД для словаря.
image

4. С выводом подробной информации о слове.
image

Детально код описывать не буду. Расскажу только про проблемы, которые возникли при воспроизведении mp3 из массива байт. Забыл добавить, что звук у меня хранится в самой БД, т.е. приложение не требует подключения к сети. Это сделано для того, что бы экономить трафик и для того что бы можно было брать звук не только из google translator, но и из других источников.

Android не позволяет воспроизводить mp3 из массива байт, только из сети или из файла. Только wav формат можно воспроизвести из массива байт. Есть 3 решения проблемы — сохранять mp3 во временную папку, преобразовывать в wav или воспроизводить со своего аудио сервера. Первый способ не подходит из за того, что создаётся много временных файлов. Второй способ не понравился из за того, что, во-первых, пришлось бы конвертировать множество mp3 (~2500) и во-вторых это привело бы к увеличению их размера.

Поэтому был написан простой сервер, который отдавал поток mp3 по запросу:

public class AudioServer extends Thread {

private DataBaseHelper myDbHelper;

public AudioServer(DataBaseHelper myDbHelper) {
this.myDbHelper = myDbHelper;
}

public void run() {
ServerSocket ss;
try {
ss = new ServerSocket(6129);
} catch (IOException e1) {
Log.e("AudioServer", "CreateServer " + e1.getMessage());
return;
}
while (true) {
Socket theConnection;
try {
theConnection = ss.accept();
} catch (IOException e1) {
Log.e("AudioServer", "CreateConnection " + e1.getMessage());
return;
}
String method;

try {
PrintStream os = new PrintStream(theConnection.getOutputStream());
DataInputStream is = new DataInputStream(theConnection.getInputStream());
String get = is.readLine();
StringTokenizer st = new StringTokenizer(get);
method = st.nextToken();

if (method.equals("GET")) {
String word = st.nextToken().replace("/", "");

while ((get = is.readLine()) != null) {
if (get.trim().equals(""))
break;
}
Log.i("AudioServer", "Word " + word);
byte[] audio = myDbHelper.getAudio(word);
if (audio != null)
Log.i("AudioServer", "LenghtAudio " + audio.length);
else
Log.i("AudioServer", "Audio data not fouded");

os.print("HTTP/1.0 200 OK\r\n");
Date now = new Date();
os.print("Date: " + now + "\r\n");
os.print("Server: english_server\r\n");
if (audio != null)
os.print("Content-length: " + audio.length + "\r\n");
else
os.print("Content-length: 0\r\n");
os.print("Content-type: audio/x-mp3\r\n\r\n");

// send the file
if (audio != null)
os.write(audio);
os.close();
}
} catch (IOException e) {
Log.e("AudioServer", "SendData " + e.getMessage());
}

try {
theConnection.close();
} catch (IOException e) {
Log.e("AudioServer", "ConnectionClose " + e.getMessage());
}
}
}

}


Заключение


Программа работает, но есть несколько ошибок и нелогичностей в поведении, которые нужно исправить.
Скачать можно в code.google.com/p/android-voice-dictionary
По ссылке apk и два словаря. Один с произношением, но в нём 2500 слов. Во втором слов больше, но произношения нет.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.