0

I am developing an app in which an activity locates the current latitude and longitude and then draws a polyline from current location to a given(hardcoded) location.But the problem is that the activity is working perfectly fine on Android 4.x but not on gingerbread even though I have properly included support library and used support map fragment.

When I run my activity on 4.x above it works fine but on gingerbread the activity starts and then sometimes the markers appear and then app is restarted,sometimes even markers does not appear and after trying for 4-5 times a fatal error(not always) is shown by the OS(activity crashes).

I cannot post my logcat here because I cannot debug my app using eclipse as I cannot find valid drivers for my device.

The code snippets are:

The code of my activity is

package si.scrolls2013;

import java.util.ArrayList;

import org.w3c.dom.Document;

import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

public class NavigationActivity extends FragmentActivity {

    // Google Map
    private GoogleMap googleMap;
    GMapV2Direction md;

    //Document
    Document doc;

    //location
    GPSTracker gps;

    LatLng fromPosition;
    LatLng toPosition = new LatLng(28.675751, 77.502818);
    double latitude;
    double longitude;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_activity);

        try {
            // Loading map
            initilizeMap();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * function to load map. If map is not created it will create it for you
     * */
    private void initilizeMap() {

        md = new GMapV2Direction();
        googleMap = ((SupportMapFragment)getSupportFragmentManager()
                .findFragmentById(R.id.map)).getMap();

        gps = new GPSTracker(NavigationActivity.this);

        // check if GPS enabled     
        if(gps.canGetLocation()){

            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
            Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();    


        }else{
            // can't get location
            // GPS or Network is not enabled
            // Ask user to enable GPS/network in settings
            gps.showSettingsAlert();
        }

            fromPosition= new LatLng(latitude, longitude);

        LatLng coordinates = new LatLng(latitude, longitude);       
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 14));

        googleMap.addMarker(new MarkerOptions().position(fromPosition).title("Start"));
        googleMap.addMarker(new MarkerOptions().position(toPosition).title("End"));

        new MapDraw().execute();

    }




    @Override
    protected void onResume() {
        super.onResume();
        initilizeMap();
    }

    class MapDraw extends AsyncTask<String, String, String>
    {



        @Override
        protected String doInBackground(String... params) {
            doc = md.getDocument(fromPosition, toPosition, GMapV2Direction.MODE_DRIVING);
            md.getDurationValue(doc);
            md.getDistanceText(doc);
            md.getStartAddress(doc);
            md.getCopyRights(doc);

            return null;
        }

        protected void onPostExecute(String url)
        {
            ArrayList<LatLng> directionPoint = md.getDirection(doc);
            PolylineOptions rectLine = new PolylineOptions().width(3).color(Color.RED);

            for(int i = 0 ; i < directionPoint.size() ; i++) {          
                rectLine.add(directionPoint.get(i));
            }

            googleMap.addPolyline(rectLine);

        }
    }


}

the manifest file is:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="si.scrolls2013"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
         />



    <permission
        android:name="si.scrolls2013.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="si.scrolls2013.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission                android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- Required to show current location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- Required OpenGL ES 2.0. for Maps V2 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="si.scrolls2013.MainActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.Details"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.QueryActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.TopicsActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.NavigationActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.IdCardDetails"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.IdCardActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="si.scrolls2013.Scrolls"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="xxxxx" />

        <uses-library
            android:name="com.google.android.maps"
            android:required="true" />
    </application>

</manifest>

the layout file for navigation activity is:

        <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"
     />

</RelativeLayout>

EDIT:

Did find out that problem occurs if

new MapDraw().execute();

is executed in the activity and if I comment it out then other things work fine:

The code of GMapV2Direction class is:

        package si.scrolls2013;

import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.google.android.gms.maps.model.LatLng;

import android.content.Context;
import android.util.Log;

public class GMapV2Direction {
    public final static String MODE_DRIVING = "driving";
    public final static String MODE_WALKING = "walking";

    public GMapV2Direction() { }

