Keval Patel
Keval Patel

Reputation: 592

Mount USB thumb drive to android things when starting the activity

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

Answers (3)

W PLASSA
W PLASSA

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

Phaestion
Phaestion

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

Salva Domingo
Salva Domingo

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

Related Questions