如何在Android Things上安装USB驱动器?

时间:2017-02-26 06:07:04

标签: linux usb mount android-things

我试图在 Raspberry Pi 上的 Android Things 应用程序中读取USB驱动器上的文件。我可以像这样扫描已安装的设备列表:

public static List<File> ScanForFiles(Context context){
    ArrayList<File> files = new ArrayList<>();
    try{
        BufferedReader reader = new BufferedReader(new FileReader("/proc/self/mountinfo"));
        String line;
        while ((line = reader.readLine()) != null) {
            String[] columns = line.split(" ");
            Log.i(TAG, "Mounted: " + columns[4]);
            //files.addAll(getListFiles(new File(columns[4])));
        }
    } catch (Exception ex){
        ex.printStackTrace();
    }

    printFileInformation("/proc/partitions");

    return files;
}

private static void printFileInformation(String fileName){
    Log.i("TitanTV", "Reading contents of " + fileName);

    try{
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line;
        while ((line = reader.readLine()) != null){
            Log.i("TitanTV", line);
        }
    } catch (Exception ex){
        ex.printStackTrace();
    }
}

显示以下输出:

I: Mounted: /
I: Mounted: /dev
I: Mounted: /dev
I: Mounted: /dev/pts
I: Mounted: /dev/memcg
I: Mounted: /dev/cpuctl
I: Mounted: /proc
I: Mounted: /sys
I: Mounted: /sys/fs/selinux
I: Mounted: /sys/fs/pstore
I: Mounted: /acct
I: Mounted: /mnt
I: Mounted: /mnt/runtime/default/emulated
I: Mounted: /mnt/runtime/read/emulated
I: Mounted: /mnt/runtime/write/emulated
I: Mounted: /config
I: Mounted: /data
I: Mounted: /oem
I: Mounted: /gapps
I: Mounted: /storage
I: Mounted: /storage/emulated
I: Mounted: /storage/self
I: Reading contents of /proc/partitions
I: major minor  #blocks  name
I:    1        0       8192 ram0
I:    1        1       8192 ram1
I:    1        2       8192 ram2
I:    1        3       8192 ram3
I:    1        4       8192 ram4
I:    1        5       8192 ram5
I:    1        6       8192 ram6
I:    1        7       8192 ram7
I:    1        8       8192 ram8
I:    1        9       8192 ram9
I:    1       10       8192 ram10
I:    1       11       8192 ram11
I:    1       12       8192 ram12
I:    1       13       8192 ram13
I:    1       14       8192 ram14
I:    1       15       8192 ram15
I:  179        0    7761920 mmcblk0
I:  179        1      65536 mmcblk0p1
I:  179        2       1024 mmcblk0p2
I:  179        3       1024 mmcblk0p3
I:  179        4      32768 mmcblk0p4
I:  179        5      32768 mmcblk0p5
I:  179        6     524288 mmcblk0p6
I:  179        7     524288 mmcblk0p7
I:  179        8         64 mmcblk0p8
I:  179        9         64 mmcblk0p9
I:  179       10       1024 mmcblk0p10
I:  179       11      32768 mmcblk0p11
I:  179       12      32768 mmcblk0p12
I:  179       13     262144 mmcblk0p13
I:  179       14     262144 mmcblk0p14
I:  179       15    2683736 mmcblk0p15
I:    8        0    7847935 sda
I:    8        1    7845888 sda1

但是,我的拇指驱动器并不在列表中。所以我猜我需要以某种方式安装它。如何安装拇指驱动器并访问它上面的文件?

4 个答案:

答案 0 :(得分:1)

ADB ONLY SOLUTION

就像现在一样,USB驱动器没有自动安装。为了使你的代码工作,我必须手动安装它。

正如您在/proc/partitions分区中看到的那样(来自/proc),USB驱动器被检测为sda

ADB挂载

  • 创建一个挂载到

    的目录
    mkdir /mnt/usb
    
  • 安装设备

    mount -t vfat -o rw /dev/block/sda1 /mnt/usb
    

现在,您应该能够通过ADB和应用程序列出(并管理)USB驱动器上的文件(/mnt/usb也将被记录)。

答案 1 :(得分:0)

我制作了一个脚本,该脚本每隔10秒就会检测到一个USB存储单元自动安装它,唯一的问题是在Boot上启动它,也许这可以为您提供帮助,我在这里发布了我的文章: Execute Script on Boot Android Things

和脚本:

while true; do

if [ "$( ls -l /dev/block/sd* | wc -l)" -ge 1 ];

then echo "partition available"

if [ "$( mount | grep  "usbAlv" -c)" -ge 1 ]; #if partition not mounted

then echo " Unit Mounted"

else

echo "not  mounted"


//if folder where we mount the partition doesnt exist

if [ !"$( ls -l /sdcard/usbAlv | wc -l)" -ge 1 ];

then mkdir /sdcard/usbAlv

fi

su root << EOSU

mount -t vfat -o rw /dev/block/sd* /sdcard/usbAlv

EOSU

fi

else

echo "not partition available"

fi

sleep 10;

done

希望它会有所帮助,我想现在这是唯一以编程方式实现的方法

答案 2 :(得分:0)

我认为唯一的解决方案是在init.rc中创建一个服务,以便能够在Boot上以根权限执行脚本。 显然,Android东西没有解决方案。 像这样:

关于属性:dev.bootcomplete = 1

start bootcomplete_handler

服务bootcomplete_handler / system / bin / sh /system/bin/bc_handler.sh

class late_start

user root

group root

disabled

oneshot

但是不知道这是否行得通

答案 3 :(得分:0)

工作和放弃的选项

1。使用ADB(有效)

answererOnik到此帖子

2。使用USB API(有效)

由于USB的Android API允许 bulkTransfer ,因此您可以编写SCSI兼容命令。

您还可以尝试使用由libaums发布以响应Phaestion

的现有库,例如this similar question

3。在boot.img的init.rc中注入shell命令(不起作用)

可以将Shell命令注入到boot.img内的init.rc文件中(而不是在/ root目录中找到的init.rc文件中)。但是,鉴于AndroidThings编译的A-B启动性质,我无法使其正常工作。

4。添加高级应用权限(不起作用)

以下权限似乎有望从应用程序执行root命令。但是,权限被拒绝错误继续阻止根命令的执行。

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MANAGE_USB" tools:ignore="ProtectedPermissions" />

我什至尝试使用具有此类权限的应用程序编译AndroidThings发行版,但Android Things控制台不允许将该应用程序包含在编译中

5。将应用白名单(不起作用)

有特权应用白名单。但是,此白名单位于特权目录中,即使使用root用户从shell命令中也无法覆盖

6。在特权位置安装该应用程序(无法正常工作) 安装在特权目录中的应用程序可以执行root命令。但是,AndroidThings不允许在此类位置安装应用程序(即使从具有root用户的外壳程序中安装)