2013-01-25 34 views
6

我正在尝试编写应用程序,该应用程序必须在其他应用程序的共享首选项(data/data/package_name/shared_prefs/file.xml)中读取,修改和保存一些设置。Android:修改其他应用程序的SharedPreferences

此应用程序不是我的,我有根源的设备进行测试。

我应该将哪些android权限添加到清单以及如何访问此文件并对其进行修改?我知道SharedPreferences是每个App/APK独有的,但我需要在根模式下修改它。

我有工作代码来修改SD卡上的XML文件,但是当我更改为"data/data/package_name/shared_prefs/file.xml"路径它给了我一个异常和消息

android open failed eacces (permission denied) 

有没有一种方法可以让我做到这一点?

+0

你需要使用系统签名来签署你的应用程序才能获得该许可,这是不容易获得的。 –

回答

1

看看这个答案:

https://stackoverflow.com/a/13139280/361230

当你使用su,你将不得不修改任何你想要的文件系统的权限。

但是,我同意克里斯的事实,做你想做的事并不是很好。

+0

你能解释一下,我只需要运行SU并为我的应用授予权限,或者我应该在SU shell中执行特殊命令来更改文件属性? – Wolf6969

+0

@ Wolf6969,说实话,我只是因为好奇才读过这类东西。但是,如果您阅读我链接的答案,似乎一旦您执行了su,该应用程序就会以超级用户权限开始运行。因此,您只需将第一行添加到您的代码中,然后您就不会收到权限问题。我明天会试一试,但你为什么不尝试一下呢? – Shade

+0

情况并非如此。让您的应用获得超级用户权限后,您就可以以root身份运行_commands_。应用程序本身仍在沙箱中运行,除了“Runtime.exec()”命令或其他系统命令外,您无法访问这些shared_prefs。我建议使用'su'命令将文件复制到您有读写权限的位置(可能是您的应用程序数据文件夹),对其进行修改,然后使用另一个'su'命令将其复制回来并覆盖现有的文件。 – cnexus

-1

您不应该更改另一个应用程序的首选项,根目录或不。

+0

我可以通过任何具有root模式的浏览器执行此操作,为什么我无法从我的应用程序执行此操作? – Wolf6969

0

除非您是其他应用程序的所有者,否则您不应该这样做。没有根的唯一方法就是让它具有世界可读性,这是贬值的,几乎从不使用。

我怀疑有人会给你一个你想要的答案,除非你说明你为什么需要访问。

+0

这不像是一个秘密或什么。此外,许多人正在使用root来进行修改等目的。 – Shade

+0

这并没有改变你想要做的事情与人们手动做它的事实。 – Mgamerz

+0

我的意思是,有些应用程序需要root来操作,但仍然提供一个好处(而不是伤害你)。在您的设备上使用自定义ROM时,您可能会遇到许多此类应用程序 - f.e.修改导航栏的应用程序(ICS +)。 – Shade

8

要真正回答你的问题,如果你有根,你可以用反射来做。我已经在android 4.1上完成了,在其他平台上它的工作方式可能不同。好处是共享首选项不能仅通过系统服务访问,因此您可以通过反射访问“隐藏”方法。把它放在试试看:

Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs/package_name_preferences.xml" }); 
proc.waitFor(); 
proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs" }); 
proc.waitFor(); 
proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name" }); 
proc.waitFor(); 

File preffile = new File("/data/data/package_name/shared_prefs/package_name_preferences.xml"); 

Class prefimplclass = Class.forName("android.app.SharedPreferencesImpl"); 

Constructor prefimplconstructor = prefimplclass.getDeclaredConstructor(File.class,int.class); 
prefimplconstructor.setAccessible(true); 

Object prefimpl = prefimplconstructor.newInstance(preffile,Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE); 


Editor editor = (Editor) prefimplclass.getMethod("edit").invoke(prefimpl); 
//put your settings here 
editor.commit(); 
+0

目录上的权限更改可能不需要,只需在实际首选项文件中。当然,这有很多安全问题,但我认为你知道root的危险。 – azyoot

+0

上帝保佑你;) –

相关问题