2012-07-03 66 views
3

我试图启动一个应用程序,因此我可以将我的应用程序备份到sdcard。我跑:运行shell命令从Android应用程序复制文件

 Process p = Runtime.getRuntime().exec("su"); 
    Process c = Runtime.getRuntime().exec(
      "cp /data/app/com.ebay.mobile-1.apk" 
        + Environment.getExternalStorageDirectory() 
        + "/ebay.apk"); 
    Log.d("copy", "done"); 

当它运行时我可以授予超级用户,然后它说,它这样做,但没有文件不被复制。我只是使用eBay应用程序作为示例和测试。

感谢您的任何帮助。

修复:感谢下面的帮助,但我发现一个完整的修复和有点不同的方式做事情在这里“http://stackoverflow.com/questions/10735273/copy-folders-in-data-data-to- sdcard-viceversa?rq = 1“

+0

哇,我觉得自己像个白痴,我没加WRITE_EXTERNAL_STORAGE许可。 “dd if = source_file of = dest_file” – user1056798

+0

你自己找到的解决方案工作,感谢股票! – VinceStyling

回答

7

Android不支持cp命令。对于这一点,你必须要么使用命令(从外壳仅)一样,

cat source_file > dest_file 

或者使用了BusyBox与您的应用程序。

编辑:

你也可以使用命令,

dd if=source_file of=dest_file 
+0

更多信息http://stackoverflow.com/questions/4714411/how-to-copy-and-edit-files-in-android-shell – user370305

+0

请注意,您实际上并不需要root用户,前提是应用程序具有外部存储权限。但是cat source> dest trick不是一个你可以执行的进程,而是一个必须由shell解释的东西。在java中使用while循环读取文件并将其写回来可能更可取。 –

+0

@ChrisStratton - 如果您想安装busybox并使用命令shell,那么只需要root权限,否则其他选项只能在应用程序的清单文件中使用WRITE_EXTERNAL_STORAGE权限。 – user370305

0

这QA帮了我很多,所以我想添加一些不同的EXEC答案。不要使用Runtime.getRuntime()。exec(String),而应考虑使用Runtime.getRuntime()。exec(String [])。这应该防止带有空格的文件路径对文件系统造成严重破坏。

尝试

Process copy = Runtime.getRuntime().exec(
new String[]{ 
    "dd", 
    "if=" + inputFile.getAbsolutePath(), 
    "of=" + outputFile.getAbsolutePath() 
}); 
相关问题