J2ME didn't fracture because it was open source - that didn't happen until 2006 - it fractured from the same issues bensummers points out below with Palm: too many differences in implementation between different manufacturers and devices (including bugs).
Phone B supports 1-bit alpha, phone B supports 8-bit alpha, phone C has a bug where alpha is corrupted in images under a certain size. Once your code starts looking like a nest of if(NOKIA||(MOTOROLA&&!MODEL910)) you're doomed.
You forgot phone D that claims to support phonebook access when queried programmatically but crashes if you try to use it. Or phone E that supports camera access but returns all images rotated 90 degrees clockwise.
Both of these are real bugs in handsets with Sun certified J2ME implementations.
Android might be able to avoid these problems if it required OEMs to pass a comprehensive test suite and include a bare minimum of libraries, but since it's open source I'm not sure it can be forced.
Phone B supports 1-bit alpha, phone B supports 8-bit alpha, phone C has a bug where alpha is corrupted in images under a certain size. Once your code starts looking like a nest of if(NOKIA||(MOTOROLA&&!MODEL910)) you're doomed.