Mono for Android - LocationServices not working
Hi,
I have the following code in my location activity.
(this code was copied from Xamarin's Location Services demo)
Collapse | Copy Code
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 25-May-12 5:38am
robroysd661
2 solutions
Sign Up to vote


Solution 1
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.
Collapse | Copy Code
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();
}
}
}
Posted 27-May-12 8:07am
robroysd661
Edited 27-May-12 8:12am
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.
Sign Up to vote


Solution 2
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..
Posted 19-Feb-13 6:14am
robroysd661
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
Mono for Android - LocationServices not working的更多相关文章
- 【月入41万】Mono For Android中使用百度地图SDK
借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...
- Android(1)—Mono For Android 环境搭建及破解
0.前言 最近公司打算开发一款Android平台的简单报表查询软件,因本人之前一直是.NET开发的,和领导商定之后决定采用Mono For Android 进行开发,暂时采用破解版进行开发: 下文是记 ...
- Android(4)—Mono For Android 第一个App应用程序
0.前言 年前就计划着写这篇博客,总结一下自己做的第一个App,却一直被新项目所累,今天抽空把它写完,记录并回顾一下相关知识点,也为刚学习Mono的同学提供佐证->C#也是开发Android的! ...
- mono for android 获取手机照片或拍照并裁剪保存
axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- mono for android Json 上传文件
void button_Click(object sender, EventArgs e) { string Url = "上传地址,服务器端负责接收"; byte[] fbyte ...
- mono for android 用ISharedPreferences 进行状态保持 会话保持 应用程序首选项保存
由于项目需要 要保持用户登录状态 要进行状态保持 用途就好像asp.net的session一样 登录的时候进行保存 ISharedPreferences shared = GetSharedPrefe ...
- mono for android 自定义titleBar Actionbar 顶部导航栏 修改 样式 学习
以前的我是没有做笔记的习惯的,学习了后觉得自己能记住,但是最近发现很多学的东西都忘记了,所有现在一有新的知识,就记下来吧. 最近又做一个mono for android 的项目 这次调整比较大,上次做 ...
- mono for android学习过程系列教程(1)
直接进入主题,关于mono for android的学习,首先配置好环境,如何配置环境,度娘谷歌一大堆,记得使用破解版. 我自己是百度“黑马四期”传智播客的视频,里面有破解版开发环境的软件. 今天直接 ...
- mono for android学习过程系列教程(2)
接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...
随机推荐
- 个人如何免费申请一个微信小程序账号进行开发尝鲜
大家都知道微信小程序并没有开放个人申请注册账号,觉得很遗憾,作为一个开发者,居然不能一览究竟. 前段时间研究了一番,教大家如何个人申请注册一个小程序账号,不花300块钱,当然只能作为开发尝鲜,不能发布 ...
- eclipse的thrift插件
插件网址为:http://thrift4eclipse.sourceforge.net/en/install.html,经测试对Eclipse 4.4.2也有效: Eclipse 4.4.2上的安装步 ...
- 2、Docker和虚拟机的对比
2.1 虚拟化技术 虚拟机Virtual Machine与容器化技术(代表Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同. Docker为代表的容器化技术并不是虚拟机. 虚拟 ...
- Delphi 文件拷贝
function DoCopyDir(sDirName:String;sToDirName:String):Boolean;var hFindFile:Cardinal; t,tfile:String ...
- [转]RTH试用手记之“偶发信号观测”
年初,罗德与施瓦茨公司(Rohde & Schwarz)推出了第一款的手持示波器,从指标上看,该示波器打破了传统手持器功能简单.指标水平低.结构粗糙的印象,取而代之达到了主流台式数字示波器的性 ...
- Solr查询query效果对比
q条件 默认分词(org.apache.solr.analysis.TokenizerChain) "parsedquery" IK分词(org.wltea.analyzer.lu ...
- hadoop 2.7.3伪分布式安装
hadoop 2.7.3伪分布式安装 hadoop集群的伪分布式部署由于只需要一台服务器,在测试,开发过程中还是很方便实用的,有必要将搭建伪分布式的过程记录下来,好记性不如烂笔头. hadoop 2. ...
- docker容器怎么设置开机启动
https://my.oschina.net/lwenhao/blog/1923003 docker服务器.以及容器设置自动启动 一.docker服务设置自动启动 说明:适用于yum安装的各种服务 查 ...
- uwp获取版本信息win10 VersionInfo
using Windows.System.Profile; Después vamos a agregar una propiedad que va a contener un mensaje con ...
- windows 10 自适应布局
https://msdn.microsoft.com/library/windows/apps/dn894631.aspx Use visual state triggers to build UI ...