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:



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

Popular posts from this blog

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -

python 3.x - Mapping specific letters onto a list of words -