2012-07-03 2 views
3

Я пытаюсь запустить приложение, поэтому я могу сделать резервную копию своих приложений на SD-карте. Я побежал:Запуск команды оболочки для копирования файлов из 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 с приложением.

EDIT:

также вы можете использовать команду,

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 - это не процесс, который вы можете выполнить, а скорее то, что должно интерпретироваться оболочкой. Вероятно, было бы предпочтительнее прочитать файл и записать его обратно, используя цикл while в java. –

+0

@ChrisStratton - Если вы хотите установить busybox и использовать командную оболочку, тогда вам потребуется только разрешение 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() 
}); 
Смежные вопросы