    public Document getDocument(LatLng start, LatLng end, String mode) {
        String url = "http://maps.googleapis.com/maps/api/directions/xml?" 
                + "origin=" + start.latitude + "," + start.longitude  
                + "&destination=" + end.latitude + "," + end.longitude 
                + "&sensor=false&units=metric&mode=driving";

        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse response = httpClient.execute(httpPost, localContext);
            InputStream in = response.getEntity().getContent();
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(in);
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getDurationText (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("duration");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "text"));
        Log.i("DurationText", node2.getTextContent());
        return node2.getTextContent();
    }

    public int getDurationValue (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("duration");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "value"));
        Log.i("DurationValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
    }

    public String getDistanceText (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "text"));
        Log.i("DistanceText", node2.getTextContent());
        return node2.getTextContent();
    }

    public int getDistanceValue (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "value"));
        Log.i("DistanceValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
    }

    public String getStartAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("start_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
    }

    public String getEndAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("end_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
    }

    public String getCopyRights (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("copyrights");
        Node node1 = nl1.item(0);
        Log.i("CopyRights", node1.getTextContent());
        return node1.getTextContent();
    }

    public ArrayList<LatLng> getDirection (Document doc) {
        NodeList nl1, nl2, nl3;
        ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>();
        nl1 = doc.getElementsByTagName("step");
        if (nl1.getLength() > 0) {
            for (int i = 0; i < nl1.getLength(); i++) {
                Node node1 = nl1.item(i);
                nl2 = node1.getChildNodes();

                Node locationNode = nl2.item(getNodeIndex(nl2, "start_location"));
                nl3 = locationNode.getChildNodes();
                Node latNode = nl3.item(getNodeIndex(nl3, "lat"));
                double lat = Double.parseDouble(latNode.getTextContent());
                Node lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                double lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));

                locationNode = nl2.item(getNodeIndex(nl2, "polyline"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "points"));
                ArrayList<LatLng> arr = decodePoly(latNode.getTextContent());
                for(int j = 0 ; j < arr.size() ; j++) {
                    listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude));
                }

                locationNode = nl2.item(getNodeIndex(nl2, "end_location"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "lat"));
                lat = Double.parseDouble(latNode.getTextContent());
                lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));
            }
        }

        return listGeopoints;
    }

    private int getNodeIndex(NodeList nl, String nodename) {
        for(int i = 0 ; i < nl.getLength() ; i++) {
            if(nl.item(i).getNodeName().equals(nodename))
                return i;
        }
        return -1;
    }

    private ArrayList<LatLng> decodePoly(String encoded) {
        ArrayList<LatLng> poly = new ArrayList<LatLng>();
        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;

            LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5);
            poly.add(position);
        }
        return poly;
    }

}

so are their any comptability issues with GMapV2Direction class?
`

ofnowhere
  • 1,114
  • 2
  • 16
  • 40
  • you are going to have to give us more information on what its not doing since you cannot post the logcat. it might have something to do with the fact that you are trying to use 2 different MapFragments – tyczj Sep 04 '13 at 20:56
  • ummmm what happens on a emulator ? and what happens if you 'down grade' it from a fragment to an activity ? – Howard Pautz Sep 04 '13 at 20:56
  • I have edited accordingly to tell what is happening in real device – ofnowhere Sep 04 '13 at 21:01
  • @HowardPautz only "Activity" would not support "SupportMapFragment" so I have to use FragmentActivty – ofnowhere Sep 04 '13 at 21:09
  • ok - didn't catch that. Is there a non-fragment maps available to test ? The reason I'm suggesting this is because of the added layer of the v4 support library for backwards compatibility. I've had problems using it - and specifically with fragments. note this post maybe: http://stackoverflow.com/questions/14368397/google-map-does-not-appear-in-the-mapactivity – Howard Pautz Sep 04 '13 at 21:14
  • @HowardPautz when I was not trying to find current location and was using hardcoded locations it was working fine but after I have added the code to get current location the problem has risen – ofnowhere Sep 04 '13 at 21:21
  • ok - now I'm confused ... you said you couldn't get this to work in eclipse because, as you said, you couldn't "find valid drivers for my device. " So how did you test at all with hardcoded locations ?? – Howard Pautz Sep 04 '13 at 21:23
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/36818/discussion-between-prince-arora-and-howard-pautz) – ofnowhere Sep 04 '13 at 21:24
  • ok heading over there ... – Howard Pautz Sep 04 '13 at 21:24
  • @tyczj What do you mean by 2 different MapFragments? – ofnowhere Sep 04 '13 at 21:43

0 Answers0