Запись исключения в посылку
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">
Код: Выделить всё
Код: Выделить всё
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)
}
}
Первая ошибка, которую я получаю при открытии средства выбора. Когда я выбираю любое приложение (например, Gmail) - получаю еще одну ошибку:
Failed to find provider info for com.own.vpn.provider. Но на других устройствах все работает нормально.
Подробнее здесь: https://stackoverflow.com/questions/786 ... r-uri-cont
Мобильная версия