首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 12在内部存储上读取文件导致“打开失败: EACCES (权限被拒绝)”

Android 12在内部存储上读取文件导致“打开失败: EACCES (权限被拒绝)”
EN

Stack Overflow用户
提问于 2022-06-22 16:34:47
回答 1查看 995关注 0票数 2

经过几个小时的头痛和研究(甚至是google :的第二个网站),我决定在这里要求解决我的问题。

我想做的是从我的内部存储中读取一个Keepass文件。该文件位于“/存储/模拟/0/Keepass”下。文件必须保持在那里,因为它会自动与SynologyNAS同步。当我试图用绝对路径打开文件时,我会得到异常。

代码语言:javascript
复制
    W/System.err: java.lang.IllegalArgumentException: The KeePass database file could not be found. You must provide a valid KeePass database file.
W/System.err:     at de.slackspace.openkeepass.KeePassDatabase.getInstance(KeePassDatabase.java:116)
W/System.err:     at de.philslr.passtick.MainActivity.readDb$lambda-5(MainActivity.kt:135)
W/System.err:     at de.philslr.passtick.MainActivity.$r8$lambda$1TiGYGtdMnuJx-_iduNC5-Ge9ag(Unknown Source:0)
W/System.err:     at de.philslr.passtick.MainActivity$$ExternalSyntheticLambda0.run(Unknown Source:2)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:938)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loopOnce(Looper.java:201)
W/System.err:     at android.os.Looper.loop(Looper.java:288)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7870)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
W/System.err: Caused by: java.io.FileNotFoundException: /storage/emulated/0/Keepass/passwords_ps.kdbx: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:575)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:160)
W/System.err:     at de.slackspace.openkeepass.KeePassDatabase.getInstance(KeePassDatabase.java:113)
W/System.err:   ... 11 more
W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.Linux.open(Native Method)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:567)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:273)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:567)
W/System.err:     at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7756)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:561)
W/System.err:   ... 13 more

读取该文件的代码是:

代码语言:javascript
复制
try {
            val file = File(path)
            val database = KeePassDatabase.getInstance(file).openDatabase("password")
            val entries = database.entries
            for (entry in entries) {
                Log.d("[KDBX Read]", "Entry: ${entry.title}")
            }
        } catch (e: Exception) {
            Toast.makeText(applicationContext, "Couldn't open database, there was an error", Toast.LENGTH_SHORT).show()
            e.printStackTrace()
        }

我知道Android 12的文件管理有了一些变化,但我想无论如何都必须有一种读取文件的方法。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2022-06-22 17:34:22

该文件位于“/存储/模拟/0/Keepass”下。

您没有读取/写入该位置的权限。

读取文件的代码是

目前还不清楚你从哪里得到的KeePassDatabase。如果它来自这个已停用的图书馆,那么还有另一种形式的getInstance()需要一个InputStream。如果这是可用的,您可以使用Storage :使用ACTION_OPEN_DOCUMENT / ActivityResultContracts.OpenDocument让用户选择文档,然后使用ContentResolveropenInputStream()为返回的Uri获取InputStream

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72719087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档