2016-10-06 3 views
5

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

private void startGallery() { 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("image/*"); 
    startActivityForResult(intent, REQ_OPEN_GALLERY) 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQ_OPEN_GALLERY && resultCode == Activity.RESULT_OK) { 
     Uri imageUri = data.getData() 
     // here I save image uri to pass to another activity 
    } 
} 

При попытке открыть в другой URI деятельности я получаю SecurityException. Docs говорит, что разрешение на полученный uri длится до тех пор, пока не будет завершена работа, которая их получает. Поэтому, когда моя активность закончена, у меня нет разрешения на чтение файла.

Есть ли способ продлить разрешение на ури, чтобы разрешить другим действиям открыть файл с помощью этого uri? Или только способ скопировать изображение в локальное хранилище приложений?

UPD: Моя цель - сохранить полученный uri в локальной базе данных и разрешить другим действиям и услугам прочитать этот файл.

ответ

9

Есть ли способ продлить разрешение на ури, чтобы разрешить другие действия открыть файл по этому uri?

Да. Include FLAG_GRANT_READ_URI_PERMISSION when you pass the Uri от первой активности ко второму виду деятельности:

startActivity(new Intent(this, Something.class).setData(uri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)); 
+1

Извините. Мой вопрос недостаточно ясен. Моя цель - сохранить полученный uri в локальном db и разрешить другим действиям и сервисам читать этот файл. Обновленный ответ – nnesterov

+1

@nnesterov: «Моя цель - сохранить полученный uri в локальном db» - это не сработает. Если вы используете 'ACTION_OPEN_DOCUMENT' на Android 4.4+, вы можете попробовать использовать' takePersistableUriPermission() ', и если это сработает, вы можете иметь долгосрочный доступ к контенту, идентифицированному' Uri'. В противном случае вам нужно сделать локальную копию содержимого. См. [Это пример приложения] (https://github.com/commonsguy/cw-omnibus/tree/master/Documents/Durable) для демонстрации этого. – CommonsWare

Смежные вопросы