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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кроссплатформенное решение для получение контактов, Ошибки при получении контактов 
:(
    Опции темы
lc0d3r
  Дата 10.10.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.7.2008
Где: Киев

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



Добрый день, уважаемые форумчане.

Нужно было реализовать кроссплатформенное сохранение в текстовый формат данных с телефонной книги. Реализовывал всё на основе Java™ Platform Micro Edition SDK 3.0. Мной был написан следующий код:

Код

    public void getAddrBook() throws Exception{
        addrStr= new StringBuffer("");
        pim = PIM.getInstance();
        try{
            contactList = (ContactList)pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY);

            itemList.removeAllElements();
            int kk=0;
            for (Enumeration items = contactList.items(); items.hasMoreElements();kk++) {
                PIMItem item = (PIMItem)items.nextElement();
                itemList.addElement(item);

                if (kk>5) break;


                //detailed enumeration of fields
                int[] fields = item.getPIMList().getSupportedFields();

                for (int i = 0; i < fields.length; i++) {
                    int field = fields[i];

                    int dataType = item.getPIMList().getFieldDataType(field);
                    String label = item.getPIMList().getFieldLabel(field);

                    //checking type of PIMItem
                    //can be STRING, BOOLEAN, STRING_ARRAY, DATE, INT, BINARY
                    if (dataType==PIMItem.STRING){
                        for (int j=0; j<item.countValues(field); j++){
                            int attr = item.getAttributes(field, j);

                            System.out.print(" " + i+"."+j + ". (");
                            System.out.print(contactList.getAttributeLabel(attr)+"): ");
                            System.out.print(label+"): ");
                            System.out.println(item.getString(field, j));

                            addrStr.append(" " + i+"."+j + ". ("+label+"): "+item.getString(field, j)+"\r\n\r\n");
                            

                        }
                        //String sValue = item.getString(field, 0);
                        //System.out.println("["+label+"] - "+sValue);
                        //System.out.println("["+label+"] - ");//+sValue);

                    }
                }

            }

        }
        catch(PIMException e){
            throw new Exception("Some errors with access to address book");
            //TODO: check empty list and other
             
        }
    }


На эмуляторе он вполне нормально заработал, но вот при проверке на реальных аппаратах выдавал ошибки. Интересует как нужно правильно работать с PIM, чтобы решение работало не только на эмуляторе, но и на реальных телефонах(nokia s40, s60 и другие производители).

p.s. архитектурно код кривоват, но это в поисках работающего решения (:

Заранее спасибо за ответы.
PM MAIL WWW   Вверх
ivanovpv
Дата 10.10.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



Кроссплатформенно не получится:
1) поскольку PIM API является частью спецификации JSR-75, реализуемой далеко не всеми телефонами
2) доступ к списку контактов является операцией требующей разрешения моделью безопасности J2ME - проще говоря до потери пульса подтверждать вручную "да-да, хочу открыть, прочитать" или же требуется покупка сертификата (который не гарантирует что все будет работать)

Добавлено через 1 минуту и 52 секунды
Касательно ошибки на реальном телефоне - попробуйте половить эксепшн SecurityException - обычно на эмуляторах он не возникает (если специально не озаботиться)


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
lc0d3r
Дата 10.10.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.7.2008
Где: Киев

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



если верить эксепшинам, что я кидаю выше, то тут не проблема доступа, а выход за границы массива

ну, специфика работы с парами значений индекс-значение, вот на эмуляторе этого нет.

PM MAIL WWW   Вверх
lc0d3r
Дата 11.10.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.7.2008
Где: Киев

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



Эксепшины выводят "Invalid attribute ar.." Тут проблема не с доступом к адресной книге, хотя на нокиях спрашивает много раз. А на эмуле всё ок.

Может у кого-то есть простой рабочий пример? 


Заранее благодарен.
PM MAIL WWW   Вверх
ivanovpv
Дата 12.10.2010, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



У меня такие версии:
1) 
Цитата(lc0d3r @  11.10.2010,  16:24 Найти цитируемый пост)
Эксепшины выводят "Invalid attribute ar.."

Это значит, что itemList где-то попадают значения NULL - хорошо бы устроить проверку на NULL перед тем как добавлять что-то в массив

2) 
Цитата(lc0d3r @  11.10.2010,  16:24 Найти цитируемый пост)
Тут проблема не с доступом к адресной книге, хотя на нокиях спрашивает много раз.

А ты на каких библиотеках собираешь? Собери на родных нокиевских библиотеках. Скачать их можно на forum.nokia.com
По идее должно работать в Нокиях и на библиотеках из WTK, но бывали случаи, что кое-что не очень корректно работало.




--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Жывотное
Дата 12.10.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(lc0d3r @ 11.10.2010,  15:24)
Эксепшины выводят "Invalid attribute ar.." Тут проблема не с доступом к адресной книге, хотя на нокиях спрашивает много раз. А на эмуле всё ок.

Может у кого-то есть простой рабочий пример? 

