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的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...
随机推荐
- [Android] 对ImageView设置属性scaleType为FIT_START,如何去掉多余空白
当对ImageView设置了属性scaleType为FIT_START时,可以通过调用ImageView的setAdjustViewBounds(true). 即: imageView.setScal ...
- Yii2 upload
http://webtips.krajee.com/advanced-upload-using-yii2-fileinput-widget/ http://webtips.krajee.com/upl ...
- UVa 11297 Census (二维线段树)
题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...
- dojoConfig包的配置(7/26号夜)
主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- java并发编程实战:第十五章----原子变量与非阻塞机制
非阻塞算法:使用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性 应用于在操作系统和JVM中实现线程 / 进程调度机制.垃圾回收机制以及锁和其他并发数据结构 可伸缩性和活跃 ...
- log4j打印MyBatis的sql语句配置
log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...
- solr特点二:Facet(1)
一. Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更友好的搜索体验 . 在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计 . 二. Fa ...
- WPF 卡顿调试经验
1. 问题 最近的一个项目,正常调试情况下,运行一切正常,但是有某个用户登录后,出现界面卡顿2-3mins后,才正常运行. 2.解决问题方法 (1)首先由于是必现问题,就想在vs的工作环境下调试一下, ...
- 一个CXF集成SPRING的WEBSERVICE完整实例
1 首先准备以下JAR包 activation.jar commons-logging-1.1.1.jar cxf-2.5.6.jar jaxb-api-2.2.1.jar jaxb-impl-2.1 ...
- WPF 背景网格图
利用DrawingBrush来画出背景网格图 <DrawingBrush Viewport="0,0,80,80" ViewportUnits="Absolute& ...