Com android contacts что это за программа
Перейти к содержимому

Com android contacts что это за программа

  • автор:

com.samsung.android.contacts что это?

Всем привет Сегодня я должен узнать что такое com.samsung.android.contacts — как уже видим, это из мира Андирод. Возможно вы это где-то заметили, может среди приложений, а… может у вас ошибка выскочила. Моя задача — найти информацию и я вас не подведу

Не буду много писать, скажу сразу что com.samsung.android.contacts — это приложение Контакты. И как я понимаю — оно системное. Значит удалять его не опасно. В самом крайнем случае можно попробовать заморозить, но тогда телефонная книга станет недоступной, учтите, а могут быть и другие косяки..

Важно! Если у вас производитель телефона не Самсунг, то это может быть вирус. Тогда немедленно просканируйте Андирод на вирусы, используйте например для этого антивирус Dr.Web или Касперский.

Я немного побродил по интернету.. и есть некоторые мысли:

  1. com.samsung.android.contacts — это приложение Контакты (Contacts), версия может быть разная, например 1.1.32.
  2. Данное приложение может быть предустановленным в прошивке, например оно есть на телефоне Samsung SM-G532F. Не уверен, но кажется что на других телефонах, то есть не Самсунг, то там приложение Контакты имеет идентификатор com.android.contacts.
  3. Один юзер отключил приложение и некоторые другие, и сообщает что никаких глюков или косяков в работе телефона нет.
  4. При необходимости можно попробовать отключить или заморозить. Кстати для заморозки советую Titanium Backup
  5. Также приложение Контакты возможно необходимо для сохранения контакта на симку или на телефон. То есть если приложение удалить, то может быть такое.. что вы не сможете добавить номер в телефонную книгу.. ужс

Вот собственно само приложение (сори что плохо видно):

Еще одно подтверждение что это Контакты:

Кроме этого приложения вы можете найти и другие, а именно:

  1. Галерея — com.sec.android.gallery3d.
  2. Сообщения — com.samsung.android.messagin.

Что делать, если выскакивает ошибка?

Мое мнение, что при ошибке в системном приложении, то тут.. даже не знаю что думать. Если вы недавно ставили прошивку новую, например не официальную, а кастомную — то высокая вероятность что дело именно в ней..

Второй вариант — вы установили какое-то приложение, что и вызвало ошибку.

Может быть пришли обновления по воздуху? И из-за них ошибка..

В общем с таким вопросом лучше идти на форум, я советую 4PDA — крупный русский форум, где сидят много хороших людей. Там есть раздел Андроид и в нем можно задать вопрос. Да, придется зарегится и немного понять что к чему.. но оно того стоит. Решать вам, я просто посоветовал

На этом все. Удачи вам и берегите себя

Основы Contacts API в Android

Совсем недавно мне нужно было сделать приложение в котором была необходима поддержка функционала работы с пользовательскими контактами на базовом уровне и, как наверное любой начинающий Android разработчик, я прибывал в небольшом ступоре после поверхностного изучения нового Contacts API. Во время работы я нашел совсем не много информации на эту тему (кроме самой документации конечно), а на русском языке, как мне показалось, она и вовсе отсутствует. Поэтому я и решил написать эту статью и поделиться своим опытом с другими. В ней я постараюсь охватить только основы работы с контактами в Android, не затрагивая более глубокие вопросы и вопросы синхронизации, которые по моему заслуживают отдельной статьи.

Введение

Начиная с версии 5 API Android SDK интерфейс работы с контактами изменился, а основной контент провайдер Contacts и все его составляющие получили черную метку @Deprecated. Теперь за работу с контактами отвечает провайдер ContactsContract. Эти изменения связаны с изменением структуры хранения контактов, более адаптированной для Android устройств, которым требуется хранить контакты из множества разных источников и предоставлять их пользователю как единую сущность. Ведь сегодня, определенный контакт на нашем мобильном устройстве это не только имя и номер телефона, мы можем захотеть сохранить eMail, Im, Twitter, Facebook аккаунт определенного человека, и при этом, мы не хотим чтобы у нас нас появилось миллион непонятных записей. Поэтому новый Contacts API позволяет Android агрегировать похожие контакты и представлять их пользователю в одной записи, а также связывать контакт с разного рода данными.

Структура данных

На устройстве основная информация о контактах хранится в трех таблицах, на деле их там конечно больше, но мы рассмотрим основные три: contacts, raw_contacts и data. Чтобы было более наглядно я набросал простую схему в Dia.

