Когда я выбираю файл для обработки из внутреннего хранилища с помощью Intent.ACTION_DOCUMENT_OPEN, logcat регистрирует ошибку, описанную ниже.
java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider uri content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FrenamedName%20(1).db from pid=5361, uid=10398 requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
intentToGetContentcode -> {
if (resultCode == Activity.RESULT_OK) {
val uri = data!!.data!!
// ...permissions grantUriPermissions
grantUriPermission(
"com.velabs.rerinavi2",
uri,
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
)
grantUriPermission(
"com.velabs.rerinavi2",
uri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
grantUriPermission(
"com.velabs.rerinavi2",
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION
)
val resolver = applicationContext.contentResolver
val cursor =
this.contentResolver.query(uri, null, null, null, null)
resolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION and Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
// val path: Uri = FileProvider.getUriForFile(
// context,
// "com.velabs.rerinavi.fileprovider",
// filelocation
// )
val type = resolver.getType(uri)
l("MIME type of .db",type!!)
try {
val path = getDatabasePath("renamedName(1).db").absolutePath
l("renamedName(1) path",path)
}catch (e:Exception){
l("documentFile","error $e,,,,"+DocumentFile.fromSingleUri(this,uri)!!.isFile.toString())
}
try {
val doc = DocumentsContract.renameDocument(resolver, uri, "renamedName.db")
}catch (e:Exception) {
l("rename",e.toString())
}
try {
val file = resolver.openInputStream(uri)
// val homeFile = getDatabasePath("export.db").outputStream()
// file!!.copyTo(homeFile)
}catch (e:Exception) {
l("copyTo",e.toString())
}
}
}
super.onActivityResult(requestCode, resultCode, data)
}
(Извинения за грязный код, я все еще учусь) Иллюстрация Как скопировать файл из внутреннего хранилища в каталог базы данных приложения было бы чрезвычайно полезно. Вот намерение, которое я использую:
private fun exportToLocation() {
if(checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE),requestPermissionCode)
}else {
val intentToGetContent =
Intent(Intent.ACTION_OPEN_DOCUMENT) //ACTION_GET_CONTENT replaced by opendocuments //action_open_doc works
intentToGetContent.addCategory(Intent.CATEGORY_OPENABLE)
intentToGetContent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
intentToGetContent.type =
"application/octet-stream" //application/db doesn't work //application/octect-stream works
// inference for above application is correct /(this part needs to be corrected)
startActivityForResult(
Intent.createChooser(intentToGetContent, "Import file"),
intentToGetContentcode
)
}