Перенаправление разрешения URI содержимого из Activity в связанную службу в другом приложении

#android #android-intent #uri #android-contentprovider

#Android #android-намерение #uri #android-contentprovider

Вопрос:

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

Проблема в том, что служба загрузки (в третьем приложении) не всегда имеет доступ к URI содержимого и иногда терпит неудачу с SecurityException: Permission Denial .

Это то, что я делаю:

  1. Приложение пользовательского интерфейса запрашивает снимок, сделанный приложением камеры
  2. Приложение камеры запускается, делает снимок и возвращает результат обратно в приложение пользовательского интерфейса с URI и FLAG_GRANT_READ_URI_PERMISSION флагом в Intent
  3. Приложение пользовательского интерфейса получает результат, имеет разрешение на доступ к URI, загружает / отображает изображение, сделанное в ImageView
  4. По щелчку пользователя мое приложение привязывается к службе в третьем приложении и пытается предоставить URI разрешение / доступ к службе, установив URI в data свойстве Intent переданного в bindService и установив FLAG_GRANT_READ_URI_PERMISSION
  5. Activity Затем мой завершается
  6. Запускается и привязывается служба приложения Service, она получает URI для загрузки и иногда завершается сбоем с SecurityException

Мои вопросы:

  1. Возможно ли вообще перенаправить доступ с разрешением URI из компонента в одном приложении (my Activity) в другой компонент в другом приложении (служба загрузки)?
  2. Тот же вопрос, но что, если компонент в другом приложении является связанной службой, а не запущенной службой, должен ли я использовать Intent переданный в bindService вызов для этого? Что, если служба уже запущена ранее?
  3. Поскольку FLAG_GRANT_READ_URI_PERMISSION оно предназначено для автоматического отзыва разрешений после завершения жизненного цикла, означает ли это, что доступ, предоставленный из Activity привязки Service , отменяется после Activity завершения, даже если срок службы a Service должен быть больше по замыслу?

Комментарии:

1. 2. The Camera app starts, takes a picture, and returns the result back to the UI app with a URI and the FLAG_GRANT_READ_URI_PERMISSION flag in the Intent Нет. Обычное приложение для камеры не будет предоставлять uri в onActivityResult. И нет uri, нет флага.

2. 1. The UI app requests a picture be taken by the Camera app . Да, но вы забыли сказать, что намерение запустить приложение камеры имеет дополнительный uri для файла, в который приложение камеры может записать изображение. Возможно также потому, что оно поставляется с разрешением на запись uti с флагом.

3. 3. The UI app receives the result, has permission to access the URI, loads/displays the picture taken in an ImageView . Единственное, что получено в onActivityResult, — это код ok. И поскольку был uri (см. 1.), Его можно использовать.

4. Ваше приложение создает uri с использованием FileProvider, который используется приложением камеры для записи изображения. Тот же uri может использоваться приложением для загрузки. Этому приложению требуется только разрешение на чтение. Если это приложение использует службу или нет, это вне вашего контроля, следовательно, не имеет значения. Если вы не запрограммировали это приложение тоже.

5. «Возможно ли вообще перенаправить доступ с разрешением URI из компонента в одном приложении (my Activity) в другой компонент в другом приложении (служба загрузки)?» — похоже, это работает большую часть времени для вас, так что, по-видимому, это работает, просто ненадежно. Я предполагаю, что проблема в том, что «Моя активность затем завершается сама», с соответствующей временной проблемой, связанной с тем, когда служба действительно получает разрешение. Я никогда не пробовал передавать Uri разрешения связанным службам. Если вы получаете сбой на своей машине разработки, попробуйте отложить finish() вызов и посмотреть, поможет ли это.