javaandroidgoogle-mapsgeocodinglocation-based

getFromLocationName().size() returns always 0 - Android


In my application I have an activity in which you can pin in map a location based on the address you type in edittext or you can just move the pin that it appears in the onMapReady function.


My activity's layout has the fragment that shows the map, a button to return information about position of the pin in the previous activity and an edit text that after typing an address and press button, the previous pin that was on the map is being removed and a new one appears with the location you typed (if it exists).


-- This is my onMapReady function that has a listener in the search button and initialize the pin and the functions that takes pin location after you drag it:

 @Override
    public void onMapReady(final GoogleMap map) {
        map.setMyLocationEnabled(true);
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
        CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
        map.animateCamera(zoom);

        map.addMarker(new MarkerOptions()
                .title("Shop")
                .snippet("Is this the right location?")
                .position(position))
                .setDraggable(true);

        // map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
        map.setOnInfoWindowClickListener(this);
        map.setOnMarkerDragListener(this);

        ImageButton search = (ImageButton) findViewById(R.id.search);

        final EditText searchaddress = (EditText) findViewById(R.id.locationsearch);

        final int[] numAttempts = {0};

        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //FIND LOCATION BY ADDRESS
                Geocoder geoCoder = new Geocoder(MapsActivity.this.getApplicationContext(), Locale.getDefault());
//                try {
                if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
                    try {
                        List<Address> geoResults = geoCoder.getFromLocationName(searchaddress.getText().toString(), 1);

                        if (geoResults != null) {

                          //  do {
                          //      geoResults = geoCoder.getFromLocationName(searchaddress.getText().toString(), 1);

                            //    numAttempts[0] = numAttempts[0] + 1;
                         //   }
                         //   while (geoResults.size() == 0 || numAttempts[0] == 5);

                            if (geoResults.size() > 0) {
                                Address addr = geoResults.get(0);

                                if (!addr.toString().isEmpty()) {
                                    double latitude = addr.getLatitude();
                                    double longitude = addr.getLongitude();

                                    position = new LatLng(latitude, longitude);

                                    map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
                                    CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
                                    map.animateCamera(zoom);

                                    //Marker marker = null;
                                    map.clear();
                                    //marker.setPosition(position);
                                    map.addMarker(new MarkerOptions()
                                            .title("Shop")
                                            .snippet("Is this the right location?")
                                            .position(position))
                                            .setDraggable(true);

                                    // map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
                                    map.setOnInfoWindowClickListener(MapsActivity.this);
                                    map.setOnMarkerDragListener(MapsActivity.this);
                                } else {
                                    Toast.makeText(getApplicationContext(), "Addr is empty!", Toast.LENGTH_LONG).show();
                                }
                            } else {
                                Toast.makeText(getApplicationContext(), "Wrong address. Please try another one! :" + geoResults.size() + "!", Toast.LENGTH_LONG).show();
                            }
                        }
                        else {
                            Toast.makeText(getApplicationContext(), "Null address!", Toast.LENGTH_LONG).show();
                        }
                    }catch(Exception e) {
                        Log.e("GEOCODER", e.getMessage(), e);
                    }
    } else {
                        Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }

        @Override
        public void onInfoWindowClick(Marker marker) {
            //Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onMarkerDragStart(Marker marker) {
            LatLng position0 = marker.getPosition();

            Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f",
                    position0.latitude,
                    position0.longitude));
        }

        @Override
        public void onMarkerDrag(Marker marker) {
            LatLng position0 = marker.getPosition();

            Log.d(getClass().getSimpleName(),
                    String.format("Dragging to %f:%f", position0.latitude,
                            position0.longitude));

        }

        @Override
        public void onMarkerDragEnd(Marker marker) {
            position = marker.getPosition();

            Log.d(getClass().getSimpleName(), String.format("Dragged to %f:%f",
                    position.latitude,
                    position.longitude));
        }

Till a few days ago, I could display a pin from the location that the user typed in the edit text with exact the above code. Now, for unknown reason, I can't do this anymore with the exact same code.

