With my Nexus One, I would mount its internal SD card as USB mass storage. That worked really well, though the phone couldn't access it at the same time. With a number of more recent Android phones, including my Galaxy Nexus, users are expected to access the phone's file system using MTP or PTP. That seems to work fine on at least Windows, but it's terrible on Linux. libmtp and gphoto2's (for ptp) communication with an Android phone is incredibly buggy, slow, and error prone. Trying to use MTP and PTP with a variety of Linux applications (Rhythmbox, Banshee, Shotwell, GThumb, Nautilus, mtpfs) resulted in my /sdcard/ file system on my phone being wiped out somehow once. That sucked. Thanks to Instant Upload with G+, I didn't lose most of my photos, at least.
I have waited patiently for support to come, especially as I don't have time myself to write patches. :D (My Masters' end draws nigh, though!) However, it has not. So, here are a couple other solutions.
wifi
I briefly tried working with the file system over the network, using wifi. I used SSHDroid and a few other SSH daemons. Only one sort of worked, and it only worked for half an hour, had an error, and has never worked since (even if I uninstall and reinstall it). Some of the better solutions want your phone to be rooted, which I've resisted doing for a variety of reasons (which meant a very long wait for Jelly Bean here in Canada). This isn't great for me anyway, because I don't have a router at home: my phone is my connection to the Internet, and I tether with an unlimited data plan (throttles speed after the first 10GB, no extra charges, hooray for WIND Mobile).
Finally, I've decided to just accept a suboptimal solution: adb.
adb
adb works beautifully, but it isn't as user-friendly or obvious as you might like. It's smooth, though.
First, get adb from the Android SDK (two steps)
get adb
- go to http://developer.android.com/sdk/index.html and download the SDK for Linux
- unpack it: tar -xf android-sdk_*-linux.tgz
- ./android-sdk-linux/tools/android
- under Tools, download Android SDK Platform-tools
- Now, you'll have adb in ./android-sdk-linux/platform-tools/, you can set it on your PATH if you like so you can run it from any directory.
Now, start adb's server as root so you'll be able to connect to your phone over USB
start adb's server and enable debugging on your phone
- cd ./android-sdk-linux/platform-tools/
- sudo ./adb start-server
- important to run that as root
- on your phone, go to Settings -> {} Developer Options -> USB debugging
- Now on your computer, you should be able to do this, ./adb devices, and see your phone listed
If you check ./adb --help, you'll see a lot of options. I've only used a few so far to do what I want, but it's been nice.
now to access the file system!
- in one shell, run ./adb shell, and this will give you an interactive shell within your devices file system. It doesn't have a complete set of tools (no du, head, less, or more), but it has ls (supporting -l), cd, rm, and rmdir. I've used this to navigate the system, clean it, and figure out paths for the next step
- to move files, I've been using ./adb push and ./adb pull. For example,
- ./adb pull /sdcard/DCIM/Camera/ ~/photos/
- this let me get my photos off at a fair speed (5MB/s) finally; I then used rm in the interactive shell after making sure I wasn't accidentally deleting the wrong things.
- ./adb push ~/files/music/Sherlock/ /sdcard/Music/
suboptimality
I don't like having to use esoteric utilities on the command-line, and I understand that MTP works well on Windows (and Mac OS X?) but I'm tired of waiting for libmtp on Linux to enable applications to actually do anything with their device. Hooray for having a solution that is at least smooth and reliable in its operation.