Страницы

Показаны сообщения с ярлыком android. Показать все сообщения
Показаны сообщения с ярлыком android. Показать все сообщения

среда, 8 октября 2014 г.

Почему не отображается PhotoShareDialog

Для того, чтобы расшарить изображение в FB из своего приложения через SDK недостаточно использования
new FacebookDialog.PhotoShareDialogBuilder(...).addPhotos(...).build().present();
В этом случае диалог просто не появляется, а в логах добавляется ошибка
Warning: Error: com.facebook.FacebookException: Failed to copy image.
Нужно ещё объявить в манифесте провайдер:



Нужно только заменить цифровую часть на id своего приложения.

Подробнее прочитать можно в документации.

четверг, 1 декабря 2011 г.

Проверка доступности сайта/хоста

boolean isHostReachable(String address) {
    try {
        URL url = new URL(address);

        HttpURLConnection urlc = 
            (HttpURLConnection) url.openConnection();
        urlc.setRequestProperty("User-Agent", "userAgent");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1000 * 10);
        urlc.connect();
        if (urlc.getResponseCode() == 200) {
            urlc.disconnect();
            return true;
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

В коде ничего сложного нет: создаём подключение к интересующему хосту, задаём user agent, таймайт в миллисекундах, подключаемся и проверяем код ответа, после чего тут же отключаемся.

вторник, 27 сентября 2011 г.

Выделение текста в WebView или как выстрелить себе в ногу.


Понадобилось выделять текст в WebView. Потратил почти два дня поочередных запросов к гуглу, поисков на StackOverflow и изучения исходников стандартного браузера. Решение в итоге нашёл, даже два, но осадок остался. Задача довольно часто нужна и можно было бы описать её решение в документации.

вторник, 13 сентября 2011 г.

Отображение индикатора ошибки в EditText

Сегодня я узнал, что в EditText можно очень просто отобразить индикатор ошибки и разъясняющий текст. Выглядит это так:

Отладка через WiFi

Как известно, отладка приложений под Android требует подключения устройства через USB-кабель. Однако, недавно я узнал, что кабель вовсе не обязателен. Всё, что для этого нужно - это рутованный девайс и общая WiFi сеть между устройством и компьютером. Рутованный девайс, доступный через сеть, может быть не для всех приемлемым по соображениям безопасности. В любом случае, я бы не стал пользоваться этим способом в публичных сетях.

четверг, 7 июля 2011 г.

Поиск кириллицы в файлах проекта

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

Тем не менее под linux'ом легко найти все файлы, где остались строковые ресурсы. Делается это одной командой:
grep -nirE --exclude-dir="gen" --exclude-dir="bin" "[а-я]" /path/to/project/

-n включает отображение номеров строк в выводе
-i игнорирование регистра символов
-r рекурсивный поиск по всем файлам и директориям
-E указывает на то, что шаблон задан в виде регулярного выражения (extended regexp)
--exclude-dir задаёт директории, в которых поиск производить не нужно. Помимо bin и gen, cюда можно включить .svn или .git (конечно, если вы используете соответствующую VCS), а также каталоги assets, lib и raw (ничего полезного в применении к нашей задаче там не найдётся).

понедельник, 29 ноября 2010 г.

Как проверить доступность интернета

Неоднократно на просторах интернета встречал примеры по теме проверки доступности интернета на устройстве. В них обычно создавали подключение к какому-нибудь сайту и ловили исключения. Если всё прошло без исключения, значит интернет доступен.

По моему мнению, это неверно. Можно использовать стандартные методы из SDK. Конкретнее, класс ConnectivityManager. Он как раз и предназначен для получения информации об активных подключениях.

среда, 29 сентября 2010 г.

Ellipsize и TextView

Не секрет, что у мобильных устройств экран невелик, и поэтому часто длинный текст не умещается на экране целиком. Можно на это забить и оставить текст обрезанным либо можно поставить многоточие на месте обрезки (см. рисунок). Для этого есть метод setEllipsize() и соответствующий ему атрибут android:ellipsize.



Всё бы хорошо, но при попытке применения их я столкнулся с неожиданным поведением метода setEllipsize() у TextView: для однострочного текста из нескольких слов метод не работает. Строка обрезается, но многоточие в конце не появляется. То же самое и с XML-атрибутом android:ellipsize. Вот так это выглядит:


Можно заметить, что метод работает, но работает неверно: неуместившийся остаток текста просто отбрасывается.

Выяснил, что это давний баг, который не исправляется в течение двух лет. В багтрекере андроида есть соответствующие записи: http://code.google.com/p/android/issues/detail?id=882 и http://code.google.com/p/android/issues/detail?id=10554

Одним из вариантов обхода бага является установка атрибута android:singleLine="true", но он объявлен deprecated (хотя и замечательно работает до сих пор).
Другой обходной путь - имитировать поведение атрибута android:singleLine другими атрибутами: android:lines="1" и android:scrollHorizontally="true".

Советую пройти в багтрекер и проголосовать за баг. Может его и исправят когда-нибудь.

понедельник, 20 сентября 2010 г.

Получение числа непрочитанных СМС

Отвечал на вопросы на StackOverflow и среди них попался вопрос по теме поста. Как ни странно, в документации этот вопрос не освещён. Путём исследования исходников Андроида нашёл решение, оказалось, что это несложно.


Требуется выполнить простой запрос к SMS ContentProvider. Код будет выглядеть так:



  1. final Uri SMS_INBOX = Uri.parse("content://sms/inbox");
  2.  
  3. Cursor c = getContentResolver().query(SMS_INBOX, null, "read = 0", null, null);
  4. int unreadMessagesCount = c.getCount();
  5. c.deactivate();
* This source code was highlighted with Source Code Highlighter.

Условие прочтения сообщения задаётся в третьей строке параметром "read = 0", для получения числа прочитанных сообщений нужно заменить 0 на 1.

четверг, 16 сентября 2010 г.

Отслеживание изменений в EditText

В компоненте EditText, использующемся для редактирования текста, как нетрудно догадаться, нет методов позволяющих отслеживать изменение текста в поле ввода. Но реализовать этот функционал конечно же возможно.

Для отслеживания изменений в EditText нужно создать класс, реализующий интерфейс TextWatcher. Интерфейс содержит определения методов afterTextChanged, beforeTextChanged, onTextChanged, вызываемых соответственно после изменения текста, перед изменением и собственно во время изменения. Затем этот класс нужно зарегистрировать для отслеживаемого контрола EditText при помощи метода addTextChangedListener().

Рассмотрим на примере. Имеется несколько EditText'ов. Изначально видимым является только один, остальные скрыты. Требуется отслеживать в них изменения и при условии наличия текста в первом, показывать второй контрол, и наоборот, при условии отсутствия текста в первом контроле скрывать второй. Реализуется это несложным кодом:

  private class Watcher implements TextWatcher {
    protected EditText linkedView;
   
    public Watcher(EditText linkedView) {
      this.linkedView = linkedView;
    }
   
    public void afterTextChanged(Editable s) {
      if (s.length() > 0) {
        linkedView.setVisibility(View.VISIBLE);
      } else {
        linkedView.setVisibility(View.GONE);
      }
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
    public void onTextChanged(CharSequence s, int start, int before, int count) { }
  };

    participantEdits[0].addTextChangedListener(new Watcher(participantEdits[1]));


* This source code was highlighted with Source Code Highlighter.


Код довольно прост: отлавливаем событие после изменения текста и в зависимости от длины текста скрываем или отображаем привязанный контрол.