Вот вполне рабочий код. Вытаскивает форматированное имя, если есть, имя и фамилию, ну и номера телефона, какие есть. Проверялся на телефонах, всё ок.
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.util.Enumeration;
import java.util.Hashtable;
import javax.microedition.pim.Contact;
import javax.microedition.pim.ContactList;
import javax.microedition.pim.PIM;
import javax.microedition.pim.PIMException;
import javax.microedition.pim.UnsupportedFieldException;

/**
 *
 * @author Александр
 */
public class PimContacts {

  private static PimContacts instance;
  private Hashtable contactsHash;

  protected PimContacts() {
    PIM pim = PIM.getInstance();
    String[] lists = pim.listPIMLists(PIM.CONTACT_LIST);
    ContactList contactList = null;
    contactsHash = new Hashtable();

    for (int l = 0; l < lists.length; l++) {
      try {
        contactList = (ContactList) pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY, lists[l]);
        Enumeration contactsEnum = contactList.items();
        String name = null, type = null, tel = null;
        while (contactsEnum.hasMoreElements()) {
          name = type = tel = null;
          Contact contact = (Contact) contactsEnum.nextElement();

          try {
            if (contactList.isSupportedField(Contact.FORMATTED_NAME)) {
              name = contact.getString(Contact.FORMATTED_NAME, 0);
            }
          } catch (IndexOutOfBoundsException iobE) {
            name = null;
          }

          if (name == null) {
            try {
              if (contactList.isSupportedField(Contact.NAME)) {
                String[] names = contact.getStringArray(Contact.NAME, 0);
                name = (names[0] != null) ? names[0] : "";
                name += " ";
                name += (names[1] != null) ? names[1] : "";
                name = name.trim();
              }
            } catch (IndexOutOfBoundsException iobE) {
              name = "";
            }
          }

          try {
            if (contactList.isSupportedField(Contact.TEL)) {
              int values = contact.countValues(Contact.TEL);
              int attr = 0;
              for (int i = 0; i < values; i++) {
                tel = contact.getString(Contact.TEL, i);
                attr = contact.getAttributes(Contact.TEL, i);
                if ((attr & Contact.ATTR_HOME) == Contact.ATTR_HOME) {
                  type = contactList.getAttributeLabel(Contact.ATTR_HOME);
                } else if ((attr & Contact.ATTR_FAX) == Contact.ATTR_FAX) {
                  type = contactList.getAttributeLabel(Contact.ATTR_FAX);
                } else if ((attr & Contact.ATTR_MOBILE) == Contact.ATTR_MOBILE) {
                  type = contactList.getAttributeLabel(Contact.ATTR_MOBILE);
                } else if ((attr & Contact.ATTR_WORK) == Contact.ATTR_WORK) {
                  type = contactList.getAttributeLabel(Contact.ATTR_WORK);
                } else if ((attr & Contact.ATTR_AUTO) == Contact.ATTR_AUTO) {
                  type = contactList.getAttributeLabel(Contact.ATTR_AUTO);
                } else if ((attr & Contact.ATTR_ASST) == Contact.ATTR_ASST) {
                  type = contactList.getAttributeLabel(Contact.ATTR_ASST);
                } else if ((attr & Contact.ATTR_PAGER) == Contact.ATTR_PAGER) {
                  type = contactList.getAttributeLabel(Contact.ATTR_PAGER);
                } else {
                  type = "";
                }

                if (name != null && tel != null) {
                  SimpleContact scontact = new SimpleContact(name, type, cleanPhone(tel));
                  contactsHash.put(scontact.toString(), scontact);
                }
              }
            }
          } catch (IndexOutOfBoundsException iobE) {
            tel = null;
          } catch (UnsupportedFieldException ufE) {
            tel = null;
          }
        }
        contactList.close();
      } catch (PIMException pimE) {
        // no contact list available!
        pimE.printStackTrace();
      } catch (SecurityException sE) {
        // the application is not allowed to access the list
        sE.printStackTrace();
      }
    }
  }

  private String cleanPhone(String phone) {
    StringBuffer cleaned = new StringBuffer();
    for (int i = 0; i < phone.length(); i++) {
      char ch = phone.charAt(i);
      if (Character.isDigit(ch))
        cleaned.append(ch);
    }
    if (cleaned.length() == 11 && cleaned.charAt(0) == '8')
      cleaned.setCharAt(0, '7');
    return cleaned.toString();
  }

  public static PimContacts getInstance() {
    if (instance == null)
      instance = new PimContacts();
    return instance;
  }

  public Hashtable getContacts() {
    return contactsHash;
  }
}

PM MAIL   Вверх
ivanovpv
Дата 13.10.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



Вспомнил один небольшой хак (вернее малоизвестная фича) с доступом к телефонной книге в Нокиа >= S60. Создаем обычный текстовый кОнтрол в котором маска ввода объявлена как телефонный номер. Типа так:
Код

TextField number = new TextField("", "", 16, TextField.PHONENUMBER);

Далее при отображении этого кОнтрола на живом телефоне с осью S60 или старше - при выборе поля ввода появляется менюшка добавить номер из адресной книги + позвонить. Конечно, этой функцией невозможно воспользоваться для считывания адресной книги, но все равно фича приятная.


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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