android - Why autocomplete search dialog box not showing any suggestions? -
i following tutorial http://wptrafficanalyzer.in/blog/adding-google-places-autocomplete-api-as-custom-suggestions-in-android-search-dialog/
when try search through search box shows me nothing.
other information:
- i put browser key required in code. browser key generate through link https://code.google.com/apis/console
- way of generate browser key under credentials option--->create new key--->browser key.
- when try generate browser key ask me url, https://maps.googleapis.com/maps/api/place/details/ url because given in code , second time give nothing in url section google console generate key , show any referer allower under referer section. tried both keys search dialog box not show suggestion.
- when try generate
- i use android map api key in maninfest.
- logcat showing error during loading of map on emulator did not give problem load map. map showing successfully.
- map showing on emulater search in not working.+
- i not put map api key , browser key in code when post question used them during execution of code.
- i tried on real phone problem same.
- i tried other related tutorial site search through dialog not working me. http://wptrafficanalyzer.in/blog/android-searchview-widget-with-google-places-api-using-actionbarsherlock-library/
http://wptrafficanalyzer.in/blog/selecting-google-place-from-autocompletetextview-and-marking-in-google-map-android-api-v2/
http://wptrafficanalyzer.in/blog/android-autocompletetextview-with-google-places-autocomplete-api/
want show suggestion when user try input location address in auto complete box. how solve problem. help.
code
mainactivity.java
package in.wptrafficanalyzer.locationsearchdialogv2; import android.app.searchmanager; import android.content.intent; import android.database.cursor; import android.os.bundle; import android.support.v4.app.fragmentactivity; import android.support.v4.app.loadermanager.loadercallbacks; import android.support.v4.content.cursorloader; import android.support.v4.content.loader; import android.view.menu; import android.view.menuitem; import com.google.android.gms.maps.cameraupdate; import com.google.android.gms.maps.cameraupdatefactory; import com.google.android.gms.maps.googlemap; import com.google.android.gms.maps.supportmapfragment; import com.google.android.gms.maps.model.latlng; import com.google.android.gms.maps.model.markeroptions; public class mainactivity extends fragmentactivity implements loadercallbacks<cursor>{ googlemap mgooglemap; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); supportmapfragment fragment = (supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.map); mgooglemap = fragment.getmap(); handleintent(getintent()); } private void handleintent(intent intent){ if(intent.getaction().equals(intent.action_search)){ dosearch(intent.getstringextra(searchmanager.query)); }else if(intent.getaction().equals(intent.action_view)){ getplace(intent.getstringextra(searchmanager.extra_data_key)); } } @override protected void onnewintent(intent intent) { super.onnewintent(intent); setintent(intent); handleintent(intent); } private void dosearch(string query){ bundle data = new bundle(); data.putstring("query", query); getsupportloadermanager().restartloader(0, data, this); } private void getplace(string query){ bundle data = new bundle(); data.putstring("query", query); getsupportloadermanager().restartloader(1, data, this); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu getmenuinflater().inflate(r.menu.main, menu); return true; } @override public boolean onmenuitemselected(int featureid, menuitem item) { switch(item.getitemid()){ case r.id.action_search: onsearchrequested(); break; } return super.onmenuitemselected(featureid, item); } @override public loader<cursor> oncreateloader(int arg0, bundle query) { cursorloader cloader = null; if(arg0==0) cloader = new cursorloader(getbasecontext(), placeprovider.search_uri, null, null, new string[]{ query.getstring("query") }, null); else if(arg0==1) cloader = new cursorloader(getbasecontext(), placeprovider.details_uri, null, null, new string[]{ query.getstring("query") }, null); return cloader; } @override public void onloadfinished(loader<cursor> arg0, cursor c) { showlocations(c); } @override public void onloaderreset(loader<cursor> arg0) { // todo auto-generated method stub } private void showlocations(cursor c){ markeroptions markeroptions = null; latlng position = null; mgooglemap.clear(); while(c.movetonext()){ markeroptions = new markeroptions(); position = new latlng(double.parsedouble(c.getstring(1)),double.parsedouble(c.getstring(2))); markeroptions.position(position); markeroptions.title(c.getstring(0)); mgooglemap.addmarker(markeroptions); } if(position!=null){ cameraupdate cameraposition = cameraupdatefactory.newlatlng(position); mgooglemap.animatecamera(cameraposition); } } }
placedetailsjsonparser.java
package in.wptrafficanalyzer.locationsearchdialogv2; import java.util.arraylist; import java.util.hashmap; import java.util.list; import org.json.jsonexception; import org.json.jsonobject; public class placedetailsjsonparser { /** receives jsonobject , returns list */ public list<hashmap<string,string>> parse(jsonobject jobject){ double lat = double.valueof(0); double lng = double.valueof(0); string formattedaddress = ""; hashmap<string, string> hm = new hashmap<string, string>(); list<hashmap<string, string>> list = new arraylist<hashmap<string,string>>(); try { lat = (double)jobject.getjsonobject("result").getjsonobject("geometry").getjsonobject("location").get("lat"); lng = (double)jobject.getjsonobject("result").getjsonobject("geometry").getjsonobject("location").get("lng"); formattedaddress = (string) jobject.getjsonobject("result").get("formatted_address"); } catch (jsonexception e) { e.printstacktrace(); }catch(exception e){ e.printstacktrace(); } hm.put("lat", double.tostring(lat)); hm.put("lng", double.tostring(lng)); hm.put("formatted_address",formattedaddress); list.add(hm); return list; } }
placejsonparser.java
package in.wptrafficanalyzer.locationsearchdialogv2; import java.util.arraylist; import java.util.hashmap; import java.util.list; import org.json.jsonarray; import org.json.jsonexception; import org.json.jsonobject; public class placejsonparser { /** receives jsonobject , returns list */ public list<hashmap<string,string>> parse(jsonobject jobject){ jsonarray jplaces = null; try { /** retrieves elements in 'places' array */ jplaces = jobject.getjsonarray("predictions"); } catch (jsonexception e) { e.printstacktrace(); } /** invoking getplaces array of json object * each json object represent place */ return getplaces(jplaces); } private list<hashmap<string, string>> getplaces(jsonarray jplaces){ int placescount = jplaces.length(); list<hashmap<string, string>> placeslist = new arraylist<hashmap<string,string>>(); hashmap<string, string> place = null; /** taking each place, parses , adds list object */ for(int i=0; i<placescount;i++){ try { /** call getplace place json object parse place */ place = getplace((jsonobject)jplaces.get(i)); placeslist.add(place); } catch (jsonexception e) { e.printstacktrace(); } } return placeslist; } /** parsing place json object */ private hashmap<string, string> getplace(jsonobject jplace){ hashmap<string, string> place = new hashmap<string, string>(); string id=""; string reference=""; string description=""; try { description = jplace.getstring("description"); id = jplace.getstring("id"); reference = jplace.getstring("reference"); place.put("description", description); place.put("_id",id); place.put("reference",reference); } catch (jsonexception e) { e.printstacktrace(); } return place; } }
placeprovider.java
package in.wptrafficanalyzer.locationsearchdialogv2; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.io.unsupportedencodingexception; import java.net.httpurlconnection; import java.net.url; import java.net.urlencoder; import java.util.hashmap; import java.util.list; import org.json.jsonexception; import org.json.jsonobject; import android.app.searchmanager; import android.content.contentprovider; import android.content.contentvalues; import android.content.urimatcher; import android.database.cursor; import android.database.matrixcursor; import android.net.uri; import android.util.log; public class placeprovider extends contentprovider { public static final string authority = "in.wptrafficanalyzer.locationsearchdialogv2.placeprovider"; public static final uri search_uri = uri.parse("content://"+authority+"/search"); public static final uri details_uri = uri.parse("content://"+authority+"/details"); private static final int search = 1; private static final int suggestions = 2; private static final int details = 3; // obtain browser key https://code.google.com/apis/console string mkey = "key=your_browser_key"; // defines set of uris allowed content provider private static final urimatcher murimatcher = buildurimatcher(); private static urimatcher buildurimatcher() { urimatcher urimatcher = new urimatcher(urimatcher.no_match); // uri "go" button urimatcher.adduri(authority, "search", search ); // uri suggestions in search dialog urimatcher.adduri(authority, searchmanager.suggest_uri_path_query,suggestions); // uri details urimatcher.adduri(authority, "details",details); return urimatcher; } @override public cursor query(uri uri, string[] projection, string selection, string[] selectionargs, string sortorder) { cursor c = null; placejsonparser parser = new placejsonparser(); placedetailsjsonparser detailsparser = new placedetailsjsonparser(); string jsonstring = ""; string jsonplacedetails = ""; list<hashmap<string, string>> list = null; list<hashmap<string, string>> detailslist = null; matrixcursor mcursor = null; switch(murimatcher.match(uri)){ case search: // defining cursor object columns description, lat , lng mcursor = new matrixcursor(new string[] { "description","lat","lng" }); // create parser object parse places in json format parser = new placejsonparser(); // create parser object parse place details in json format detailsparser = new placedetailsjsonparser(); // places google places api jsonstring = getplaces(selectionargs); try { // parse places ( json => list ) list = parser.parse(new jsonobject(jsonstring)); // finding latitude , longitude each places using google places details api for(int i=0;i<list.size();i++){ hashmap<string, string> hmap = (hashmap<string, string>) list.get(i); detailsparser =new placedetailsjsonparser(); // place details jsonplacedetails = getplacedetails(hmap.get("reference")); // parse details ( json => list ) detailslist = detailsparser.parse(new jsonobject(jsonplacedetails)); // creating cursor object places for(int j=0;j<detailslist.size();j++){ hashmap<string, string> hmapdetails = detailslist.get(j); // adding place details cursor mcursor.addrow(new string[]{ hmap.get("description") , hmapdetails.get("lat") , hmapdetails.get("lng") }); } } } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } c = mcursor; break; case suggestions : // defining cursor object columns id, suggest_column_text_1, suggest_column_intent_extra_data mcursor = new matrixcursor(new string[] { "_id", searchmanager.suggest_column_text_1, searchmanager.suggest_column_intent_extra_data } ); // creating parser object parse places in json format parser = new placejsonparser(); // places google places api jsonstring = getplaces(selectionargs); try { // parse places ( json => list ) list = parser.parse(new jsonobject(jsonstring)); // creating cursor object places for(int i=0;i<list.size();i++){ hashmap<string, string> hmap = (hashmap<string, string>) list.get(i); // adding place details cursor mcursor.addrow(new string[] { integer.tostring(i), hmap.get("description"), hmap.get("reference") }); } } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } c = mcursor; break; case details : // defining cursor object columns description, lat , lng mcursor = new matrixcursor(new string[] { "description","lat","lng" }); detailsparser = new placedetailsjsonparser(); jsonplacedetails = getplacedetails(selectionargs[0]); try { detailslist = detailsparser.parse(new jsonobject(jsonplacedetails)); } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } for(int j=0;j<detailslist.size();j++){ hashmap<string, string> hmapdetails = detailslist.get(j); mcursor.addrow(new string[]{ hmapdetails.get("formatted_address") , hmapdetails.get("lat") , hmapdetails.get("lng") }); } c = mcursor; break; } return c; } @override public int delete(uri uri, string selection, string[] selectionargs) { // todo auto-generated method stub return 0; } @override public string gettype(uri uri) { // todo auto-generated method stub return null; } @override public uri insert(uri uri, contentvalues values) { // todo auto-generated method stub return null; } @override public boolean oncreate() { // todo auto-generated method stub return false; } @override public int update(uri uri, contentvalues values, string selection, string[] selectionargs) { // todo auto-generated method stub return 0; } /** method download json data url */ private string downloadurl(string strurl) throws ioexception{ string data = ""; inputstream istream = null; httpurlconnection urlconnection = null; try{ url url = new url(strurl); // creating http connection communicate url urlconnection = (httpurlconnection) url.openconnection(); // connecting url urlconnection.connect(); // reading data url istream = urlconnection.getinputstream(); bufferedreader br = new bufferedreader(new inputstreamreader(istream)); stringbuffer sb = new stringbuffer(); string line = ""; while( ( line = br.readline()) != null){ sb.append(line); } data = sb.tostring(); br.close(); }catch(exception e){ log.d("exception while downloading url", e.tostring()); }finally{ istream.close(); urlconnection.disconnect(); } return data; } private string getplacedetailsurl(string ref){ // reference of place string reference = "reference="+ref; // sensor enabled string sensor = "sensor=false"; // building parameters web service string parameters = reference+"&"+sensor+"&"+mkey; // output format string output = "json"; // building url web service string url = "https://maps.googleapis.com/maps/api/place/details/"+output+"?"+parameters; return url; } private string getplacesurl(string qry){ try { qry = "input=" + urlencoder.encode(qry, "utf-8"); } catch (unsupportedencodingexception e1) { e1.printstacktrace(); } // sensor enabled string sensor = "sensor=false"; // place type searched string types = "types=geocode"; // building parameters web service string parameters = qry+"&"+types+"&"+sensor+"&"+mkey; // output format string output = "json"; // building url web service string url = "https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters; return url; } private string getplaces(string[] params){ // storing data web service string data = ""; string url = getplacesurl(params[0]); try{ // fetching data web service in background data = downloadurl(url); }catch(exception e){ log.d("background task",e.tostring()); } return data; } private string getplacedetails(string reference){ string data = ""; string url = getplacedetailsurl(reference); try { data = downloadurl(url); } catch (ioexception e) { e.printstacktrace(); } return data; } }
androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="in.wptrafficanalyzer.locationsearchdialogv2" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="17" /> <!-- protect map component of application using application signature --> <permission android:name="in.wptrafficanalyzer.locationsearchdialogv2.permission.maps_receive" android:protectionlevel="signature" /> <!-- allows receive map --> <uses-permission android:name="in.wptrafficanalyzer.locationsearchdialogv2.permission.maps_receive" /> <!-- used google maps android api v2 download map tiles google maps servers --> <uses-permission android:name="android.permission.internet" /> <!-- allows google maps android api v2 cache map tile data in device's external storage area --> <uses-permission android:name="android.permission.write_external_storage" /> <!-- allows google maps android api v2 use wifi or mobile cell data (or both) determine device's location --> <uses-permission android:name="android.permission.access_coarse_location" /> <!-- allows google maps android api v2 use global positioning system (gps) determine device's location within small area --> <uses-permission android:name="android.permission.access_fine_location" /> <!-- allows contact google serves --> <uses-permission android:name="com.google.android.providers.gsf.permission.read_gservices" /> <!-- google maps android api v2 requires opengl es version 2 --> <uses-feature android:glesversion="0x00020000" android:required="true" /> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="in.wptrafficanalyzer.locationsearchdialogv2.mainactivity" android:label="@string/app_name" android:launchmode="singletop" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.search" /> </intent-filter> <!-- points searchable activity --> <meta-data android:name="android.app.default_searchable" android:value=".mainactivity" /> <!-- points searchable meta data --> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> <provider android:name=".placeprovider" android:authorities="in.wptrafficanalyzer.locationsearchdialogv2.placeprovider" android:exported="false" /> <!-- specifies android api key, obtained google api console --> <meta-data android:name="com.google.android.maps.v2.api_key" android:value="your_android_api_key" /> </application> </manifest>
logcat
04-17 05:23:22.709: d/packagebroadcastservice(1518): received broadcast action=android.intent.action.package_added , uri=in.wptrafficanalyzer.locationsearchdialogv2 04-17 05:23:22.779: e/icing(1518): couldn't handle android.intent.action.package_added intent due initialization failure. 04-17 05:23:22.779: i/peoplecontactssync(1518): cp2 sync disabled 04-17 05:23:23.849: i/multidex(2227): load(/system/priv-app/prebuiltgmscore.apk, forcereload=false) 04-17 05:23:24.059: d/dalvikvm(2227): gc_for_alloc freed 187k, 10% free 3047k/3356k, paused 17ms, total 17ms 04-17 05:23:24.059: i/multidex(2227): need extracted file /data/data/com.google.android.gms/files/secondary-dexes/prebuiltgmscore.apk.classes2.zip 04-17 05:23:24.059: i/multidex(2227): no extraction needed /data/data/com.google.android.gms/files/secondary-dexes/prebuiltgmscore.apk.classes2.zip of size 1547068 04-17 05:23:25.119: d/dalvikvm(2227): gc_for_alloc freed 354k, 13% free 3204k/3680k, paused 75ms, total 76ms 04-17 05:23:35.429: i/multidex(2288): load(/system/priv-app/prebuiltgmscore.apk, forcereload=false) 04-17 05:23:35.579: d/dalvikvm(2288): gc_for_alloc freed 184k, 10% free 3053k/3356k, paused 4ms, total 4ms 04-17 05:23:35.599: i/multidex(2288): need extracted file /data/data/com.google.android.gms/files/secondary-dexes/prebuiltgmscore.apk.classes2.zip 04-17 05:23:35.609: i/multidex(2288): no extraction needed /data/data/com.google.android.gms/files/secondary-dexes/prebuiltgmscore.apk.classes2.zip of size 1547068 04-17 05:23:35.649: d/packagebroadcastservice(2288): received broadcast action=android.intent.action.package_changed , uri=com.google.android.gms 04-17 05:23:35.649: i/packagebroadcastservice(2288): null package name or gms related package. ignoreing. 04-17 05:23:35.699: d/dalvikvm(2288): no jni_onload found in /system/lib/libappdatasearch.so 0xb2fd39d8, skipping init 04-17 05:23:35.699: e/icing(2288): native load error: version mismatch 4323070 vs 4323030 04-17 05:23:36.019: i/icing(2288): storage manager: low false usage 9.34kb avail 122.16mb capacity 167.55mb 04-17 05:23:36.179: d/dalvikvm(2288): gc_for_alloc freed 355k, 13% free 3195k/3672k, paused 4ms, total 4ms 04-17 05:23:36.199: e/icing(2288): error initializing, resetting corpora: not create native index 04-17 05:23:36.209: e/icing(2288): internal init failed 04-17 05:23:36.209: e/icing(2288): couldn't handle android.intent.action.package_changed intent due initialization failure.
for error regarding maps api,
you don't need use:
<permission android:name="in.wptrafficanalyzer.locationsearchdialogv2.permission.maps_receive" android:protectionlevel="signature" /> <!-- allows receive map --> instead use below application tag:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> as provided here,
a required meta-data tag in app's androidmanifest.xml not exist.
regarding places , autocomplete try perhaps,
https://developers.google.com/places/training/autocomplete-android
Comments
Post a Comment