Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Права доступа

Android позволяет создавать приложения с различными правами доступа.

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

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

Рассмотрим пример. Для примера нам понадобятся два приложения. Создайте первое приложение с двумя активностями. На первой активности добавьте кнопку для перехода на вторую активность. Вторая активность - это стандартная активность, только поменяйте текст у TextView на "Только для избранных", чтобы не запутаться.

Теперь откройте файл манифеста. В обязательном атрибуте android:name следует указать имя права доступа. Рекомендуется использовать стандартную схему именования *.permission.*. Вспомните, как выглядят системные разрешения, например, для доступа к интернет: android.permission.INTERNET

В атрибуте android:protectionLevel нужно указать степень риска. Может принимать значения:

  • normal - риск невысок и не можете повредить пользователю, системе или другим приложениям.
  • dangerous - высокая вероятность что-то испортить. Система может запросить у пользователя дополнительные данные, прежде чем разрешить такой доступ.
  • signature - доступ предоставляется только тем приложениям, которые подписаны той же цифровой подписью, что и приложение, в котором объявлено право доступа.
  • signatureOrSystem - доступ предоставляется приложениям с той же подписью или классам пакетов Android. Это специфический случай, который чаше используется производителями.

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

В нашем примере код может выглядеть так:


<permission
    android:name="alexanderklimov.permission.START_ACTIVITY"
    android:label="Start my Activity"
    android:protectionLevel="normal"
    android:description="@string/permission_description">
</permission>

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

На этом редактирование манифеста не закончено. Теперь надо прописать созданное право доступа для второй активности:


<activity
    android:name="ru.alexanderklimov.test.ProtectActivity"
    android:label="@string/title_activity_protect"
    android:permission="alexanderklimov.permission.START_ACTIVITY" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

В рамках одного приложения вы не будете испытывать проблем с запуском второй активности. Однако попробуем создать теперь второе приложение с кнопкой и попытаемся открыть вторую активность. В намерении нужно указать имя пакета и класса от первого приложения:


public void onClick(View v) {
	Intent intent = new Intent();
    intent.setClassName("ru.alexanderklimov.test", "ru.alexanderklimov.test.ProtectActivity");
	startActivity(intent);
}

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


<uses-permission android:name="alexanderklimov.permission.START_ACTIVITY"/>

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

Мы рассмотрели только один случай настройки прав доступа к активности. Существуют права доступа и к другим объектам.

Реклама