Click here to Skip to main content
15,886,799 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hi,

I have the following code in my location activity.
(this code was copied from Xamarin's Location Services demo)

C#
namespace LocationTutorialModified
{
    [Activity (Label = "LocationActivity", MainLauncher = true)]          
    public class LocationActivity : Activity, ILocationListener
    {
        LocationManager _locMgr;
     
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            SetContentView (Resource.Layout.LocationView);
            
            // use location service directly       
            _locMgr = GetSystemService (Context.LocationService) as LocationManager;

            _locMgr.RequestLocationUpdates("gps", 0, 0, this);

            Location lastKnownLocation = _locMgr.GetLastKnownLocation("gps");



            var locationText = FindViewById<TextView>(Resource.Id.locationTextView);

            if (lastKnownLocation != null)
            {
                locationText.Text = string.Format("Lat : {0}, Lon : {1}", lastKnownLocation.Latitude,
                    lastKnownLocation.Longitude);
            }
            else
            {
                locationText.Text = "Unaware of current location";
            }
        }
     
        protected override void OnResume ()
        {
            base.OnResume ();
         
            var locationCriteria = new Criteria ();
         
            locationCriteria.Accuracy = Accuracy.NoRequirement;
            locationCriteria.PowerRequirement = Power.NoRequirement;
         
            string locationProvider = _locMgr.GetBestProvider (locationCriteria, true);
            
            _locMgr.RequestLocationUpdates (locationProvider, 0, 0, this);
            //_locMgr.RequestLocationUpdates (LocationManager.GpsProvider, 2000, 1, this);
        }
        
        protected override void OnPause ()
        {
            base.OnPause ();
            
            _locMgr.RemoveUpdates (this);
        }

     #region ILocationListener implementation
        public void OnLocationChanged (Location location)
        {
            var locationText = FindViewById<TextView> (Resource.Id.locationTextView);
         
            locationText.Text += String.Format ("Latitude = {0}, Longitude = {1}", location.Latitude, location.Longitude);
         
            //// demo geocoder
         
            //new Thread (new ThreadStart (() => {
            //    var geocdr = new Geocoder (this);
             
            //    var addresses = geocdr.GetFromLocation (location.Latitude, location.Longitude, 5);
             
            //    //var addresses = geocdr.GetFromLocationName("Harvard University", 5);
             
            //    RunOnUiThread (() => {
            //        var addrText = FindViewById<TextView> (Resource.Id.addressTextView);
         
            //        addresses.ToList ().ForEach ((addr) => {
            //            addrText.Append (addr.ToString () + "\r\n\r\n");
            //        });
            //    });
             
            //})).Start ();
        }

        public void OnProviderDisabled (string provider)
        {
         
        }

        public void OnProviderEnabled (string provider)
        {
         
        }

        public void OnStatusChanged (string provider, Availability status, Bundle extras)
        {
         
        }
     #endregion


    }
}


Configuration Options:
1. I have set the project properties --> Target api to 10 since i'm running android 2.3.3 Virtual device from AVD manager

2. I have set project properties for --> Access_Fine / Coarse / Mock locations. They have been put in AndroidManifest after project build


When i deploy the applicaion, I get the "Unaware of current location" (set properly since lets say when the emulator starts, it doesnt know the location).

I'm trying to send DDMS - Mock latitude and longitude by using Emulator Control tab in DDMS tool, Still not getting the locations updated.

Can anyone please see and tell me what's going wrong. Please suggest any modifications and let me try it.

Thanks.
Posted

The code above, with some modifications should work. But as the solution I have posted to my original post suggests, the code was ok, but the "emulator" was the problem.

First I sued Android 2.3 this does not work for some reason. Then I installed Google API's for version 2.3, that is.. API level 10. When you start the emulator, don't use the one that says Android 2.3 API level 10, use the new GOOGLE emulator (again with version 2.3 and API 10).

For Google devices, lets say if I'm installing Android 2.3 from the SDK manager.
To get the Google emulator for that, install the sub category: Android 2.3.3 --> Google API's also. This will give you the option to create 2 different API level 10 emulators.
1. The original Android 2.3 API level 10 (which did not work for me)
2. The Google API Android 2.3 level 10 (which actually works by catching locations sent by DDMS, and also works while debugging on an actual android phone).

For simulations with the phone, I use GOOGLE API device as well.

Hope this helps. I will post a code update as soon as I've installed Mono for Android on my VS 2012 copy.

And It's great that you're learning. At the time I wrote this post, I pretty much didn't know anything about it. It comes by time and research (as usual).

Happy coding..
 
Share this answer
 
Comments
marcelo heber kuhl 20-Feb-13 12:46pm    
I installed the Google API's for version 2.3 but when I'm in visual studio and I click the f5 button, appears the emulators available, but there appears another emulator with API 10.

