Провайдеры контента
Наше приложение может сохранять разнообразую информацию о пользователе, какие-то связанные данные в файлах или настройках. Однако ОС Android уже хранит ряд важной информации, связанной с пользователем, к которой имеем доступ и которую мы можем использовать. Это и списки контактов, и файлы сохраненных изображений и видеоматериалов, и какие-то отметки о звонках и т.д., то есть некоторый контент. А для доступа к этому контенту в OC Android определены провайдеры контента (content provider)
В Android имеются следующие встроенные провайдеры, определенные в пакете android.content :
- AlarmClock : управление будильником
- Browser : история браузера и закладки
- CalendarContract : каледарь и информаци о событиях
- CallLog : информация о звонках
- ContactsContract : контакты
- MediaStore : медиа-файлы
- SearchRecentSuggestions : подсказки по поиску
- Settings : системные настройки
- UserDictionary : словарь слов, которые используются для быстрого набора
- VoicemailContract : записи голосовой почты
Работа с контактами
Контакты в Android обладают встроенным API, который позволяет получать и изменять список контактов. Все контакты хранятся в базе данных SQLite, однако они не представляют единой таблицы. Для контактов отведено три таблицы, связанных отношением один-ко-многим: таблица для хранения информации о людях, таблица их телефонов и и таблица адресов их электронных почт. Но благодаря Android API мы можем абстрагироваться от связей между таблицами.
Среда выполнения Microsoft Edge WebView2 Runtime — что это и можно ли удалить
Общая форма получения контактов выглядит следующим образом:
ArrayList contacts = new ArrayList(); ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if(cursor!=null) < while (cursor.moveToNext()) < // получаем каждый контакт String contact = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)); // добавляем контакт в список contacts.add(contact); >cursor.close(); >
Все контакты и сопутствующий функционал хранятся в специальных базах данных SQLite. Но нам не надо напрямую работать с ними. Мы можем воспользоваться объектом класса Cursor . Чтобы его получить, сначала вызывается метод getContentResolver() , который возвращает объект ContentResolver . Затем по цепочке вызывается метод query() . В этот метод передается ряд параметров, первый из которых представляет URI — ресурс, который мы хотим получить. Для обращения к базе данных контактов используется константа ContactsContract.Contacts.CONTENT_URI
Метод contactsCursor.moveToNext() позволяет последовательно перемещаться по записям контактов, считывая по одному контакту через вызов contactsCursor.getString() .
Таким образом, получать контакты не сложно. Главная сложность в работе с контактами, да и с любыми другими провайдерами контента, заключается в установке разрешений. До Android API 23 достаточно было установить соответствующее разрешение в файле манифеста приложения. Начиная же с API 23 (Android Marshmallow) Google изменил схему работы с разрешениями.
Это — лучший браузер?! Обзор Microsoft Edge!
И теперь пользователь сам должен решить, будет ли он давать разрешения приложению. В связи с чем разработчики должны добавлять дополнительный код.
Итак, для доступа к контактам нам надо установить разрешение android.permission.READ_CONTACTS в файле манифеста приложения:
Для вывода списка контактов в файле activity_main.xml определим следующую разметку интерфейса:
Для вывода списка контактов воспользуемся элементом ListView. И в классе MainActivity получим контакты:
Кроме собственно загрузки контактов и передачи их через адаптер ArrayAdapter в список ListView здесь добавлено много кода по управлению разрешениями. Вначале определена переменная READ_CONTACTS_GRANTED , которая указывает, было ли выдано разрешение. И здеь есть два варианта действий.
Первый вариант предполагает, что устройство имеет версию Android ниже Marshmallow (ниже API 23). Для этого мы просто узнаем, есть ли разрешение для READ_CONTACTS и если оно есть, то устанавливаем для переменной READ_CONTACTS_GRANTED значение true :
int hasReadContactPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS); if(hasReadContactPermission == PackageManager.PERMISSION_GRANTED)
Иначе нам надо отобразить пользователю диалоговое окно, где он решить, надо ли дать приложению разрешение:
ActivityCompat.requestPermissions(this, new String[], REQUEST_CODE_READ_CONTACTS);
В этот метод передаются три параметра. Первый — текущий контекст, то есть текущий объект Activity.
Второй параметр представляет набор разрешений, которые надо получить, в виде массива строк. Нам надо получить в данном случае только одно разрешение — Manifest.permission.READ_CONTACTS.
Третий параметр представляет код запроса, через который мы сможем получить ответ пользователя.
Если мы хотим получить выбор пользователя при установке разрешений, то нам надо переопределить в классе Activity метод onRequestPermissionsResult :
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) < super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_READ_CONTACTS) < if (grantResults.length >0 grantResults[0] == PackageManager.PERMISSION_GRANTED) < READ_CONTACTS_GRANTED = true; >> if(READ_CONTACTS_GRANTED) < loadContacts(); >else < Toast.makeText(this, «Требуется установить разрешения», Toast.LENGTH_LONG).show(); >>
Первый параметр метода requestCode — это тот код запроса, который передавался в качестве третьего параметра в ActivityCompat.requestPermissions() . Второй параметр — массив строк, для которых устанавливались разрешения. То есть одномоментно мы можем устанавливать сразу несколько разрешений.
Третий параметр собственно хранит числовые коды разрешений. Так мы запрашиваем только одно разрешение, то первый элемент массива будет хранить его код. Через условное выражение мы можем проверить этот код: grantResults[0] == PackageManager.PERMISSION_GRANTED . И в зависимости от результата проверки изменить переменную READ_CONTACTS_GRANTED.
И при запуске приложения нам сначала отобразится окно для выдачи разрешения, а после выдачи подтверждений список контактов:
После выдачи разрешения при повторных запусках приложения повторять разрешение не нужно, поэтому метод onRequestPermissionsResult() в таком случае будет срабатывать только один раз. А переменная READ_CONTACTS_GRANTED в этом случае уже будет иметь значение true.
Другоая ситуация — если мы отклоним разрешение. В этом случае при повторном запуске приложения повторно будет отображаться данное окно.
Источник: metanit.com
Что такое content: //com.android.browser.home/?
Много раз, когда вы хотите купить мобильное устройство, старую версию или новые существующие технологии, вы не удовлетворены конфигурацией этого устройства. И уж тем более с количеством приложений, которые в него заложены и которые невозможно удалить из памяти устройства.
Если мы говорим о Браузер по умолчаниюНи для кого не секрет, что многим не нравится интерфейс, который обычно показывается при просмотре веб-страниц. Когда вы пытаетесь открыть указанный браузер, есть код, который ведет вас прямо к этой нежелательной конфигурации, и это не что иное, как Браузер Content Com для Android.
Este код Он очень особенный и выполняет очень важную функцию при входе в браузер. Если вам не нравится форма интерфейса главной страницы, вы можете изменить или изменить ее столько раз, сколько захотите, самым простым способом, который только можете себе представить.
Таким образом, Браузер Content Com для Android Он приведет вас на нужный сайт с помощью шагов, которые мы опишем ниже. И конечно, в этой статье мы подробно покажем вам, что такое content://com.android.browser.home/ и некоторые другие интересные вещи.
Что такое content: //com.android.browser.home/?
content: //com.android.browser.home/ является код который доступен для нескольких устройств Android, чтобы изменить содержимое, которое Браузер по умолчанию что приносит команда.
Многим людям, которые привыкли использовать браузер для входа в Интернет, не нравится тот, который уже интегрирован в Мобильное устройство. И это происходит, возможно, потому, что они не чувствуют себя комфортно или не умеют этим пользоваться и извлекать выгоду из этого.
Вот почему они решили использовать браузер Content Com для Android, чтобы попытаться изменить весь интерфейс браузера которые у них уже есть. Таким образом, им не нужно загружать другое приложение, которое занимает больше места на их устройстве.
Большинство приложений, которые входят в мобильное устройство, обычно открываются через браузер по умолчанию, и для открытия им нужен содержимое кода: //com.android.browser.home/ за его работоспособность. Если вы хотите изменить интерфейс или изменить все содержимое браузера, вы должны сначала иметь некоторые предварительные знания, чтобы сделать это.
Хотя это правда, в настоящее время доступ к настройкам устройства совершенно другой, поскольку уже есть несколько устройств, которые новая технология. Однако процесс изменения браузера по умолчанию одинаков для всех типов компьютеров с Android-система.
Как настроить браузер с помощью Content Com Android Browser?
Чтобы изменить настройки интерфейса вашего Браузер по умолчанию Первое, что вам нужно сделать, это открыть его в своем мобильный. Как только он откроется, перейдите в раздел настроек, нажав на три точки, расположенные в верхней части правой стороны. Однажды там вы должны войти в раздел, в котором говорится: «Конфигурация браузера».
Там вы найдете опцию, позволяющую установить домашнюю страницу по вашему выбору. Вам останется только разместить URL-адрес который вы хотите отображать при открытии браузера, или вы можете просто выбрать опцию пустая страница.
Как вы, возможно, поняли, это не сложный процесс. Однако, если вы не можете найти эту опцию на своем мобильном устройстве, вы можете открыть любую веб-страницу и войти в меню, чтобы выбрать ее как домашняя страница.
Как только вы окажетесь в меню указанной веб-страницы, вам нужно сохранить ссылку в опции, которая говорит «Маркеры» и вы должны выбрать опцию «Добавить в закладки». Когда вы это сделаете, вы должны войти в историю того самого меню и найдите добавленную веб-страницу.
Когда вы найдете веб-страницу в закладках, вы должны оставить ее нажатой, пока не появится опция «Установить как домашнюю веб-страницу». Таким образом, вы полностью измените браузер по умолчанию на вашем Android-устройстве.
Это правильный способ изменить доступ к браузеру. Каждый раз, когда вы идете в Интернет, Браузер Content Com для Android Он покажет вам веб-страницу, которую вы установили в качестве домашней страницы.
Узнайте, с помощью каких приложений вы можете получить root права на телефон Android простым способом.
Что еще можно сделать, если настройки браузера не работают?
Если вы не смогли изменить настройки доступа на браузер по умолчанию, не волнуйтесь, все, что вам нужно сделать, это зайти в приложение Play Store. Таким образом, вы можете скачать браузер по вашему выбору, либо этот Гугл Хром, Опера или Мозилла; Как только загрузка будет выполнена, она будет установлена правильно автоматически.
Важно, чтобы вы чувствовали себя комфортно при просмотре веб-страниц и использовали поисковую систему, которой вы уже привыкли управлять по своему усмотрению. Так же, content: //com.android.browser.home/ Это все равно будет код, который направляет вас к браузеру, который вы уже установили в качестве основного или по умолчанию.
Источник: citeia.com
5 приложений, которые надо удалить с андроида
Техника и интернет
На чтение 5 мин Просмотров 12.4к. Обновлено 19.04.2021
Большинство смартфонов поставляются с кучей предустановленных приложений. Смартфоны с «чистым» андроидом можно пересчитать по пальцам: линейка Nexus, некоторые модели Motorola, и несколько малоизвестных производителей. В остальных случаях производители разрабатывают собственные оболочки, устанавливают приложения на свой вкус и цвет.
С одной стороны, это удобно для пользователей: покупаешь телефон готовый к работе. Не надо тратить время на поиск и установку приложений — достал из коробки и пользуешься. С другой стороны, а чего вдруг такая забота о покупателях?
Если проанализировать установленные производителем приложения на новом смартфоне, окажется, что производители заботятся не только о нас, но и о своём кошельке. Предустановленные приложения можно разделить на четыре группы:
- Нужные, спасибо производителю.
- Вообще-то ненужные, но пусть будут, иногда пригодятся.
- Абсолютно ненужные, которые будут открыты только один раз, из интереса.
- Триал-версии платных приложений. Производитель рассчитывает, что демо-версия вам понравиться, и вы купите полную версию.
В первой группе есть приложения, которые на первый взгляд очень нужные, полезные и незаменимые. А если копнуть глубже, то как раз эти незаменимые и страшно полезные приложения и нужно удалить с андроида в первую очередь.
Что Вы получите после того, как удалите эти приложения:
- увеличится объем свободной внутренней памяти, Вы сможете поставить больше полезных приложений;
- увеличится объем свободной оперативной памяти и снизится нагрузка на процессор, телефон будет работать быстрее;
- уменьшится расход батареи, телефон будет работать дольше;
- уменьшится расход интернета.
Что удалить с андроида в первую очередь
Фейсбук
Официальное приложение Фейсбук — монстр среди приложений на андроиде. Он занимает памяти больше всех, он всегда начеку, всегда висит в оперативной памяти. Впечатление, будто Фейсбук считает себя самым главным приложением на Вашем телефоне.
Другие приложения социальных сетей не такие прожорливые, но тоже считают, что хозяин должен всегда быть в курсе новостей. Поэтому, если Вам не нужно всегда быть в режиме онлайн, есть альтернатива:
- Facebook Lite — приложение от Фейсбук для стран с медленным интернетом. Легкое, нетребовательное, с достаточном функционалом.
- Веб версии социальных сетей в браузере. Несколько закладок на рабочем столе телефона для быстрого доступа заменят все приложения для социальных сетей.
UC Browser
Один из самых популярных браузеров на андроиде. Среди его достоинств отмечают возможность установки дополнительных модулей, в частности — блокировщика рекламы. На первый взгляд, очень удобно — современный браузер с кучей настроек, рекламы на сайтах меньше, блокировщик бодро рапортует о количестве заблокированной рекламы.
Но смущает одно: UC Browser постоянно пихает свою рекламу! Когда Вы запускаете UC Browser, Вы попадете не на экспресс панель с любимыми закладками, а на страницу с рекламными закладками. Иногда при запуске браузера на несколько секунд выскакивает окно с рекламой, на экспресс панели тоже постоянно появляются рекламные закладки.
И если на сайтах Google Adsense старается подобрать рекламу согласно нашим запросам, то UC Browser наплевать на наши интересы.
Альтернатива. Браузер Chrome — полноценный браузер, главное достоинство которого — синхронизация всего и вся с компьютерной версией. Кому мало стандартных настроек, могут попробовать скрытые настройки Chrome. А если нужен легкий экономный браузер для простого серфинга, нет ничего лучше старой Opera Mini.
Антивирусы
Антивирусы на андроиде умеют все: защищают телефон от кражи, помогают найти утерянный телефон, контролируют трафик, чистят систему, и еще борятся с вирусами. Маленький антивирус на простом телефоне умеет больше, чем большой антивирус на мощном компьютере. Интересно, правда?
Правда в том, что как средство борьбы с вирусами, антивирус на андроиде не очень-то нужен. Для защиты андроида от вирусов достаточно:
- не рутировать телефон (не получать права суперпользователя);
- снять в настройках безопасности галочку с пункта «Устанавливать приложения из неизвестных источников»;
- скачивать приложения и игры только официальные, с Play Market, Яндекс.Store или Amazon;
- не переходить по ссылкам в СМС и e-mail, полученных от неизвестных адресатов.
Все. Соблюдайте эти 4 правила, и никакой вирус Вашему андроиду не страшен. Если есть подозрения, можно скачать антивирус, просканировать систему, и удалить его.
Оптимизаторы системы
К этой категории относятся таск-киллеры, чистильщики кеша и системы, хранители батареи и пр. Несмотря на популярность, польза от этих приложений сомнительна.
На первый взгляд, они выполняют важные функции — очищают андроид от мусора, останавливают работающие в фоне приложения, увеличивая свободную оперативную память, и даже экономят заряд батареи.
Но! Оптимизаторы сами постоянно висят в памяти телефона и расходуют батарею. Многие остановленные приложения тут же запускаются снова, дополнительно нагружая систему. И вообще, неужели разогнать разработчики андроида зря получают зарплату?
Погодные виджеты
Помните фразу из фильма «Хоттабыч»: Программа называется «впадло встать и в окно посмотреть».
Периодически обновляя погоду, виджет расходует трафик и заряд батареи. Да, картинка с погодой на экране выглядит красиво. Но ведь прогноз погоды раз в день можно посмотреть в браузере.
На моём телефоне:
- Нет ни одного приложения социальных сетей. При необходимости пользуюсь браузером.
- Стоит браузер Chrome, для серфинга и чтения любимых сайтов чаще использую Оперу Мини.
- Антивируса нет.
- Стоит только Android Assistant, функции автозагрузки и автоочистки выключены.
- Погоду смотрю в браузере.
Телефон работает быстро и долго.
Попробуйте удалить перечисленные в статье приложения, хотя бы на некоторое время. Вы удивитесь, но Ваш телефон будет работать быстрее, а батарея держать дольше. А привыкнуть использовать альтернативные варианты — дело времени.
Проведите эксперимент: пользуйтесь телефоном без этих приложений хотя бы неделю, а потом напишите в комментариях результат.
Источник: polezniesoveti.com
Статьи → Ошибка «процесс android.com.browser»
Если у Вас возникла такая вот ошибка «процесс android.com.browser» то для её решения необходимо сделать следующее:
1. Заходим в Настройки — Приложения.
2. Выбираем Управление приложениями — Все.
3. Выбираем Браузер (может называть Интернет) и и выбираем опцию Удаление данных.
4. Перезагружаем смартфон.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Источник: android-club.org
Делимся файлами в Android с помощью FileProvider
Несколько недель назад мне было поручено открыть внутренний PDF-файл в любом приложении для чтения PDF на Android устройстве. Я думал, что это будет просто, но все оказалось сложнее. Документация Google по FileProvider оказалась запутанной и не имела конкретных примеров. Тем не менее, я знал, что должен использовать ContentProvider для решения этой проблемы.
Как один из примеров использования FileProvider, вы можете посмотреть следующий урок.
Что такое FileProvider?
ContentProvider — это компонент Android, который инкапсулирует данные и предоставляет их другим приложениям. Это необходимо в случае, если вам нужно обмениваться данными между несколькими приложениями. Например, данные контактов совместно используются другими приложениями, используя ContactsProvider, который является подклассом ContentProvider.
FileProvider — это подкласс ContentProvider. Хотя ContentProvider — это компонент, который позволяет вам безопасно делиться любыми данными, FileProvider используется специально для совместного использования внутренних файлов приложения. Класс FileProvider является частью библиотеки поддержки v4, поэтому обязательно включите ее в свой проект.
Чтобы заставить FileProvider работать, нужно выполнить следующие три действия:
- Определить FileProvider в файле AndroidManifest.xml;
- Создать XML-файл, содержащий все пути, которые FileProvider будет использовать совместно с другими приложениями;
- Связать действительный URI в Intent и активировать его.
Определение FileProvider
Чтобы определить FileProvider внутри AndroidManifest.xml, вам необходимо ознакомиться с этими атрибутами и элементами:
- android:authorities
- android:exported
- android:grantUriPermissions
- android:name
- субэлемент
Если всё это вам уже знакомо, ваше изучение FileProvider пройдёт немного легче, иначе я подготовил подробное описание каждого атрибута и его цели.
android:authorities
Вы должны определить хотя бы одно уникальное полномочие. Система Android хранит список всех поставщиков, и она отличает их по полномочиям. Полномочие определяет FileProvider точно так же, как ID приложения определяет приложение для Android.
В общем, Android-система использует определенную схему URI для ContentProviders. Схема определяется как content:/// , поэтому система будет знать, какой ContentProvider запрашивается, сопоставляя полномочия URI с полномочиями ContentProvider.
android:exported
Этим атрибутом можно легко злоупотребить, потому что его имя вводит в заблуждение. Чтобы понять смысл этого атрибута, подумайте о своем FileProvider как о комнате с запертыми дверями. Если вы установите значение true, вы в основном откроете свои двери для всех. Все будет работать как вы и программировали, но вы только что создали огромную проблему безопасности, так как каждое другое приложение сможет использовать ваш FileProvider без получения разрешения.
Это должно научить вас никогда не программировать по наитию и всегда быть в курсе побочных эффектов вашего кода. Кроме того, всегда определяйте этот атрибут, потому что значение по умолчанию для SDK 16 и ниже true.
android:grantUriPermissions
Если мы продолжим думать о FileProvider как о запертой комнате, то этот атрибут используется для предоставления временного одноразового ключа для внешнего приложения. Этот атрибут позволяет безопасно обмениваться внутренним хранилищем вашего приложения. Все, что вам нужно сделать, это добавить FLAG_GRANT_READ_URI_PERMISSION или FLAG_GRANT_WRITE_URI_PERMISSION в намерение, которое активирует компонент для открытия внутреннего файла вашего приложения. Чтобы использовать эти флаги, установите для них значение true.
Элемент может также иметь субэлементы . Единственное различие заключается в том, что с помощью атрибута вы можете поделиться чем-либо внутри внутреннего хранилища вашего приложения, в то время как субэлементы позволяют вам выбрать конкретное подмножество данных для совместного использования. Чтобы вместо этого использовать субэлементы, установите значение false.
субэлемент
Этот субэлемент должен быть определен при использовании FileProvider. Вы должны определить путь к XML-файлу, который содержит все пути данных, которые ваш FileProvider может использовать с внешними приложениями.
XML-файл должен иметь элемент в качестве его корня. Элемент должен иметь как минимум один дочерний элемент, который может быть следующим:
- — внутреннее хранилище приложения, Context#getFilesDir()
- — кэш внутреннего хранилища приложения, Context#getCacheDir()
- — публичное внешнее хранилище, Environment.getExternalStorageDirectory()
- — внешнее хранилище приложения, Context#getExternalFilesDir(null)
- — кэш внешнего хранилища приложения, Context#getExternalCacheDir()
Возможно, вы заметили, что они различаются в зависимости от каталога приложения, которое они определяют.
Каждый элемент должен иметь атрибуты path и name. Атрибут path определяет подкаталог, который вы хотите использовать, и он не поддерживает подстановочные знаки. Атрибут name используется по соображениям безопасности, и он заменит ваше имя подкаталога на его значение.
android:name
С помощью этого атрибута мы устанавливаем это значение для android.support.v4.content.FileProvider.
После того, как вы определили FileProvider в своем AndroidManifest.xml, вы, наконец, готовы его использовать. Чтобы поделиться файлом, вам нужно создать намерение и предоставить ему действительный URI. URI генерируется с использованием класса FileProvider.
Реализация кода
androidmanifest.xml
Обратите внимание, что я использую идентификатор приложения для полномочий. Это связано с тем, что у меня есть несколько разновидностей в проекте, и они могут быть установлены на устройстве одновременно. Система Android не позволит вам устанавливать несколько приложений с одним и тем же FileProvider, поэтому каждая разновидность должна иметь уникальные полномочия.
file_provider_paths.xml
Определяя пути, подобные этому, я разрешаю FileProvider делиться всеми файлами, находящимися внутри внутреннего кэша и каталога файлов приложения.
Использование вашего FileProvider
// создаём новое намерение Intent intent = new Intent(Intent.ACTION_VIEW); // устанавливаем флаг для того, чтобы дать внешнему приложению пользоваться нашим FileProvider intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // генерируем URI, я определил полномочие как ID приложения в манифесте, последний параметр это файл, который я хочу открыть String uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file); // я открываю PDF-файл, поэтому я даю ему действительный тип MIME intent.setDataAndType(uri, «application/pdf»); // подтвердите, что устройство может открыть этот файл! PackageManager pm = getActivity().getPackageManager(); if (intent.resolveActivity(pm) != null)
Как только вы поймете, как это работает, реализация вашего собственного FileProvider станет действительно простой.
Сложность проблемы заключается не в самом коде, а в документации и понимании того, как все взаимосвязано. Я надеюсь, что эта статья поможет вам реализовать FileProvider для вашего собственного использования и упростить чтение официальной документации.
Раздел: Кодинг Метки: Android, code, file, fileprovider, lesson, manifest, provider, xml
Делимся файлами в Android с помощью FileProvider : 9 комментариев
- Евгений 20.06.2019 android_name=»android.support.v4.content.FileProvider»
почему в моем провайдере подсвечивается красным v4.content.FileProvider
- dimonbugor 12.08.2019 androidx?
- Роман 15.11.2019 В androidx это androidx.core.content.FileProvider
- Иван 04.08.2020 Большое спасибо
Источник: android-tools.ru