Olá a todos, após algumas horas de leitura e persistência consegui desenvolver a app e faze-la funcionar.

Segue minha solução:
Primeiro procurei entender como o google disponibiliza o arquivo KML para consumo e como o arquivo é montado para desenvolver o parser corretamente.
Então, durante minhas pesquisas encontrei este link que explica de forma resumida como as coisas funcionam - https://developers.google.com/maps/documentation/directions/
Depois refatorei o método getUrl da classe UrlMap responsável por retornar o link de acesso.
public String getUrl(double[] start, double[] end){
StringBuffer urlString = new StringBuffer();
urlString.append("http://maps.googleapis.com/maps/api/directions/xml?");
urlString.append("&origin=");
urlString.append(start[0] + "," + start[1]); //latitude e longitude inicial
urlString.append("&destination=");
urlString.append(end[0] + "," + end[1]); //latitude e longitude final
urlString.append("&sensor=false");
urlString.append("®ion=br");
return urlString.toString();
}
Então montei o método getConnection da classe UrlMap que é o responsável por realizar a conexão com a URL e retornar o InputStream obtido.
public InputStream getConnection(String url){
try{
URL inUrl = new URL(url);
URLConnection conn = inUrl.openConnection();
return conn.getInputStream();
}catch(IOException e){
Log.w("UrlMap", "getConnection => " + e.getMessage());
}
return null;
}
Com a conexão pronta montei o método getRoute da classe UrlMap que faz o parser do arquivo KML.
public ArrayList<GeoPoint> getRoute(InputStream is) throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(is);
NodeList list = doc.getElementsByTagName("overview_polyline").item(0).getChildNodes().item(1).getChildNodes();
return decodePoly(list.item(0).getNodeValue());
}
Neste momento percebi que iria precisar de um decodificador, pois os pontos que são resgatados do KML no nó <overview_polyline> estão criptografados
então, depois de algumas pesquisas consegui montar o método decodePoly da classe UrlMap que monta o ArrayList de GeoPoint apenas informando a string criptografada.
private ArrayList<GeoPoint> decodePoly(String encoded) {
ArrayList<GeoPoint> poly = new ArrayList<GeoPoint>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;
while (index < len) {
int b, shift = 0, result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),
(int) (((double) lng / 1E5) * 1E6));
poly.add(p);
}
return poly;
}
Neste momento ja temos os GeoPoints praticamente montados, para conseguir desenhá-los no mapa vamos precisar de uma outra classe (RouteOverlay) que extende Overlay para conseguirmos desenhar as linhas do trajeto.
public class RouteOverlay extends Overlay{
private GeoPoint gp1;
private GeoPoint gp2;
private int color;
public RouteOverlay(GeoPoint gp1, GeoPoint gp2, int color) {
this.gp1 = gp1;
this.gp2 = gp2;
this.color = color;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
Paint paint = new Paint();
Point point = new Point();
projection.toPixels(gp1, point);
paint.setColor(color);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(50);
canvas.drawLine(point.x, point.y, point2.x, point2.y, paint);
super.draw(canvas, mapView, shadow);
}
}
Agora para concluir o projeto e conseguir desenhar uma rota entre dois pontos no mapa utilizando coordenadas, basta fazer as referências aos métodos criados
e associa-los corretamente na classe principal MainActivity:
public class MainActivity extends MapActivity {
private MapView mapView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView);
new Thread(){
public void run(){
Bundle trajeto = new Bundle();
//ponto inicial
trajeto.putDouble("latIni",-22.74943);
trajeto.putDouble("lonIni",-47.332735);
//ponto final
trajeto.putDouble("latFim",-22.711748);
trajeto.putDouble("lonFim",-47.289133);
Message message = new Message();
message.setData(trajeto);
handler.sendMessage(message);
}
}.start();
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
UrlMap urlMap = new UrlMap();
double inicio[] = {msg.getData().getDouble("latIni"),msg.getData().getDouble("lonIni")};
double fim[] = {msg.getData().getDouble("latFim"),msg.getData().getDouble("lonFim")};
try{
ArrayList<GeoPoint> geoPoints = urlMap.getRoute(urlMap.getConnection(urlMap.getUrl(inicio, fim)));
List<Overlay> overlays = mapView.getOverlays();
for (int i = 1; i < geoPoints.size(); i++)
overlays.add(new RouteOverlay(geoPoints.get(i - 1), geoPoints.get(i), Color.BLUE));
mapView.getController().setCenter(geoPoints.get(0));
mapView.getController().setZoom(16);
}catch(Exception e){
Log.w("MainActivity", "handleMessage => " + e.getMessage());
}
}
};
}
Esta solução não resolveu o problema da mensagem “Couldn’t get connection factory client”… 
Mas fez com que minha aplicação desenha-se a rota que eu estava esperando. 
Segue aqui alguns links que eu utilizei como referência:
https://developers.google.com/maps/documentation/directions/
https://developers.google.com/maps/documentation/utilities/polylinealgorithm
http://blog.synyx.de/2010/06/routing-driving-direc...2��-part-2-draw-the-route/
Segue o link do exemplo completo para download: http://www.4shared.com/zip/1teAPLXb/DrawRoute.html
Valeu, abraços.