I'm trying to do but could not because the emulator does not appear anything like this in the emulator and not have the event "OnLocationChanged" and can not see the location.

Let me ask something else, I have to have a license to test mono applications on mobile?

Thank you for everything
Working Solution:

Main Issue: The API 10 Device i was running (Android 2.3.3) was not correct.
Although it runs properly, it will not receive DDMS mock locations.

Solution: Change API (Android Virtual Device) to : Google Inc Device, API Level 10 (for Android 2.3.3).

Now the DDMS will send locations properly and Google Inc Api Device, will catch locations and display it. Also, the OnStatusChanged method needs toast message. If not, then i'm getting run time crashes (will find out why).

P.S. I know i'm answering my own question, but this was frustrating to deal with. Hence might help someone.

Thank you Greg Shackles for your solutions.

C#
namespace LocationDemo
{
    [Activity(Label = "LocationDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class LocationActivity : Activity, ILocationListener
    {
        private LocationManager _locationManager;


        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);

            var welcomeText = FindViewById<textview>(Resource.Id.welcomeMessage);

            _locationManager = (LocationManager)GetSystemService(LocationService);
        }

        protected override void OnResume()
        {
            base.OnResume();

            var criteria = new Criteria();
            criteria.PowerRequirement = Power.NoRequirement;
            criteria.Accuracy = Accuracy.NoRequirement;

            string bestProvider = _locationManager.GetBestProvider(criteria, true);

            _locationManager.RequestLocationUpdates(bestProvider, 5000, 20, this);
        }

        protected override void OnPause()
        {
            base.OnPause();

            _locationManager.RemoveUpdates(this);
        }

        public void OnLocationChanged(Location location)
        {
            //var currentLocation = new GeoPoint((int) (location.Latitude * 1e6), (int) (location.Longitude * 1e6));

            //_mapOverlay.Add(currentLocation, "Current Location");

            //_map.Controller.AnimateTo(currentLocation);

            var locationText = FindViewById<textview>(Resource.Id.welcomeMessage);

            locationText.Text = string.Format("Latitude : {0}, Longitude : {1}", location.Latitude,
                location.Longitude);
        }

        public void OnProviderDisabled(string provider)
        {
            // called when a provider is disabled
        }

        public void OnProviderEnabled(string provider)
        {
            // called when a provider is enabled
        }

        public void OnStatusChanged(string provider, Availability status, Bundle extras)
        {
            Toast
                .MakeText(this, "Status for " + provider + " changed to " + status, ToastLength.Short)
                .Show();
        }
    }
}
 
Share this answer
 
v3
Comments
marcelo heber kuhl 18-Feb-13 15:48pm    
I could not retrieve the location with this code.
Can you please post the entire code.

I dont understand, where you called the event button to locate?
robroysd 18-Feb-13 16:30pm    
Hey, i'm sorry about this, but currently I have uninstalled monoForAndroid as I've recently upgraded to VS 2012. Still haven't downloaded MONO yet, and will take some time.

But as far as I remember, you don't have a button to push in order to get location.
During developmet, if you are using the right emulator, it can sent the locations to your phone.
_locationManager.RequestLocationUpdates(bestProvider, 5000, 20, this);
The above line of code, catches that location code automatically, and geocodes it.

Now, let's say you have a Mono for android license, and you are using your android phone to do the debugging. Then, turn the GPS in you phone ON. Make sure you have requested "ACCESS MOCK LOCATION" permission.
With the above things checked, all you need to do is, move the phone in your had like you are waving (or something) and the location is updated.

So to answer your question, there is no button.
During Dev, DDMS (the tool used to send fake locations to your phone) sends the location to your phone. Your phone thinks that It is moving and will geocode the fake location sent by DDMS. During live debug on your phone, you actually move your phone a feet or two for the GPS to kick in, this will get your actual location, where you are sitting and geocode that.

By the way: _locationManager.RequestLocationUpdates(bestProvider, 5000, 20, this);
in the above line of code, make sure you use 1,1 or 0,0 instead of 5000,20.
Someone in a post suggested this for development, debug because 0,0 says catch the location immediately, don't wait for the phone to move 20 feet. I think the 5000 and 20 above suggest how far the phone should move, before location updates are triggered gain. So you making this 0,0 or 1,1 would say.. don't wait at all, catch update without the phone moving, and wait for the phone to move 1 feet, 1 feet respectively.

Hope this helps, and sorry I couldn't furnish the code (project doesn't open without an installation of mono for android).
marcelo heber kuhl 19-Feb-13 11:54am    
great robroysd,

My code is the same solution 1, but could not make it work.
I'm using the emulator, the ANDROID 2.3.3 ... added support for GPS, but could not.

I have to move somehow to test?

How do I start the application as soon as you give me the location?

thanks for everything, I'm learning a lot.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900