Reputation: 592
I am trying to mount the USB mass storage device to my Raspberry Pi running the android things. I came across this answer which shows how to mount it using command line ADB shell.
But the problem is I have to run those command every time my device boots. I want to mount the USB drive in onCreate()
of my launch activity. Here is the code:
//Here is the mount drive function which I called in onCreate of my activity.
private void mountDrive() throws IOException, InterruptedException {
Process mProcess = Runtime.getRuntime().exec("/system/xbin/su");
BufferedReader reader = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
DataOutputStream dos = new DataOutputStream(mProcess.getOutputStream());
dos.writeBytes("mkdir /mnt/usb\n");
dos.flush();
dos.writeBytes("mount -t vfat -o rw /dev/block/sda1 /mnt/usb\n");
dos.flush();
dos.writeBytes("exit\n");
//Read the response
String line, result = "";
while ((line = reader.readLine()) != null) {
result += line;
Log.d("CMD","RESULT:"+result);
}
reader.close();
dos.flush();
dos.close();
mProcess.waitFor();
}
But I am getting this error:
I/sh: type=1400 audit(0.0:31): avc: denied { read } for name="/" dev="mmcblk0p6" ino=2 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:rootfs:s0 tclass=dir permissive=1
I/sh: type=1400 audit(0.0:32): avc: denied { open } for path="/" dev="mmcblk0p6" ino=2 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:rootfs:s0 tclass=dir permissive=1
W/System.err: java.io.IOException: Cannot run program "su": error=13, Permission denied
W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:983)
W/System.err: at java.lang.Runtime.exec(Runtime.java:691)
W/System.err: at java.lang.Runtime.exec(Runtime.java:524)
W/System.err: at java.lang.Runtime.exec(Runtime.java:421)
How can I mount the USB device using from my application on Android Things?
Upvotes: 5
Views: 1536
Reputation: 11
An alternative is to modify the init.rc
file. Search the init.rc
file for on property: sys.boot_completed = 1
:
on property: sys.boot_completed = 1
bootchart stop
# WLD 201805031702
mkdir / mnt / usb
chmod 777 / mnt / usb
exec / system / bin / mount -t vfat / dev / block / sda1 / mnt / usb
#operate only if the pendrive is placed before powering on, if you remove and put it will not work
Upvotes: 1
Reputation: 63
I had the exact same issue that you have. You cannot execute the adb command from within your app.
However you can access the USB via Android's Usb Host API, and therefore the libaums library works to access the Usb mass storage device - given that the mass storage device uses a FAT32 filesystem.
Upvotes: 1
Reputation: 11
You only can run these commands in a rooted Android. Android Things (as Android) does not allow to execute shell commands by security reasons.
Upvotes: 1