I need to build a feature in my app, where i need to show some content based on zip-code. Is there any way to find user location and ultimately find zip code?
I don't know if there is a inbuilt way. But, you can use external API. you can find zip code by Passing a IP Address. This is not a good way. Currently, Roku not Blocking any External API may be in Future like IOS. I hope this is helpful
@chaklasiyanikun Thanks for the reply. This is the same i have tried, but results are not very accurate with ip address.
@Manvendra It depends on API. I tried many API. and Found There is not a single one that gives an accurate result. But, I suggest one API which is better than all other. I'm not sure this is giving accurate result. But better than other API. I hope this is helpful.
@chaklasiyanikun Thanks. I will look into it.
This is very doable but as you and another user said, you need an external api and more importantly, one that is reliable in accuracy.
I can only recommend one api that has been flawless in which I use for weather features on the Roku and web apps.
You can see a demo with the response on page load and get a free api at https://ipstack.com/
Now we add a little bit of. code.
deviceInfo = CreateObject("roDeviceInfo") ip = deviceInfo.GetExternalIp() url = "http://api.ipstack.com/" + ip + "?access_key=yourIpStacksApiKey" m.locationData = createObject("roSGNode", "locationDataReader") m.locationData.contenturi = url m.locationData.observeField("content", "locationDataResponse") m.locationData.control = "RUN"
Create a task
<?xml version = "1.0" encoding = "utf-8" ?> <component name = "locationDataReader" extends = "Task" > <interface> <field id = "contenturi" type = "uri" /> <field id = "content" type = "node" /> </interface> <script type = "text/brightscript" > <![CDATA[ sub init() m.top.functionName = "getContent" end sub ' ********************************************** sub getContent() apiurl = m.top.url m.port = CreateObject ("roMessagePort") dataRequest = CreateObject("roUrlTransfer") dataRequest.setURL(apiurl) dataRequest.EnableEncodings(true) https = "https:" if LCase(Left(apiurl, Len(https))) = https dataRequest.SetCertificatesFile ("common:/certs/ca-bundle.crt") 'dataRequest.AddHeader ("X-Roku-Reserved-Dev-Id", "") dataRequest.InitClientCertificates () end if response = dataRequest.getToString()
'the data will returned as json and you can decide to parse or use regex to get the zipcode
zipRegex = CreateObject ("roRegex", "zip.:.(\d+).,.latitude", "")
if zipRegex.isMatch(response)
zipcode = zipRegex.Match(response)
'if the regex returned data
print zipcode
end if
'print the whole json response
print response end sub ]]> </script> </component>
@norcaljohnny Thank you so much. I will try this for sure.