从代码中修改文件权限不起作用

Posted

技术标签:

【中文标题】从代码中修改文件权限不起作用【英文标题】:Modify file permissions in Android from code not working 【发布时间】:2013-04-10 08:12:02 【问题描述】:

前段时间,我创建了一个带有私有共享首选项的应用程序。现在我正在创建一个相关的应用程序,它需要检查一些以前的应用程序首选项。我面临的问题是以前的应用程序源代码在我直到下个月才能访问的计算机中。因为我不想等那么久,所以我认为,由于我的设备已植根,我也许可以修改首选项文件权限以便能够访问它,这样我就可以在获得前一个应用程序后立即发布这两个应用程序回码。

首选项文件位于 /data/data/my.package/shared_prefs。如果我使用 adb shell 访问它并使用 chmod 777 文件权限被修改,我可以访问首选项,但最终权限将回到 660。我尝试使用以下代码从代码中更改它们:

Runtime.getRuntime().exec("su");
Runtime.getRuntime().exec("chmod 777 /data/data/my.package/shared_prefs/my_preferences.xml");

权限未修改。这是为什么呢?

谢谢!

【问题讨论】:

【参考方案1】:

我的猜测是从exec() 运行的每个命令都是executed in a separate native process。因此,您的su 命令不会影响对exec() 的第二次调用。

试试这个:

Runtime.getRuntime().exec("su; chmod 777 /data/data/my.package/shared_prefs/my_preferences.xml");

【讨论】:

我试过了,还是不行。如果我将它与两个不同的 exec 一起使用,我会看到一个 Toast 说我获得了 root 权限。如果我像您一样在单个 exec 中使用它,则没有 Toast 并且不会修改文件权限:( 错误:java.io.IOException: Error running exec(). Command: [su;Working Directory: null Environment: null【参考方案2】:
try 
    Process suProcess = Runtime.getRuntime().exec("su");
    DataOutputStream suOutputStream = new DataOutputStream(suProcess.getOutputStream());
    suOutputStream
            .writeBytes("chmod 777 /data/data/my.package/shared_prefs/my_preferences.xml\n");
    suOutputStream.flush();
    suOutputStream.writeBytes("exit\n");
    suOutputStream.flush();
    suProcess.waitFor();

 catch (IOException e) 
    // TODO Auto-generated catch block
 catch (InterruptedException e) 
    // TODO Auto-generated catch block

【讨论】:

我刚试过。文件权限不会被修改,并且该过程永远不会结束。如果我在 suProcess.waitFor() 之后放置 Log.d 是否应该执行?因为我做到了,但它从未被执行。 我实际上没有root手机,所以无法测试。答案的灵感来自this post。祝约翰好运;) 非常慢,你应该如何将它用于FOLDER? chmod 适用于文件夹。搜索“chmod 递归”。

以上是关于从代码中修改文件权限不起作用的主要内容,如果未能解决你的问题,请参考以下文章

修改php.ini不起作用是为啥

从 Google PubSub 中提取消息不起作用 - 权限被拒绝

我发现这段代码可以获得 Windows 写入权限,但它不起作用

片段中带有 RequestPermission 的 registerForActivityResult 不起作用

修改 plist 不起作用

hosts文件不起作用