Используйте Uri из действия в адаптере

#android #kotlin #uri

Вопрос:

У меня есть база данных со значениями Uri, и я хочу отправить электронное письмо с адаптера. Проблема в том, что когда я пытаюсь отправить сообщение, у меня есть: UID 10541 не имеет разрешения на content://com.android.externalstorage.documents/document/primary:Download/bilet24379308248321183796.pdf [пользователь 0]; вы можете получить доступ с помощью ACTION_OPEN_DOCUMENT или связанных API

    try {

                                val emailIntent = Intent(Intent.ACTION_SEND)
                                emailIntent.type = "plain/text"
                                emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(kindleEmailAddress))
                                emailIntent.putExtra(Intent.EXTRA_SUBJECT, title)
                                emailIntent.putExtra(Intent.EXTRA_STREAM, att)
                                emailIntent.putExtra(Intent.EXTRA_TEXT, message)
                                context.startActivity(Intent.createChooser(emailIntent, "Sending email..."))

                             
                            }
                            catch (t: Throwable) {
                                Toast.makeText(context, "Request failed try again: $t", Toast.LENGTH_LONG).show()
                            }
 

Я пытался добавить grantUriPermission перед объявлением о намерении, но это не работает.

       context.grantUriPermission(context.packageName, att,
        Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)
 

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

1. «У меня есть база данных со значениями Uri» — как вы получили эти значения? Если ответ ACTION_OPEN_DOCUMENT «или ACTION_OPEN_DOCUMENT_TREE «, вам нужно позвонить takePersistableUriPermission() ContentResolver направо, когда вы войдете Uri onActivityResult() . В противном случае ваши права на доступ к контенту утратят силу.

2. Спасибо @CommonsWare takePersistableUriPermission() работает отлично. Ваш блог потрясающий. Много полезной информации 🙂