В таблице contacts хранятся агрегированные контакты, каждая запись в этой таблице представляет собой пользовательский контакт (единую сущность) – объединение одного или нескольких сырых (необработанных) контактов из таблицы raw_contacts. Как видно на схеме, связь между этими таблицами один ко многим (1-N). Одна запись в таблице raw_contacts представляет собой так называемый сырой контакт. Сырой контакт, на языке Android, означает какой-то конкретный набор данных для определенного контакта. Но сами основные данные в этой таблице не хранятся, они хранятся в таблице data, и связь между raw_contacts и data также один ко многим. В таблице data хранятся непосредственно данные. Причем каждая строка этой таблицы это набор данных определенного типа для контакта. Какого именно типа данные хранятся в строке определяется столбцом mimetype_id, в котором содержится id типов данных определенных в таблице mimetype(например vnd.android.cursor.item/name, vnd.android.cursor.item/photo). Теперь разберемся во всем по подробней и с примерами.

Работаем с контактами

Хорошо, допустим мы хотим добавить контакт (Robert Smith, моб.тел. 11-22-33), как нам это сделать? В таблицу contacts мы сами, явно, не можем добавить контакт, так как система сама формирует эту таблицу агрегируя похожие raw_contacts. Идентичность контактов система определяет в основном по имени (одинаковые имена, фамилии и т.п.), но и по другим критериям, каким именно и как ими управлять можно посмотреть в документации. То есть, если мы добавим raw_contact нашего Роберта (Robert Smith) и свяжем его с данными типа vnd.cursor.android.item/phone, а потом у нас появится “похожий”, для системы, Robert Smith связанный с данными типа vnd.cursor.android.item/email и еще один с данными типа vnd.cursor.android.item/photo, то у нас в контактах будет один Robert Smith с фотографией, мобильным и email’ом.

Теперь попробуем переложить это на код. За таблицы и их поля отвечает, как я уже говорил, класс ContactsContract и его внутренние классы и интерфейсы. Например интерфейсом к таблице raw_contacts является класс ContactsContract.RawContacts, а за таблицу data класс ContactsContract.Data. Будьте внимательны когда изучаете их константы – интерфейсы к столбцам – обращайте внимание на метки read/write и read only.

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

import android.provider.ContactsContract; Uri rawContactUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, new ContentValues()); 

В контактах у вас должен появиться пустой (Unknown) контакт, ни с чем не связанный. Добавим ему имя. Чтобы это сделать, мы должны связать наш новый контакт с новыми данными используя его id, который можно достать из прошлого запроса. Основные интерфейсы к полям таблицы данных содержаться в классе-контейнере ContactsContract.CommonDataKinds и его внутренних классах и интерфейсах. Например, сейчас нам понадобиться
класс ContactsContract.CommonDataKinds.StrucruredName содержащий нужные нам константы для добавления имени, а также константу MIME типа, которой мы пометим наше поле в таблице данных.

/* Получаем id добавленного контакта */ long rawContactId = ContentUris.parseId(rawContactUri); ContentValues values = new ContentValues(); /* Связываем наш аккаунт с данными */ values.put(Data.RAW_CONTACT_ID, rawContactId); /* Устанавливаем MIMETYPE для поля данных */ values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); /* Имя для нашего аккаунта */ values.put(StructuredName.DISPLAY_NAME, "Robert Smith"); getContentResolver().insert(Data.CONTENT_URI, values); 

Если мы добавим контакт таким образом, то в списке контактов у нас появиться Robert Smith. Теперь идем дальше, добавим нашему контакту еще и телефон. Для этого нам понадобиться класс ContactsContract.CommonDataKinds.Phone, который является интерфейсом к данным телефонного номера.

values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); /* Тип данных – номер телефона */ values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); /* Номер телефона */ values.put(Phone.NUMBER, "11-22-33"); /* Тип – мобильный */ values.put(Phone.TYPE, Phone.TYPE_MOBILE); getContentResolver().insert(Data.CONTENT_URI, values); 

Теперь в контактах у нас есть Robert Smith которому можно позвонить. Но вот так добавлять контакт и данные к нему, в несколько запросов, дорого и накладно. Поэтому существует класс ContentProviderOperation, который позволяет построить запрос, который выполнит все наши операции за одну транзакцию. Именно им и рекомендуют пользоваться. Вот так можно добавить нашего Роберта используя ContentProviderOperation.

