Я пишу в файл на съемном носителе, на диске fla sh, из моего Android приложения, используя оболочку, но когда Process.waitFor()
возвращает, файл остается равным 0 КБ.
Почему:
В моей компании есть закрытые Android устройства, на которых работает наше приложение. Наше приложение должно переносить файлы с устройства на вставленный диск fla sh или съемный носитель без какого-либо вмешательства пользователя, кроме подключения диска fla sh и его удаления после завершения.
Я использую оболочку для записи в файл, потому что, хотя у меня есть разрешение <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
, я все равно получаю java.io.IOException: File '/storage/usb/test.txt' cannot be written to
при попытке записи в съемное хранилище с использованием java.io.File
.
Как:
File tmp = new File("/storage/usb/test.txt");
Process process = Runtime.getRuntime().exec("su");
DataOutputStream stream = new DataOutputStream(process.getOutputStream());
stream.writeBytes(String.format("echo \"test\" > \"%s\"\n", tmp.getAbsolutePath()));
stream.writeBytes("exit\n");
stream.flush();
if (process.waitFor() != 0) Log.e("shell", "Process did not complete successfully.");
else if (tmp.length() == 0) Log.w("shell", "Process completed successfully but the tmp file is still empty.");
else Log.v("shell", "Process exited successfully");
Вещи, которые я пробовал:
- Использование
ACTION_OPEN_DOCUMENT_TREE
для проверки что наше приложение может записать на диск fla sh. Это работает, но не является решением, которое мы можем использовать, потому что это потребовало бы, чтобы пользователь выбирал, где файлы go. - Использование оболочки для изменения разрешений в пределах
/storage
и /storage/usb
, чтобы разрешить любому пользователю читать и писать в надежде на возможность использовать java.io.File
, но безуспешно. Получил java.io.IOException
- Установка приложения в качестве системного приложения, но получил
java.io.IOException
- Использование
Thread.sleep(..)
до тех пор, пока tmp.length()
не вернет 0, но иногда это занимает 10+ секунд.