2

我正在尝试从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();
    }
}

显示以下输出:

我:已安装:/
我:挂载:/dev
我:挂载:/dev
我:挂载:/dev/pts
我:挂载:/dev/memcg
我:挂载:/dev/cpuctl
我:挂载:/proc
我:挂载:/sys
我:挂载:/sys/fs/selinux
我:挂载:/sys/fs/pstore
我:安装:/acct
我:安装:/mnt
I:挂载:/mnt/runtime/default/emulated
我:挂载:/mnt/runtime/read/emulated
I:挂载:/mnt/runtime/write/emulated
我:挂载:/config
我:安装:/数据
我:安装:/oem
我:安装:/gapps
我:安装:/存储
I:已安装:/storage/emulated
我:已安装:/storage/self
一:读取/proc/partitions的内容
I:主要次要#blocks 名称
我:1 0 8192 内存0
我:1 1 8192 ram1
我:1 2 8192 ram2
我:1 3 8192 ram3
我:1 4 8192 ram4
我:1 5 8192 ram5
我:1 6 8192 ram6
我:1 7 8192 ram7
我:1 8 8192 ram8
我:1 9 8192 ram9
我:1 10 8192 ram10
我:1 11 8192 ram11
我:1 12 8192 ram12
我:1 13 8192 ram13
我:1 14 8192 ram14
我:1 15 8192 ram15
我:179 0 7761920 mmcblk0
我:179 1 65536 mmcblk0p1
我:179 2 1024 mmcblk0p2
我:179 3 1024 mmcblk0p3
我:179 4 32768 mmcblk0p4
我:179 5 32768 mmcblk0p5
我:179 6 524288 mmcblk0p6
我:179 7 524288 mmcblk0p7
我:179 8 64 mmcblk0p8
我:179 9 64 mmcblk0p9
我:179 10 1024 mmcblk0p10
我:179 11 32768 mmcblk0p11
我:179 12 32768 mmcblk0p12
我:179 13 262144 mmcblk0p13
我:179 14 262144 mmcblk0p14
我:179 15 2683736 mmcblk0p15
我:8 0 7847935 sda
我:8 1 7845888 sda1

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

4

4 回答 4

1

仅亚行解决方案

好像现在 USB 驱动器没有自动安装。为了使您的代码正常工作,我必须手动安装它。

正如您/proc/partitions在分区中看到的(从 ),/procUSB 驱动器被检测为sda

亚行安装

  • 创建要挂载到的目录

    mkdir /mnt/usb
    
  • 安装设备

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

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

于 2017-02-26T22:07:40.403 回答
0

我制作了一个脚本,如果检测到 USB 存储单元每 10 秒自动安装一次,唯一的问题是在启动时启动它,也许这可以帮助你,我在这里有我的帖子: 在启动 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

希望它有所帮助,我想现在是以编程方式进行的唯一可能方法

于 2018-07-12T09:38:04.887 回答
0

我认为唯一的解决方案是在 init.rc 中创建一个服务,以便能够在 Boot 上执行具有 root 权限的脚本。显然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

但不知道这是否可行

于 2018-07-18T18:46:11.030 回答
0

工作和废弃的选项

1.使用亚行(工作)

作为Onik在这篇文章中的回答者

2.使用USB API(工作)

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

您还可以尝试现有的库,例如libaums,由Phaestion发布以回应这个类似的问题

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

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

4.添加高级应用权限(不工作)

以下权限似乎有望从应用程序执行 root 命令。但是,权限被拒绝错误继续阻止 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 用户的外壳)

于 2020-01-22T16:42:31.663 回答