ArrayList op = new ArrayList(); /* Добавляем пустой контакт */ op.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) .withValue(RawContacts.ACCOUNT_TYPE, null) .withValue(RawContacts.ACCOUNT_NAME, null) .build()); /* Добавляем данные имени */ op.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue(StructuredName.DISPLAY_NAME, "Robert Smith") .build()); /* Добавляем данные телефона */ op.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue(Phone.NUMBER, "11-22-33") .withValue(Phone.TYPE, Phone.TYPE_MOBILE) .build()); try < getContentResolver().applyBatch(ContactsContract.AUTHORITY, op); >catch (Exception e)

Вот таким образом в Android можно добавлять контакты. Будьте осторожны используя ContentProviderOperation, так как слишком большой запрос может долго выполняться. Вообще все операции лучше производить в отдельном потоке, потому, что у пользователя, например, может быть слабый телефон и много контактов.

В остальном все другие операции выполняются обычным образом, используя те провайдеры, которые вам необходимы, с некоторыми оговорками. Например, удаление контакта из таблицы contacts удалит все raw_contacts с ним связанные и т.д.

Вот так можно попробовать найти нашего Роберта в контактах:

Cursor c = getContentResolver().query( Contacts.CONTENT_URI, new String[] , Contacts.DISPLAY_NAME + " = 'Robert Smith'", null, null); if(c.getCount() > 0) < /* Найдено */ >else < /* Не найдено */ >

На этом хотелось бы завершить статью, все же это были только основные сведения о Contacts API в Andoid. Я надеюсь мне удалось описать здесь основные принципы, а вся конкретика зависит от того, что вам необходимо сделать в процессе работы. Можно просто руководствоваться этими принципами и находить в официальной документации интерфейсы которые вам нужны для работы. Успехов!

Основы Contacts API в Android

Интерфейс работы с контактами изменился начиная с 5-ой версии API Android SDK : провайдер Contacts и все его составляющие получили статус @Deprecated. Теперь за работу с контактами отвечает провайдер ContactsContract, который внёс изменения в структуру хранения контактов, более адаптированную для Android устройств, позволяющую хранить контакты из разных источников и предоставлять их пользователю как единую сущность. В настоящее время объект описания контакта на мобильном устройстве включает не только имя и номер телефона, но и Email, Twitter, Facebook и т.д. Новый ContactsContract API позволяет системе агрегировать похожие контакты и выдавать их пользователю в одной записи, а также связывать контакт с разного рода данными.

Пользовательские данные хранятся в центральном репозитории устройства, которым управляет поставщик контактов — эффективный и гибкий компонент Android. Поставщик контактов — это источник данных, которые отображаются в приложении «Контакты» на Вашем устройстве.

Структура поставщика контактов

Поставщик контактов содержит в себе три типа данных о пользователе, как это представлено на рисунке. Каждый тип данных хранится в отдельной таблице :

В качестве наименований таблиц обычно используются названия соответствующих классов-контрактов ContactsContract. Эти классы определяют константы для URI контента, названий столбцов и значений в столбцах этих таблиц :

ContactsContract.Contacts
Строки в таблице Contacts содержат данные о пользователях, полученные путем агрегации строк необработанных контактов.

ContactsContract.RawContacts
Строки в таблице RawContacts содержат сводные данные о пользователях, относящиеся к пользовательским учетным записям и их типам.

ContactsContract.Data
Строки в таблице Data содержат сведения о необработанных контактах, например email или номера телефонов.

Имеются и другие таблицы, представленные классами-контрактами ContactsContract и представляющие собой вспомогательные таблицы. Эти таблицы поставщик контактов использует для управления своими операциями и поддержки определенных функций, имеющихся в приложении устройства «Контакты» или приложениях для телефонной связи.

Разрешения на доступ к поставщику контактов

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

// Доступ на чтение записей // Доступ на внесение и обновление записей

Профиль пользователя

Разрешения на доступ к данным поставщика контактов не распространяются на работу с профилями пользователя.

Примечание : данные о контактах пользователя являются личными и конфиденциальными. Владельцы мобильных устройств заботятся о своей конфиденциальности и часто не проявляют желания предоставлять приложениям возможности сбора данных о них самих и/или их контактах. Если владельцам не до конца ясно, для чего требуется предоставить приложению разрешение на доступ к данным контактов, они могут присвоить Вашему приложению низкий рейтинг, или вообще откажутся его устанавливать.