Always it appears the toast about 'Wrong Address. Please try another one!' even though the address I type in edit text exists, the size of the geoResults is always 0 and no exception is occured in Logcat



-- When I remove from comments the do-while part, the exceptioms in logcat are the below:

02-24 13:13:53.251  28017-28024/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Jit: resizing JitTable from 4096 to 8192
02-24 13:14:57.465  28017-28020/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ threadid=3: reacting to signal 3
02-24 13:14:57.765  28017-28020/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
02-24 13:15:02.701  28017-28017/guide_me_for_all.guide_me_for_all A/libc﹕ Fatal signal 6 (SIGABRT) at 0x000008d2 (code=0), thread 28017 (uide_me_for_all)
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ handleBindApplication:guide_me_for_all.guide_me_for_all
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ setTargetHeapUtilization:0.75
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ setTargetHeapMinFree:524288
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 11956: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 11962: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 9598: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000e
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 570: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 592: Landroid/content/res/TypedArray;.getType (I)I
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
02-24 13:15:07.536  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:07.546  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:07.556  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.157  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.167  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.167  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.577  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
02-24 13:15:08.587  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
02-24 13:15:08.597  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
02-24 13:15:08.627  28881-28881/guide_me_for_all.guide_me_for_all D/OpenGLRenderer﹕ Enabling debug mode 0
02-24 13:15:08.647  28881-28881/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 59 frames!  The application may be doing too much work on its main thread.
02-24 13:15:09.598  28881-28881/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41f5b4e8 time:26642276

In this line:

12386-12386/guide_me_for_all.guide_me_for_all A/libc﹕ Fatal signal 6 (SIGABRT) at 0x000008d2 (code=0), thread 12386 (uide_me_for_all) ,

I don't know what this thing in the parenthesis is but my package name is guide_me_for_all not uide_me_for_all. (in case it has something to do with this)


If someone could help me find what does all the above mean, I would be really grateful.


Update after correcting the above code: Code to return position from the class to the previous activity (UNSOLVED - Always getting NULL Value):

In the class:

@Override
    protected void onPostExecute(LatLng result) {
        Log.i("GEOCODE", result.toString());

        Intent i = new Intent(this.mainContxt , MapsActivity.class );
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        i.putExtra( "latlng" , result );

        this.mainContxt.startActivity(i);

        super.onPostExecute(result);
    }

In onCreate of the MapsActivity, I have this:

 if (getIntent() != null) {
                Intent intent = getIntent();null){
                    position_from_address = intent.getStringExtra("latlng");
}

And after that in the onClickListener of search button of my activity, I am getting the position like this:

if (position_from_address != null){
                        String[] latlong = position_from_address.split(",");
                        double latitude = Double.parseDouble(latlong[0]);
                        double longitude = Double.parseDouble(latlong[1]);

                        position = new LatLng(latitude, longitude);

Solution

  • A problem might be that the lookup is not done in a background thread, try and copy-paste the code from my answer here: Google Geocoder service is unavaliable (Coordinates to address)

    Then run new GetAddressPositionTask().execute("someAddress") and see what happens.

    Passing a context to the AsyncTask:

    Add a constructor:

    public class GetAddressPositionTask extends
        AsyncTask<String, Integer, LatLng> {
    
         private Context context;
    
         public GetAddressPositionTask(Context context) {
             this.context = context;
         }
    
         // .. rest of the code here
    
    }
    

    Usage:

    GetAddressPositionTask(context).execute("someAddress")
    

    Where context is either getApplicationContext() or getActivity().getApplicationContext() if called from fragment.

    Regarding the nullpointer:

    Not 100% clear where you are getting the nullpointer, but you should be able to do like this:

    // in onPostExecute    
    i.putParcelable("latlng", result);
    

    and in MapsActivity

    LatLng position = (getIntent() != null) ? getParcelable("latlng") : null;
    

    Another place of concern is this.mainContxt. Simply do YourActivity.this instead or getApplicationContext(). If you are in a Fragment then do Context context = getActivity() and ensure that it is not null.