I'm attempting to read files off of a USB drive for an Android Things app on a Raspberry Pi. I'm able to scan the list of mounted devices like so:
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();
}
}
Which displays the following output:
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
However, my thumb drive isn't apart of the list. So I'm guessing I need to mount it in some way. How can I mount the thumb drive and access the files on it?
ADB ONLY SOLUTION
Seem like as of now USB drives aren't mounted automatically. In order to make your code work I had to mount it manually.
As you can see (from /proc/partitions
) in the /proc
partition the USB drive is detected as sda
.
ADB mounting
Make a directory to mount to
mkdir /mnt/usb
Mount the device
mount -t vfat -o rw /dev/block/sda1 /mnt/usb
Now you should be able to list (and manage) the files on the USB drive both via ADB and from within the app (/mnt/usb
will also be logged).
I think the only solution is to create a service in init.rc to be able to execute the script with root permisions on Boot. Apparently Android things doesnt have a solution right know. Something like:
on property:dev.bootcomplete=1
start bootcomplete_handler
service bootcomplete_handler /system/bin/sh /system/bin/bc_handler.sh
class late_start
user root
group root
disabled
oneshot
But dont know if this will work
I have made an script that every 10 seconds if detects a usb storage units mounts it automatically, the only problem is to launch it on Boot, maybe this could help you, I have my post here: Execute Script on Boot Android Things
And the script:
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
Hope it helps, i guess now is the only posible way to do it programatically
来源:https://stackoverflow.com/questions/42465326/how-to-mount-a-usb-drive-on-android-things