Android - Отказ в разрешении: чтение содержимого androidx.core.content.FileProvider uri / специфично для XiaomiAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android - Отказ в разрешении: чтение содержимого androidx.core.content.FileProvider uri / специфично для Xiaomi

Сообщение Anonymous »

В моем Android-приложении некоторые логи записываются в файлы по дате (например, в файл 20.06.2024.txt) с возможностью собрать все файлы в zip архив и поделиться через приложение/отправить на почту. Архивный файл прикрепляется к письму без проблем на всех устройствах, кроме одного из 6-ти устройств, на которых это проверялось - Xiaomi. На этом устройстве я вижу ошибку в журналах:

Запись исключения в посылку
java.lang.SecurityException: Permission Denial: чтение androidx. core.content.FileProvider uri content://com.own.vpn.provider/files/logs/VPN_logs.zip из pid=6231, uid=1000 требует экспорта поставщика или GrantUriPermission()

Мой провайдер указан в манифесте:

Код: Выделить всё








































android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">




file_provider_paths.xml Поделиться вызовом по намерению

Код: Выделить всё

private const val FILE_TYPE_TXT = "txt/*"
private const val FILE_TYPE_ZIP = "application/zip"
private const val AUTHORITY_EXTENSION = ".provider"

class DefaultShareRouter(
private val context: Context
) : ShareRouter {

override fun goToFileSharing(logFile: File, shareWith: ShareWith) {
val fileUri: Uri = FileProvider.getUriForFile(
context,
"${BuildConfig.APPLICATION_ID}$AUTHORITY_EXTENSION",
logFile
)

val fileType = if (logFile.extension == LOG_FILE_EXTENSION_TXT)
FILE_TYPE_TXT
else
FILE_TYPE_ZIP

when (shareWith) {
ShareWith.ANY_APP -> openApplicationChooser(fileUri, fileType)
ShareWith.EMAIL -> openEmailIntent(fileUri, fileType)
}
}

private fun openEmailIntent(fileUri: Uri, fileType: String) {
// Receivers list
val mailReceivers = arrayOf(getString(context, R.string.mail_receiver))

val emailIntent = Intent(Intent.ACTION_SEND).apply {
// File
setDataAndType(fileUri, fileType)
putExtra(Intent.EXTRA_STREAM, fileUri)

// E-mail
putExtra(Intent.EXTRA_EMAIL, mailReceivers)
putExtra(
Intent.EXTRA_SUBJECT,
getString(context, R.string.mail_subject)
)
putExtra(
Intent.EXTRA_TEXT,
getString(context, R.string.mail_text)
)
}

val emailApps = context.packageManager.queryIntentActivities(
Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")),
0
)
val emailAppsIntents = emailApps.map { resolveInfo ->
Intent(emailIntent).apply {
setPackage(resolveInfo.activityInfo.packageName)
}
}
.distinctBy { it.`package` }
.toMutableList()

if (emailAppsIntents.isNotEmpty()) {
val chooserIntent = Intent.createChooser(
// removeAt(0) - first intent used as default for chooser
emailAppsIntents.removeAt(0),
getString(context, R.string.choose_email_application)
).apply {
putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppsIntents.toTypedArray())
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(chooserIntent)
} else {
Toast.makeText(
context,
getString(context, R.string.no_email_application),
Toast.LENGTH_SHORT
).show()
}
}

private fun openApplicationChooser(fileUri: Uri, fileType: String) {
val intent = Intent(Intent.ACTION_SEND).apply {
// Attachment
setDataAndType(fileUri, fileType)
putExtra(Intent.EXTRA_STREAM, fileUri)
}

// Applications chooser
val shareIntent = Intent.createChooser(
intent,
null
).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }
startActivity(context, shareIntent, null)
}
}
UPD
Первая ошибка, которую я получаю при открытии средства выбора. Когда я выбираю любое приложение (например, Gmail) - получаю еще одну ошибку:
Failed to find provider info for com.own.vpn.provider. Но на других устройствах все работает нормально.

Подробнее здесь: https://stackoverflow.com/questions/786 ... r-uri-cont
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»