Строка контактов профиля связана со строкой необработанных контактов в каждой из систем, в которой используется профиль. В каждой строке необработанного контакта профиля может содержаться несколько строк данных. Константы для доступа к профилю пользователя представлены в классе ContactsContract.Profile.

Для доступа к профилю пользователя требуются отдельные разрешения. Наряду с разрешениями READ_CONTACTS и WRITE_CONTACTS (чтение и запись контакта) для доступа к профилю пользователя необходимы разрешения android.Manifest.permission#READ_PROFILE и android.Manifest.permission#WRITE_PROFILE на чтение и запись соответственно.

Помните, что профиль пользователя представляет собой конфиденциальную информацию. При запросе доступа к личной информации на устройстве пользователя обязательно укажите, для чего вам требуется доступ к профилю пользователя.

// Определение полей для чтения профиля mProjection = new String[] < Profile._ID, Profile.DISPLAY_NAME_PRIMARY, Profile.LOOKUP_KEY, Profile.PHOTO_THUMBNAIL_URI >; // Чтение профиля поставщика контактов mProfileCursor = getContentResolver().query( Profile.CONTENT_URI, mProjection, null, null, null);

Примечание : если при получении нескольких строк контактов необходимо определить, какая из них является профилем пользователя, анализируйте значение столбца IS_USER_PROFILE этой строки. Для профиля пользователя значение должно быть «1».

Пример чтения контактов

Рассмотрим простой пример чтения списка контактов и вывода их в журнал Log. Ниже представлен листинг метода onCreate главного модуля приложения MainActivity.

public class MainActivity extends AppCompatActivity < private final String TAG = "CONTACT"; private final int PERMISSIONS_REQUEST_READ_CONTACTS = 10; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Проверка разрешения if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) < // Разрешения чтения контактов имеются Log.d(TAG, "Permission is granted"); readContacts(this); >else < // Разрешений нет Log.d(TAG, "Permission is not granted"); // Запрос разрешений Log.d(TAG, "Request permissions"); ActivityCompat.requestPermissions(this, new String[]< Manifest.permission .READ_CONTACTS>, PERMISSIONS_REQUEST_READ_CONTACTS); > > >

Перед выполнением запроса проверим, имеются ли у нас необходимые разрешения на доступ к контактам. Для этого используем метод ContextCompat.checkSelfPermission, которому в качестве параметров передадим контекст модуля и идентификатор разрешений списка контактов. Если приложение имеет разрешения (permission), то метод вернет значение PERMISSION_GRANTED, в противном случае PERMISSION_DENIED.

При наличии необходимых разрешений вызываем метод чтения контактов readContacts, представленный ниже. В противном случае запросим необходимые разрешения методом ActivityCompat.requestPermissions, которому в качестве параметров необходимо передать контекст модуля, список запрашиваемых разрешений и «определенную в модуле константу» (PERMISSIONS_REQUEST_READ_CONTACTS).

Примечание : при запросе приложением «разрешения» методом requestPermissions(), система открывает стандартное диалоговое окно подтверждения доступа. Приложение не может изменить интерфейс диалогового окна. Если имеется необходимость представить пользователю дополнительную информацию, то это желательно сделать перед открытием окна запроса подтверждения. После запроса первого подтверждения и получения положительного ответа система запоминает результат ответа и больше не открывает окно подтверждения доступа.

Результат выполнения запроса на получение разрешений система возвращает вызовом callback метода onRequestPermissionsResult, листинг которого представлен ниже.

Листинг callback метода запроса разрешений

Система вызывает callback метод onRequestPermissionsResult при запросе разрешений методом requestPermissions. В качестве параметров методу передается массив запрошенных permissions и массив разрешений grantResults.

В примере проверяем результат полученного от системы ответа. При наличии необходимых разрешений вызывается метод readContacts.

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) < switch (requestCode) < case PERMISSIONS_REQUEST_READ_CONTACTS : < // При отмене запроса массив результатов пустой if ((grantResults.length >0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) < // Разрешения получены Log.d(TAG, "Permission was granted!"); // Чтение контактов readContacts(this); >else < // Разрешения НЕ получены. Log.d(TAG, "Permission denied!"); >return; > // другой 'case' получения permissions > >
Листинг метода чтения контактов

Метод чтения контактов readContacts в качестве параметра получает контекст приложения, используемый для вызова метода getContentResolver().query и получения результата в виде курсора. Если курсор содержит список контактов, то метод в цикле перебирает этот список и выводит в Log параметры контактов (id, name, phone). Метод можно доработать, чтобы он возвращал список контактов в виде List.

