Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь с J2ME и Bluetooth, Пример работы с блютуз в Jave 
:(
    Опции темы
AlexeySNG
Дата 19.7.2012, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



Извиняюсь за свою назойливость, порылся по форуму и гуглу, нашёл одну процедуру с массивом и вектором, но никак не пойму что здесь к чему
Код

 int[] par=new int[2]; //Что и к чему тут создаётся?
     Vector<int[]> Ar_comm=new Vector<int[]>();
     par[0]=123;
     par[1]=321;
     Ar_comm.add(par);//До вот этой строки это создание массива...

     int[] par2=Ar_comm.get(0);//Тут я так понимаю берётся значение вот из этой строки -  par[0]=123;

Спасибо заранее.
PM MAIL   Вверх
AlexeySNG
Дата 19.7.2012, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



Вот будет наверное правильно.... 
Код

Vector v=new Vector(){{
append("Dev1");
append("Dev2");
append("Dev3");
}}

Как проверять из этого списка ещё не разобрался  smile 

В строке - 
Код

public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
            String name = remoteDevice.getFriendlyName(false);
            if(name.startsWith("Dev1")) {
                     
            } 
            else  if(name.startsWith("Dev2")) {
                       
            }     
        } 
 - Выдаёт ошибку - unreported exception java.io.IOException; must be caught or declared to be thrown - где его репортить (String)?
Я уже и в try-catch пробовал как NetBeans предлагал, не помогло...
Извиняюсь - try-catch помог, но правильно ли это вот вопрос?

Это сообщение отредактировал(а) AlexeySNG - 20.7.2012, 10:32
PM MAIL   Вверх
AlexeySNG
Дата 20.7.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



Вот что получилось, но на реальном телефоне не работает, вернее запускается но сообщений не выдаёт (имена в устройствах (телефоны) Dev1 и Dev2:
Код

import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.*;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;

public class BTMidlet extends MIDlet  implements DiscoveryListener {
    private Display mydisplay;
          
        private Vector remoteDevices = new Vector();
        public void startApp() {
            mydisplay = Display.getDisplay(this);
            serv_SearchDevice();
        }
        public void serv_SearchDevice() {
            LocalDevice localDevice;
            try {
                localDevice = LocalDevice.getLocalDevice();
                DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();   
                discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
            } catch (BluetoothStateException e) {
            }
        }
        
        public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
        try {
            String name = remoteDevice.getFriendlyName(false);
            if(name.startsWith("Dev1")) {
              Alert myAlert = new Alert("Server1 найден");
              myAlert.setTimeout(2000);
            } 
            else  if(name.startsWith("Dev2")) {
             Alert myAlert = new Alert("Server2 найден");
             myAlert.setTimeout(2000);          
            }
        } catch (IOException ex) {
           }
        } 
   

    protected void destroyApp(boolean unconditional) {
        exitApp();
    }
     
    protected void pauseApp() {
        }
    
    public void inquiryCompleted(int i) {
        serv_SearchDevice();
        }

    public void serviceSearchCompleted(int i, int i1) {
        }

    public void servicesDiscovered(int i, ServiceRecord[] srs) {
     }

    private void exitApp() {
        notifyDestroyed();
    }
            
        }

Может правильнее вставить вот такие строки перед 
Код

String name = remoteDevice.getFriendlyName(false);
 - 
Код

remoteDevices.addElement(remoteDevice);
 - мы же из remoteDevice вроде как получить пытаемся, а туда ничего не заносим...

Это сообщение отредактировал(а) AlexeySNG - 20.7.2012, 10:52
PM MAIL   Вверх
oxigen
Дата 20.7.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Код

int[] par=new int[2]; //Что и к чему тут создаётся?
     Vector<int[]> Ar_comm=new Vector<int[]>();
     par[0]=123;
     par[1]=321;
     Ar_comm.add(par);//До вот этой строки это создание массива...

     int[] par2=Ar_comm.get(0);//Тут я так понимаю берётся значение вот из этой строки -  par[0]=123;


Или массив или вектор. Одного достаточно. А тут вектор в котором массивы хранятся...

Вектор:
Код

Vector v=new Vector();
v.addElement("Dev1");
v.addElement("Dev2");
v.addElement("Dev3");

//чтение из вектора
String s = v.elementAt(1);

(вариантс двойными скобками тоже работать будет, но это скорее из разряда фокусов, а не нормального кода)

Массив:
Код

String[] arr = new String[3]; //Создается массив объемом 3 элемента. В отличие от вектора, размер массива ограничен и задается при создании
arr[0] = "Dev1";
arr[1] = "Dev2";
arr[2] = "Dev3";

//чтение из массива
String s = arr[1];



try-catch не только правильный, но единственно возможный вариант.

Добавлено @ 11:16
 - мы же из remoteDevice вроде как получить пытаемся, а туда ничего не заносим...
remoteDevice и remoteDevices совершенно разные вещи.
remoteDevices вообще не нужен сейчас.

discoveryAgent ищет устройства, а когда находит - кладет инфо о найденом устройстве в remoteDevice и отдает ее. Как параметр метода 
public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass). 

А сообщения ты создал, но просто забыл показать ;)
mydisplay.setCurrent(myAlert);


p.s. Ничего, что я на ты?



Это сообщение отредактировал(а) oxigen - 20.7.2012, 11:17
PM MAIL   Вверх
AlexeySNG
Дата 20.7.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



На ты и мне хотелось бы, так проще. Мне бы вашу голову!  smile 
Не просто с асма перейти... В асме создал процедуру и вызывай её по call или всяким там переходам условным/безусловным.... 
PM MAIL   Вверх
AlexeySNG
Дата 21.7.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



