Java 将系统应用程序的文件复制到其他位置时出错

Java 将系统应用程序的文件复制到其他位置时出错,java,android,Java,Android,我正在开发一个系统应用程序,其中我必须将属于另一个系统应用程序的xml文件复制到我的手机的已知位置。 首先,我尝试在命令提示符下使用adb shell和命令 cp /data/data/owner_app_pkg_name/shared_prefs/file.xml /storage/sdcard0/FOLDERNAME/file2.xml 它工作得很好 然而,当我试图在我的系统应用程序中以编程方式执行相同的操作时,使用 Process p = Runtime.getRuntime().exe

我正在开发一个系统应用程序,其中我必须将属于另一个系统应用程序的xml文件复制到我的手机的已知位置。 首先,我尝试在命令提示符下使用adb shell和命令

cp /data/data/owner_app_pkg_name/shared_prefs/file.xml /storage/sdcard0/FOLDERNAME/file2.xml
它工作得很好

然而,当我试图在我的系统应用程序中以编程方式执行相同的操作时,使用

Process p = Runtime.getRuntime().exec("cp /data/data/owner_app_pkg_name/shared_prefs/file.xml /storage/sdcard0/FOLDERNAME/file2.xml");
它不起作用

此外,如果我通过系统的命令提示符在同一目录中创建了file.xml的副本,然后使用复制的文件名在my app中执行代码,那么它就工作了


有人能告诉我如何使用我上面提到的我的系统应用程序的java代码,将所有者系统应用程序使用的file.xml直接复制到我想要的位置吗?

使用命令解决了我的问题

 public void copyFile() throws IOException {
    InputStream inStream = new FileInputStream(new File("/data/data/owner_app_pkg_name/shared_prefs/file.xml"));
    OutputStream outStream= new FileOutputStream(new File("/storage/sdcard0/FOLDERNAME/file2.xml"));

    // Transfer bytes from in to outStream
    byte[] buf = new byte[1024];
    int len;
    while ((len = inStream.read(buf)) > 0) {
        outStream.write(buf, 0, len);
    }
    inStream.close();
    outStream.close();
}
adb shell
chmod 666 /data/data/owner_app_pkg_name/shared_prefs/file.xml

然后运行我的应用程序。但是如何从我的应用程序本身的java代码中运行chmod命令?

一个“系统应用程序”不能以root用户身份运行,因此无法访问其他拥有不同所有者的应用程序的私有文件。也许您的根shell副本最终具有全局读取权限。您可以(从您的根shell)执行这两个操作中的
ls-l
,以查看。我将尝试这样做。是否可以使系统应用程序以root用户身份运行并绕过此问题?否。应用程序不以root用户身份运行。但是,如果您可以与目标应用程序以相同的uid运行,则可以避免出现问题。我发现了如何获取目标应用程序的uid(使用ApplicationInfo().uid),但我可以手动设置我的应用程序的uid吗?感谢您的建议Satheesh,但与Chris一样,我得到如下异常:`java.io.FileNotFoundException:/data/data/com.lge.camera/shared\u prefs/back\u camera.xml:open failed:EACCES(权限被拒绝)`您不能,因为您不拥有该文件。如果你有一个
su
root hack,你可能可以通过它调用
chmod
,这里有很多其他问题,但是只有
chmod
可能作为root运行,而不是你的应用。我想我已经用尽了所有的选择。。至少我能找到一份工作(虽然很痛苦)。谢谢你的帮助!!