У меня возникают проблемы с созданием, удалением, перемещением, копированием файлов с помощью Intent.ACTION_OPEN_DOCUMENT. - PullRequest
0 голосов
/ 04 мая 2020

Когда я выбираю файл для обработки из внутреннего хранилища с помощью 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
            )
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...