Taking a deep dive into MTP: Part 4
In the previous post on MTP we looked at how to retrieve the name of a file on an Android device using MTP. Let's see how to decode that filename:
const array = new Uint8Array(data.payload);
const decoder = new TextDecoder('utf-16le');
filename = decoder.decode(array.subarray(1, array.byteLength - 2));
console.log('Filename:', filename);
In short, we need to remove the length byte at the beginning and the zero terminator bytes at the end, and then decode it as UTF-16LE. To retrieve the file itself, we use the following (where CODE.GET_OBJECT.value
is 0x1009
):
const getFile = {
type: 1,
code: CODE.GET_OBJECT.value,
payload: [objectHandle],
};
await device.transferOut(0x01, buildContainerPacket(getFile));
All that's left to do is to save the data that is returned to a file! (OK, I also need to write some code that handle files that are larger than the buffer we use for transferIn
.)
All the code is currently on a branch on GitHub:
https://github.com/tidepool-org/node-mtp/blob/pure-js/mtp.js
Once I have it all working, I hope to replace the Node.js-specific bits so that it can run in the browser using WebUSB, and ideally have a proof-of-concept available on the web.
I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting https://100daystooffload.com.