У меня опять проблема  smile  Я всё скомпилировал (или как это на яве называется), залил в телефон запустил, второй телефон сделал с именем Dev1 - программа нашла его, выдала нужное сообщение, я выключаю блютуз на телефоне с именем Dev1 и переименовываю его в Dev2  включаю блютуз, а программа пишет что найден телефон с именем Dev1. Перезапустил программу - всё равно пишет что найден Dev1. Сначала думал что проблема в том что не обнуляется переменная вот тут - 
Код

Alert myAlert = new Alert("Dev1 найден");
 - не обнуляется myAlert , но это не так. Вот что получилось... Да кстати только после того как блютуз выключаю и заново включаю - находит устройство с другим именем, видимо где-то сохраняет имя первого найденного устройства
Может нужно очищать переменную remoteDevice? И переменную name тоже? Только как?  smile 
 
Код

import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.*;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;

public class BTMidlet extends MIDlet  implements DiscoveryListener {
    private Display mydisplay;
    private Alert myAlert = null;
    private Alert myAlert1 = null;
    private Vector remoteDevices = new Vector();
    
    
        public void startApp() {
            mydisplay = Display.getDisplay(this);
            serv_SearchDevice();
        }
        public void serv_SearchDevice() {
            LocalDevice localDevice;
            try {
                localDevice = LocalDevice.getLocalDevice();
                DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();   
                discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
            } catch (BluetoothStateException e) {
            }
        }
        
        public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
        String name = null;
        try {
            name = remoteDevice.getFriendlyName(true);
            if(name.startsWith("Dev1")) {
              myAlert = new Alert("Dev1 найден");
              myAlert.setTimeout(1000);
              mydisplay.setCurrent(myAlert);
            } 
            else  if(name.startsWith("Dev2")) {
             Alert myAlert1 = new Alert("Dev2 найден");
             myAlert1.setTimeout(1000);
             mydisplay.setCurrent(myAlert1);
            }
            } catch (IOException ex) {
           }
        } 
   

    protected void destroyApp(boolean unconditional) {
        exitApp();
    }
  protected void pauseApp() {
        }
    
    public void inquiryCompleted(int i) {
        serv_SearchDevice(); //Вот здесь я правильно вызываю? Программа должна перейти на процедура serv_SearchDevice()?
        }

    public void serviceSearchCompleted(int i, int i1) {
        }

    public void servicesDiscovered(int i, ServiceRecord[] srs) {
     }

    private void exitApp() {
        notifyDestroyed();
    }
            
        }

Ещё два вопроса - 1) Можно ли сделать проверку не по всему имени, а по допустим первым трём или четырём буквам имени, и если они совпали перейти на программу которая уже будет полное имя обрабатывать?
2) Разбирался с исходниками в NetBeans-е  - программа (большая-к примеру игра) состоит из нескольких файлов один это меню, второй - это к примеру движек игры - вопрос такой как они вызываются или запускаются в программе, я посмотрел а явных вызовов нет? Предположим что файл движка игры называется Engine.class вызываться должен из программы menu.class , но всё что удалось найти это gEngine - не похоже на вызов движка, пролез всё... 

Ещё вопрос - можно ли вот в этой части 
Код

 String name = remoteDevice.getFriendlyName(false);
            if(name.startsWith("Dev1")) {
              myAlert = new Alert("Dev1 найден");
              myAlert.setTimeout(1000);
              mydisplay.setCurrent(myAlert);
            } 
            else  if(name.startsWith("Dev2")) {
             Alert myAlert1 = new Alert("Dev2 найден");
             myAlert1.setTimeout(1000);
             mydisplay.setCurrent(myAlert1);
            }

вместо if - else использовать switch(), и как? (Прочитал что в switch можно больше вариантов проверки реализовать чем в if-else)

Спасибо заранее

Это сообщение отредактировал(а) AlexeySNG - 23.7.2012, 09:22
PM MAIL   Вверх
oxigen
Дата 23.7.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



1. Похоже что проблема не в программе, а в самом телефоне. Посмотри, как штатный поиск bluetooth устройств работает. Так же, как приложение не реагирует на смену имени?

2. Никакой очистки переменных в java нет. Собственно это и не переменные, а указатели.

3. name.startsWith("Dev1") как следует из названия как раз проверяет первые символы имени. 
Напиши свой метод и передавай ему полное имя
Код
 if(name.startsWith("Dev1")) {
              dev1Found(name);
            } 
..........

private void dev1Found(String name) {
  Alert alert = new Alert("Dev1 found. Full name: " + name);
  alert1.setTimeout(1000);
  mydisplay.setCurrent(alert);
}


4. Посмотри на инициализацию gEngine. Там скорее всего что-то вроде 
Engine gEngine; 
.....
gEngine = new Engine();

Это оно и есть. gEngine указатель на объект класса Engine

5. И if-else-if и switch-case можно использовать без ограничений на число вариантов.
Но в данном случае выбора нет. switch-case со строками не работает.


PM MAIL   Вверх
AlexeySNG
Дата 25.7.2012, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.7.2012

Репутация: нет
Всего: нет



Пробовал на других телефонах (Nokia N82 и Sony-Erricsson W595) - на N82 примерно похожая ситуация, только после перезапуска приложения находит устройство с другим именем, на SE W595 перезапуск не требуется, но необходимо дождаться следующего цикла поиска (индикатор на SE показывает циклы поиска).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1492 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.