private void readContacts(Context context) < Contact contact; Cursor cursor=context.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if(cursor.getCount() >0) < while(cursor.moveToNext()) < contact = new Contact(); String cursor.getColumnIndex( ContactsContract.Contacts._ID)); contact.setId(id); String name = cursor.getString( cursor.getColumnIndex( ContactsContract.Contacts .DISPLAY_NAME)); contact.setName(name); String has_phone = cursor.getString( cursor.getColumnIndex( ContactsContract.Contacts .HAS_PHONE_NUMBER)) if (Integer.parseInt(has_phone) >0) < // extract phone number Cursor pCur; pCur = context.getContentResolver().query( ContactsContract.CommonDataKinds .Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds .Phone.CONTACT_ID + " = ?", new String[], null); while(pCur.moveToNext()) < String phone = pCur.getString( pCur.getColumnIndex( ContactsContract. CommonDataKinds. Phone.NUMBER)); contact.setPhone(phone); >pCur.close(); > Log.d(TAG, "Contact + contact.getId() + ", name=" + contact.getName () + ", phone=" + contact.getPhone()); > > >
Листинг класса Contact

Класс описания контакта, используемого в методе чтения контактов устройства.

public class Contact < private String id; private String name = ""; private String phone = ""; public String getName() < return name; >public void setName(String name) < this.name = name; >public String getPhone() < return phone; >public void setPhone(String phone) < this.phone = phone; >public String getId() < return id; >public void setId(String id) < this.id = id; >>

Об открытости данных в Android-приложениях

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

Компоненты

Архитектуру Android-приложения можно представить в виде набора компонент (activities, services и пр.) и связей между ними. Android API предоставляет несколько стандартных способов общения между компонентами приложения: старт активити/сервис через контекст, отправка сообщений-интентов, использование ServiceConnection или ContentProvider’а и другое. Обо всём этом можно почитать в любом туториале о передаче данных в Android. Однако, есть один нюанс, о котором, как правило, умалчивается. Речь идет о доступности ваших компонент и данных, передаваемых между ними, для других приложений.

Activity

Для запуска одной из своих активити вы, наверняка, используете специально подготовленный intent:

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class); startActivity(myIntent); 

Используя Context и Class, которые вы передали в конструктор интента, Android определяет package приложения и сам класс нужной активити, после чего запускает её.

Вы также можете попробовать запустить чужую активити, зная ее package name и class name:

Intent intent = new Intent(); /* Одна из активити стандартного приложения Контакты*/ intent.setClassName("com.android.contacts", "com.android.contacts.activities.PeopleActivity"); startActivity(intent); 

Результат — запущенная активити.

Значит ли это, что все активити могут быть запущены сторонним приложением? Нет. Если заменить в предыдущем примере classname на

intent.setClassName("com.android.contacts", "com.android.contacts.preference.ContactsPreferenceActivity"); 

то мы получим java.lang.SecurityException.

На самом деле разработчик приложения сам решает, какие активити будут доступны, а какие нет, указывая для каждой активити в манифесте тэг android:exported равным true или false соответственно. Значение по умолчанию для этого тега ‒ false, т.е. все активити в AndroidManifest.xml, не имеющие этого тега, доступны только внутри приложения.

Однако, посмотрев на манифест приложения Контакты (например, тут) можно заметить, что у PeopleActivity нет тега android:exported=«true», почему же нам удалось её запустить? Ответ можно найти в официальной документации: если активити содержит какой-либо интент-фильтр, то значением по умолчанию для android:exported будет true.

Разработчику приложения не нужно беспокоиться о видимости своих activity вне приложения до тех пор, пока в какой-либо активити не появляется intent-filter. Как только вы объявляете intent-filter, спросите себя, готовы ли вы к тому, что эта активити может быть запущена кем-либо еще. Если нет — не забудьте указать .

Service

Видимость сервиса определяется также как и видимость активити, и мы бы не стали уделять сервисам отдельный пункт, если бы не одно “но”. В случае с сервисом, его видимость может завести куда дальше, чем незапланированный старт, как в случае с активити. Если в вашем сервисе предусмотрена возможность биндинга, то этой возможностью могут воспользоваться и другие и получить ссылку на ваш сервис через ServiceConnection. Давайте рассмотрим пример подключения к стандартному сервису воспроизведения музыки.

