xamarin - Google map Geocoder And MoveToRegion not working -
i' have strange issue xamarin.forms.maps. i'm trying implement page map current location , move region @ page start.
all working fine in ios, in android, geocoder & movetoregion not working @ all. map displayed.
i retrieve location correctly (long & lat ) in emulators & device. movetoregion nothing & getaddressesforpositionasync retrive nothing.
here information in manifest :
<meta-data android:name="com.google.android.maps.v2.api_key" android:value="mykey" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <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" /> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_location_extra_commands" /> <uses-permission android:name="android.permission.access_mock_location" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.access_wifi_state" />
here code :
map.movetoregion(mapspan.fromcenterandradius( new xamarin.forms.maps.position(coordinates.lat.value, coordinates.lng.value), distance.frommiles(1)) ); var possibleaddresses = await locator.getaddressesforpositionasync(position);
i tried in genymotion, emulator avd. i'm not able test in real device ( deployment fail in tablet )
edit :
global::xamarin.forms.forms.init(this, bundle);
was correctly set still not working.
i force geocoder usage , thrown error :
[monodroid] unhandled exception: [monodroid] java.io.ioexception: grpc failed [monodroid] @ system.runtime.exceptionservices.exceptiondispatchinfo.throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ java.interop.jnienvironment+instancemethods.callobjectmethod (java.interop.jniobjectreference instance, java.interop.jnimethodinfo method, java.interop.jniargumentvalue* args) [0x00069] in <6cd960837cc24c26bab2a0a29b597627>:0 [monodroid] @ java.interop.jnipeermembers+jniinstancemethods.invokeabstractobjectmethod (system.string encodedmember, java.interop.ijavapeerable self, java.interop.jniargumentvalue* parameters) [0x00014] in <6cd960837cc24c26bab2a0a29b597627>:0 [monodroid] @ android.locations.geocoder.getfromlocationname (system.string locationname, system.int32 maxresults) [0x0003c] in <d278c06ad5684d6882c743a94a93ebc2>:0 [monodroid] @ android.locations.geocoder+<>c__displayclass17_0.<getfromlocationnameasync>b__0 () [0x00000] in <d278c06ad5684d6882c743a94a93ebc2>:0 [monodroid] @ system.threading.tasks.task`1[tresult].innerinvoke () [0x0000f] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.threading.tasks.task.execute () [0x00010] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] --- end of stack trace previous location exception thrown --- [monodroid] @ system.runtime.exceptionservices.exceptiondispatchinfo.throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.throwfornonsuccess (system.threading.tasks.task task) [0x0003e] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.handlenonsuccessanddebuggernotification (system.threading.tasks.task task) [0x00028] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.validateend (system.threading.tasks.task task) [0x00008] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter`1[tresult].getresult () [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ xamarin.forms.maps.android.geocoderbackend+<getpositionsforaddressasync>d__1.movenext () [0x0006b] in <39c694c022be4f7b8a39897d372b2d00>:0 [monodroid] --- end of stack trace previous location exception thrown --- [monodroid] @ system.runtime.exceptionservices.exceptiondispatchinfo.throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.throwfornonsuccess (system.threading.tasks.task task) [0x0003e] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.handlenonsuccessanddebuggernotification (system.threading.tasks.task task) [0x00028] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter.validateend (system.threading.tasks.task task) [0x00008] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.taskawaiter`1[tresult].getresult () [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ picaplant.views.geolocationpage+<handleadresscompleted>d__8.movenext () [0x00047] in /users/orcusz/documents/autoentrepreneur/picaplant/source/picaplant/views/geolocationpage.xaml.cs:158 [monodroid] --- end of stack trace previous location exception thrown --- [monodroid] @ system.runtime.exceptionservices.exceptiondispatchinfo.throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ system.runtime.compilerservices.asyncmethodbuildercore+<>c.<throwasync>b__6_0 (system.object state) [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 [monodroid] @ android.app.synccontext+<>c__displayclass2_0.<post>b__0 () [0x00000] in <d278c06ad5684d6882c743a94a93ebc2>:0 [monodroid] @ java.lang.thread+runnableimplementor.run () [0x00008] in <d278c06ad5684d6882c743a94a93ebc2>:0 [monodroid] @ java.lang.irunnableinvoker.n_run (system.intptr jnienv, system.intptr native__this) [0x00008] in <d278c06ad5684d6882c743a94a93ebc2>:0 [monodroid] @ (wrapper dynamic-method) system.object:6621ff63-14b8-4291-a222-45bff630bddc (intptr,intptr) [monodroid] --- end of managed java.io.ioexception stack trace --- [monodroid] java.io.ioexception: grpc failed [monodroid] @ android.location.geocoder.getfromlocationname(geocoder.java:178) [monodroid]
edit 2 :
same error xamarin form working maps sample
any idea ?
here's working cross-platform sample app. runs in kitkat 4.4 api level 19 emulator , in samsung android device. present custom geocoder
implementation using http requests given standard 1 works fine actual android device returns empty response emulator.
xaml:
<?xml version="1.0" encoding="utf-8" ?> <contentpage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:maps="clr-namespace:xamarin.forms.maps;assembly=xamarin.forms.maps.dll" xmlns:local="clr-namespace:app20" x:class="app20.mainpage"> <contentpage.content> <grid> <grid.rowdefinitions> <rowdefinition height="8*"></rowdefinition> <rowdefinition height="4*"></rowdefinition> <rowdefinition height="*"></rowdefinition> <rowdefinition height="*"></rowdefinition> </grid.rowdefinitions> <maps:map x:name="map1" grid.row="0"></maps:map> <listview itemssource="{binding addresslist}" grid.row="1" /> <button text="move region" grid.row="2" clicked="button_clicked_move"></button> <button text="get address" grid.row="3" clicked="button_clicked_address"></button> </grid> </contentpage.content> </contentpage>
cs:
public partial class mainpage : contentpage { myviewmodel vm; public mainpage() { initializecomponent(); vm = new myviewmodel(); bindingcontext = vm; } private void button_clicked_move(object sender, eventargs e) { map1.movetoregion(mapspan.fromcenterandradius( new position(vm.lat, vm.lon), distance.frommiles(vm.distance))); } private async void button_clicked_address(object sender, eventargs e) { geocoder gc = new geocoder(); var list = await gc.getaddressesforpositionasync(new position(vm.lat, vm.lon)); if (list.count() > 0) { foreach (string s in list) vm.addresslist.add(s); } else { mygeocoder mgc = new mygeocoder(); var mylist = await mgc.getaddressesforpositionasync(vm.lat, vm.lon, vm.key); foreach (string s in mylist) vm.addresslist.add(s); } } }
view model:
public class myviewmodel { public string key { get; } public double lat { get; set; } public double lon { get; set; } public double distance { get; set; } public observablecollection<string> addresslist { get; set; } public myviewmodel() { lat = 40.706501; lon = -74.011340; distance = 0.5; key = "your_api_key"; addresslist = new observablecollection<string>(); } }
custom geocoder:
public class mygeocoder { public async task<ienumerable<string>> getaddressesforpositionasync(double lat, double lon, string key) { httpclient client = new httpclient(); var request = string.format(@"https://maps.googleapis.com/maps/api/geocode/json?latlng={0},{1}&key={2}", lat, lon, key); var json = await client.getstringasync(request); var result = jobject.parse(json)["results"]; list<string> list = new list<string>(); foreach (jtoken jt in result) list.add((string)jt["formatted_address"]); return list.asenumerable<string>(); } }
Comments
Post a Comment