java - getting the gps position not working -
i dont know why, unable gps position... lm.getlastknownlocation
returns null , onlocationchanged
never called. can see gps icon on system tray.
any ideas?
package com.localfotos; import java.io.bufferedoutputstream; import java.io.bufferedreader; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.net.malformedurlexception; import java.net.url; import java.net.urlconnection; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.client.httpclient; import org.apache.http.client.methods.httppost; import org.apache.http.impl.client.defaulthttpclient; import org.json.jsonexception; import org.json.jsonobject; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.matrix; import android.graphics.paint; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.os.handler; import android.service.wallpaper.wallpaperservice; import android.util.log; import android.view.motionevent; import android.view.surfaceholder; /* * animated wallpaper draws rotating wireframe cube. */ public class mywallpaperservice extends wallpaperservice implements locationlistener{ private final string tag = "wallpaperservice============================"; private locationmanager lm; private final handler mhandler = new handler(); @override public void onlocationchanged(location location) { log.d(tag, "got location!"); } @override public void onproviderdisabled(string provider) { // todo auto-generated method stub } @override public void onproviderenabled(string provider) { // todo auto-generated method stub } @override public void onstatuschanged(string provider, int status, bundle extras) { // todo auto-generated method stub } @override public void oncreate() { lm = (locationmanager)getsystemservice(context.location_service); lm.requestlocationupdates(locationmanager.gps_provider, 1000, 0, this); super.oncreate(); } @override public void ondestroy() { super.ondestroy(); lm.removeupdates(this); } @override public engine oncreateengine() { return new cubeengine(this); } class cubeengine extends engine{ mywallpaperservice mws; private final runnable mdrawcube = new runnable() { public void run() { drawframe(); } }; private boolean mvisible; private double lat = -1; private double lon = -1; cubeengine(mywallpaperservice mymws) { mws = mymws; } @override public void ondestroy() { super.ondestroy(); mhandler.removecallbacks(mdrawcube); } @override public void onvisibilitychanged(boolean visible) { mvisible = visible; if (visible) { drawframe(); } else { mhandler.removecallbacks(mdrawcube); } } @override public void onsurfacechanged(surfaceholder holder, int format, int width, int height) { super.onsurfacechanged(holder, format, width, height); drawframe(); } @override public void onsurfacecreated(surfaceholder holder) { super.onsurfacecreated(holder); } @override public void onsurfacedestroyed(surfaceholder holder) { super.onsurfacedestroyed(holder); mvisible = false; mhandler.removecallbacks(mdrawcube); } @override public void onoffsetschanged(float xoffset, float yoffset, float xstep, float ystep, int xpixels, int ypixels) { drawframe(); } /* * store position of touch event can use drawing later */ @override public void ontouchevent(motionevent event) { super.ontouchevent(event); } /* * draw 1 frame of animation. method gets called repeatedly * posting delayed runnable. can drawing want in * here. example draws wireframe cube. */ void drawframe() { final surfaceholder holder = getsurfaceholder(); canvas c = null; try { c = holder.lockcanvas(); if (c != null) { // draw drawcube(c); } } { if (c != null) holder.unlockcanvasandpost(c); } // reschedule next redraw mhandler.removecallbacks(mdrawcube); if (mvisible) { mhandler.postdelayed(mdrawcube, 1000 * 10); } } /* * draw wireframe cube drawing 12 3 dimensional lines between * adjacent corners of cube */ //taken http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/ private jsonobject getjsonfromurl(string url){ //initialize inputstream = null; string result = ""; jsonobject jarray = null; //http post try{ httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(url); httpresponse response = httpclient.execute(httppost); httpentity entity = response.getentity(); = entity.getcontent(); }catch(exception e){ log.e("log_tag", "error in http connection "+e.tostring()); } //convert response string try{ bufferedreader reader = new bufferedreader(new inputstreamreader(is,"iso-8859-1"), 8); stringbuilder sb = new stringbuilder(); string line = null; while ((line = reader.readline()) != null) { sb.append(line + "\n"); } is.close(); result=sb.tostring(); }catch(exception e){ log.e("log_tag", "error converting result "+e.tostring()); } //try parse string json object try{ jarray = new jsonobject(result); }catch(jsonexception e){ log.e("log_tag", "error parsing data "+e.tostring()); } return jarray; } string getpanoramiourl(double minx, double maxx, double maxy, double miny){ return "http://www.panoramio.com" + "/map/get_panoramas.php?" + "set=public&from=0&to=1&minx="+minx+"&miny="+miny+"&maxx="+maxx+"&maxy="+maxy; } void drawcube(canvas canvas) { //canvas.save(); //canvas.translate(0, 0); //c.drawcolor(0xff00aa00); location loc = mws.lm.getlastknownlocation(locationmanager.gps_provider); try{ if (lat == loc.getlatitude() && lon == loc.getlongitude()){ return; } }catch(nullpointerexception exc){ log.d(tag, "gps not ready"); return; } lat = loc.getlatitude(); lon = loc.getlongitude(); } } }
<application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name=".mywallpaperservice" android:label="@string/app_name" android:icon="@drawable/icon" android:permission="android.permission.bind_wallpaper"> <intent-filter> <action android:name="android.service.wallpaper.wallpaperservice" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/livewallpaper" /> </service> </application>
you need add
<uses-permission android:name="android.permission.access_fine_location" />
to use gps. use network location, use:
<uses-permission android:name="android.permission.access_coarse_location" />
i think work you.
Comments
Post a Comment