Передача прав доступа к URI в намерения
Когда приложение вызывает другую активность и передает ей URI, то приложение может передать и права доступа к этому URI. Но для этого оно само должно иметь доступ к этому URI, а поставщик контента для URI должен иметь возможность совместной работы и выдачи прав доступа другой активности. Код вызова активности с выдачей прав доступа выглядит, как показано в е 14.9 — он взят из программы Android Email, где запускается активность для просмотра почтового вложения.
try {
Intent intent = new Intent(Intent.ACTION VIEW); intent.setData(contentUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
} catch (ActivityNotFoundException e) { mHandler.attachmentViewError();
// TODO: добавить в следующем выпуске соответствующее предупреждение // (и большую очистку, чтобы оно не понадобилось).
}
Вложение указывается с помощью функции. Обратите внимание, что намерение создается с действием 1пЕепЕ.АСТ10Ы_У1Е¥, а данные устанавливаются с использованием зеББаБа() . Вдобавок устанавливается флаг для выдачи права на чтение вложения любой активностью, которая соответствует данному намерению. Именно здесь вступает в игру поставщик контента. То, что активность имеет право на чтение контента, не означает, что она может передавать это право какой-то другой активности, у которой нет такого права. Это должен также разрешить поставщик контента. Когда Android находит фильтр намерений, соответствующий активности, он сверяется с поставщиком контента, можно ли выдать права доступа. В сущности, у поставщика контента запрашивается разрешение доступа этой новой активности к контенту, указанному URI. Если поставщик контента откажется выдать права доступа, возникает исключение SecurityException, и операция завершается неудачно. Приложение в е 14.9 не проверяет возникновение исключения SecurityException, т.к. разработчик не ожидает отказа в предоставлении доступа — ведь поставщик контента вложения является частью приложения Email. Правда, существует вероятность, что не найдется ни одной активности для обработки вложения, поэтому осуществляется проверка только на исключение ActivityNotFoundException.
Если активность, вызываемая для работы с URI, имеет разрешение на доступ к этому URI, то поставщик контента не должен отказывать в доступе. То есть вызывающая активность может разрешить доступ, а если активность на принимающей стороне намерения уже имеет необходимые права доступа, то вызванной активности будет позволено выполнить обработку без каких-либо ограничений.
Кроме Intent.FLAG_GRANT_READ_URI_PERMISSION существует флаг для права на запись: Intent.FLAG_GRANT_WRITE_URI_PERMISSION. В намерении можно указать оба флага. Эти флаги можно также применять к службам и широковещательным приемникам, а также к активностям, поскольку они могут принимать намерения.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.