在我的Android应用程序中,我希望创建在应用程序卸载时保留的文件.

我可以创建隐藏文件

File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), ".SecretFolder")

我的目标是更改此文件的读写权限.

我试图卸载我的应用程序—文件被保留.>在reaf时安装后,我得到了删除DeniedException

现在,如果我想使用File.setReadable(true, false)File.setWritable(true, false)更改读写权限,即使API都返回true,我也无法在Android设备文件资源管理器中观察到任何变化(rests—rw—).

注意:我使用的是基于Android 11的虚拟设备,API 30.我不是专门针对这个版本

以下是我的代码:

private fun writeFileOnInternalStorage(remainingToken : Int) {
            val dir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), ".SecretFolder")
            if(!dir.exists()){
                if(dir.mkdirs()){
                    var allowed = dir.setReadable(true, false)
                    println("DBEUG dir ${dir.toPath()} is world-readable ? $allowed")
                    allowed = dir.setWritable(true, false)
                    println("DBEUG dir ${dir.toPath()} is world-writable ? $allowed")
                }else{
                    println("ERROR")
                    return
                }
            }
            val f = File(dir, ".secretFile")
            if(!f.exists()){
               f.createNewFile()
               var allowed = f.setReadable(true, false)
                println("DBEUG ${f.toPath()} is world-readable ? $allowed")
               allowed = f.setWritable(true, false)
                println("DBEUG ${f.toPath()} is world-writable ? $allowed")
            }
            f.writeText(remainingToken.toString())
            println("DEBUG: written Internal Storage \"${remainingToken}\" in " + f.toPath().toString())
        }

推荐答案

您没有该文件的权限,因此您没有权限更改该文件的权限.Documents/中的文件只能由创建该文件的应用访问,并且只能用于该应用的特定installation.已卸载和重新安装的应用被视为独立安装.

(我怀疑这种技术无论如何都不会起作用,因为Android管理文件权限的方式不同)

通常,我会 bootstrap 您使用存储访问框架.然而,这是为了满足用户的需求:让他们控制存储.您似乎试图对用户隐藏您的活动("创建隐藏文件").谷歌、设备制造商和用户都在努力阻止开发人员这样做.

Android相关问答推荐

如何在Android Room中使用@Relation多对一查询

AdMob:MobileAds. initialize()—java. lang. xml对于某些设备不能强制转换为java. lang. String""

替换- prop -中的值(adb shell getprop)

推断的类型是片段,但应为上下文

Composable不会以LocalConext.Current作为活动呈现

strings.xml中字符串数组中的占位符

使用 List 和 LazyColumn 重新组合所有项目

如何在C++中使用JNI_GetCreatedJavaVMs调用Java代码

Spinner - onItemLongClick 从未执行

是什么导致调用 Firebase 服务器?

如何仅同步 local_manifest.xml?

列表更改时,RecyclerView 中的列表不会更新

如何在一个活动中预加载图像然后在另一个活动中加载它们?

为什么我的应用程序使用这些信息?

Visual Studio 无法在 Android 上编译 .NET MAUI 项目

在 Google Play 中将用户从开放测试转移到生产的过程是怎样的?

Android 自动分页如何与 media3 配合使用?

TextField 溢出和软包装不适用于 Compose 约束布局

如何在 Jetpack Compose 中擦除画布时变得透明,现在我得到白色?

WindowManager 内的 RecyclerView 不更新