2017-05-09 125 views
4

我正在嘗試將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

回答

0

您只能在根用戶的Android中運行這些命令。由於安全原因,Android Things(Android)不允許執行shell命令。

+0

你的回答是完全錯誤的!** Android Things圖像默認情況下(至少現在是)帶有'su'二進制文件,考慮到操作系統是面向嵌入式系統的,這很合理。更多的是,你可以執行很多[shell命令(包括編程)](https://stackoverflow.com/a/44145193/3290339),因爲**大多數都具有世界可執行權限**。 – Onik

+0

是的,你可以從shell或通過adb運行su命令,但是你不能以編程方式執行它。至少我總是得到「拒絕的權限」。 –

+0

你還沒有看到我認真聽取的答案。不需要通過編程方式來獲取'su',**'/ system/bin'下的大部分二進制文件都是全局可執行的**。 [這是另一個例子](https://stackoverflow.com/a/44209713/3290339)。你爲什麼不嘗試它? – Onik

0

我有完全相同的問題,你有。您不能在您的應用程序中執行adb命令。

但是,您可以通過Android的Usb Host API訪問USB,因此libaums庫可用於訪問Usb大容量存儲設備 - 因爲大容量存儲設備使用FAT32文件系統。