Как и в android (через папку anddroid sdk/tools) из командной строки, мы можем выполнить команду linux shell для доступа к папке mnt folder/data аналогично. (например, cd data ls) теперь, когда команда, которую я хочу выполнить программно в android, как это возможно?
Process p = Runtime.getRuntime().exec("cd data");
но это дает мне исключение
java.io.IOException: Error running exec(). Command: [cd, data] Working
Directory: null Environment: null
cd
не является командой Linux, это команда, встроенная в оболочку; он изменяет текущий рабочий каталог в контексте этого процесса оболочки. В вашем случае, если команда была успешной, она будет успешна только для дочернего процесса (который скоро закончится) и не повлияет на ваш собственный процесс.
В Android у вашего процесса нет разрешений на чтение файлов в других приложениях /data/data/_other-package-name_
или список его личных файлов в каталоге /data/data/_other-package-name_/files
. Но у него есть разрешение на просмотр и чтение файлов в каталоге lib /data/data/_other-package-name_/lib
, и вы можете посмотреть конкретный файл в /data/data/_other-package-name_/files
, если другой-пакет открыл этот файл как общедоступный.
То есть, если другой пакет делает что-то в соответствии с:
FileOutputStream fos = openFileOutput("public_file", Context.MODE_WORLD_READABLE);
fos.write("hello world".getBytes());
fos.close();
то ваш пакет может прочитать этот файл следующим образом:
byte[] bytes = new byte[100];
FileInputStream fis = new FileInputStream(new File("/data/data/*other-package*/files/public_file"));
int cnt = fis.read(bytes);
fis.close();
Log.d("Two_Libs", new String(bytes, 0, cnt));
Но вы не можете перечислить общедоступные файлы в этом каталоге, чтобы обнаружить их.
Чтобы получить путь к папке личных данных приложения, используйте следующее из Java:
File MyData = Ctxt.getDir("Foo");
Где Ctxt - объект контекста, например Activity. Он вернет вам путь, например /data/data/com.activity.networkRequestDetector/app_Foo
. Обратите внимание, что чтение/запись /data/data/com.activity.networkRequestDetector/
не рекомендуется в Android - это ваш корневой /data/data/com.activity.networkRequestDetector/
вашего приложения, а не для воспроизведения.
Чтобы открыть файлы из папки данных, используйте что-то вроде этого:
FileInputStream Stm = new FileInputStream(new File(MyData, "Filename.txt"));
В общем, все, что может сделать команда оболочки, тоже может сделать ваше приложение. Команды Shell - это просто программы, которые используют API, как и все остальные.
попробуй это:
Process p = Runtime.getRuntime().exec("cd /data");