启动活动时将USB U盘安装到android的东西

问题描述:

我正在尝试将USB海量存储设备安装到我的Raspberry Pi运行Android的东西。我遇到了this答案,它显示了如何使用命令行ADB shell进行挂载。 但问题是我必须在每次启动设备时运行这些命令。我想在我的启动活动的onCreate()中安装USB驱动器。下面是代码:启动活动时将USB U盘安装到android的东西

//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(); 
    } 

但我收到此错误:

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) 

我如何挂上从我的Android上的物联网应用在使用USB设备?

+1

在Android下,它会自动挂载。所以我想知道为什么这不会发生在Android的东西。 – greenapps

您只能在根用户的Android中运行这些命令。由于安全原因,Android Things(Android)不允许执行shell命令。

+0

你的回答是完全错误的!** Android Things图像默认情况下(至少现在是)带有'su'二进制文件,考虑到操作系统是面向嵌入式系统的,这很合理。更多的是,你可以执行很多[shell命令(包括编程)](https://*.com/a/44145193/3290339),因为**大多数都具有世界可执行权限**。 – Onik

+0

是的,你可以从shell或通过adb运行su命令,但是你不能以编程方式执行它。至少我总是得到“拒绝的权限”。 –

+0

你还没有看到我认真听取的答案。不需要通过编程方式来获取'su',**'/ system/bin'下的大部分二进制文件都是全局可执行的**。 [这是另一个例子](https://*.com/a/44209713/3290339)。你为什么不尝试它? – Onik

我有完全相同的问题,你有。您不能在您的应用程序中执行adb命令。

但是,您可以通过Android的Usb Host API访问USB,因此libaums库可用于访问Usb大容量存储设备 - 因为大容量存储设备使用FAT32文件系统。