Примечание: следующий пример актуален только на достаточно старых версиях плеера. В свежей версии разработчики разобрались с флагом exported и установили его в false 🙂

Intent intent = new Intent(); /* Сервис проигрывания аудио - часть стандартного плеера */ intent.setClassName("com.android.music", "com.android.music.MediaPlaybackService"); ServiceConnection conn = new MediaPlayerServiceConnection(); /* Подключение к сервису */ bindService(intent , conn, 1); class MediaPlayerServiceConnection implements ServiceConnection < public void onServiceConnected(ComponentName name, IBinder boundService) < Log.i("service connection", "Connected! Name: " + name.getClassName()); >public void onServiceDisconnected(ComponentName name) < Log.i("MediaPlayerServiceConnection", "Disconnected!"); >> 

После биндинга в переменной boundService будет храниться ссылка на сервис. Далее вы можете воспользоваться java reflection или Android Interface Definition Language (AIDL), чтобы иметь возможность вызывать методы сервиса напрямую, в результате чего можно, например, остановить воспроизведение, если стандартный плеер уже что-то играет.

Рекомендации в этом случае такие же: установите для всех сервисов, имеющих какой-либо интент фильтр, если вы не планируете оставить его публичным.

ContentProvider

Основное предназначение ContentProvider’а — предоставление данных другим приложениям. Именно поэтому по умолчанию значение тега для этого компонента приложения равно true. Но основное предназначение — не единственное. ContentProvider часто используется:

  • при реализации подсказок при поиске
  • при обмене данных через Sync Adapter
  • как уровень абстракции над базой данных
BroadCast
  1. Создание intent’а
  2. Отправка intent’а через Context#sendBroadcast(. )
  3. Получение intent’а всеми зарегистрированными BroadcastReceiver’ами.
intent.setPackage(“com.android.example.mypackage”) 

или воспользоваться LocalBroadcastManager (доступен в support library), который также не даст улететь сообщению за границы приложения (на самом деле процесса):

LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 

Более того, LocalBroadcastManager позволяет регистрировать приёмники, так что вы можете быть уверены, что получаемые такими приёмниками интенты тоже являются локальными, а не прилетают извне.

Ресурсы

Если коротко, то все используемые в приложении ресурсы доступны для чтения вне приложения. Для получения некоторых из них достаточно знать только package name целевого приложения:

PackageManager pm = getPackageManager(); /* Иконка приложения Youtube */ Drawable icon = pm.getApplicationIcon("com.google.android.youtube"); /* Логотип приложения Youtube */ Drawable logo = pm.getApplicationLogo("com.google.android.youtube"); ApplicationInfo applicationInfo = pm.getApplicationInfo("com.google.android.youtube", 0); /* Название приложения Youtube */ CharSequence applicationLabel = pm.getApplicationLabel(applicationInfo); 

Если вам известна информация об активити внутри приложения, вы можете проделать подобные операции для каждой из них отдельно.

Узнав имя конкретного ресурса, можно получить и его:

Resources r = getPackageManager().getResourcesForApplication("com.google.android.youtube"); /* Картинка-превью для виджета Youtube * youtube_widget_preview - имя файла * drawable - директория, в которой находится файл * com.google.android.youtube - package name */ int "drawable", "com.google.android.youtube"); Drawable drawable = r.getDrawable(id); ImageView iw = new ImageView(context); iw.setImageDrawable(drawable); rootView.addView(iw); 

Этим способом мы смогли отобразить картинку-превью для виджета Youtube внутри собственного приложения.

Главная загвоздка с ресурсами в том, что здесь нет способа их скрыть. Хранение приватных данных в ресурсах — плохая идея, но если у вас есть такая необходимость, лучше хранить их в зашифрованном виде.

В завершении статьи хотелось бы сказать еще несколько слов о файловой системе в Android. Этот вопрос уже хорошо освещен, многие знают, что в Android для каждого приложения создается собственная директория /data/data/«app package name», доступ к которой имеет только само приложение (или группа приложений c одним sharedUserId). В этой директории находятся файлы настроек SharedPreferences, файлы базы данных приложения, кэш и многое другое, однако, не стоит полагаться на защищенность этого хранилища. Файлы в этой директории недоступны только до тех пор, пока:

  • вы создаете файлы с флагом Context.MODE_PRIVATE
  • на устройстве не получен root-доступ
  • приложение не будет обработано каким-либо менеджером backup’ов.
  • android
  • android development
  • development
  • mobile development
  • Блог компании True Engineering
  • Разработка под Android

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *