归属地查询(联网+本地)
1 package com.highxin.number_location; 2 3 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.util.regex.Matcher; 9 import java.util.regex.Pattern; 10 import org.apache.http.HttpResponse; 11 import org.apache.http.ParseException; 12 import org.apache.http.client.ClientProtocolException; 13 import org.apache.http.client.methods.HttpGet; 14 import org.apache.http.impl.client.DefaultHttpClient; 15 import org.apache.http.util.EntityUtils; 16 import android.app.Activity; 17 import android.database.Cursor; 18 import android.database.sqlite.SQLiteDatabase; 19 import android.os.Bundle; 20 import android.os.Handler; 21 import android.os.Message; 22 import android.text.Editable; 23 import android.text.TextWatcher; 24 import android.view.View; 25 import android.view.View.OnClickListener; 26 import android.widget.Button; 27 import android.widget.EditText; 28 import android.widget.TextView; 29 import android.widget.Toast; 30 31 public class MainActivity extends Activity implements Runnable { 32 private SQLiteDatabase database; 33 private final String DATABASE_PATH = android.os.Environment 34 .getExternalStorageDirectory().getAbsolutePath() 35 + "/mobilelocation"; 36 private String number; 37 private String city; 38 private String location; 39 private final String DATABASE_FILENAME = "mobilelocation.db"; 40 private TextView tv; 41 private String baseURL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"; 42 String myurl=""; 43 String myresult=""; 44 String temp=""; 45 Thread t; 46 private Handler mHandler = new Handler() { 47 48 @Override 49 public void handleMessage(Message msg) { 50 super.handleMessage(msg); 51 myresult = filterHtml(temp); 52 tv.setText(myresult); 53 } 54 55 }; 56 @Override 57 protected void onCreate(Bundle savedInstanceState) { 58 super.onCreate(savedInstanceState); 59 setContentView(R.layout.activity_main); 60 final EditText et = (EditText) findViewById(R.id.et_number); 61 Button bt = (Button) findViewById(R.id.bt_srarch); 62 //ImageView iv = (ImageView) findViewById(R.id.iv_delete); 63 tv =(TextView) findViewById(R.id.tv_loaction); 64 65 66 67 database = openDatabase(); 68 et.addTextChangedListener(new TextWatcher() { 69 70 @Override 71 public void onTextChanged(CharSequence s, int start, int before, int count) { 72 // TODO Auto-generated method stub 73 74 } 75 76 @Override 77 public void beforeTextChanged(CharSequence s, int start, int count, 78 int after) { 79 // TODO Auto-generated method stub 80 81 } 82 83 @Override 84 public void afterTextChanged(Editable s) { 85 if(!isNumeric(s.toString()) || s.length()>11 ) { 86 Toast.makeText(MainActivity.this, "您输入的号码有误,请查证后再输!!", Toast.LENGTH_SHORT).show(); 87 return; 88 } 89 if(s.length()<7){ 90 return; 91 } 92 if(s.length()>=7 && s.length()<=11) { 93 s= (Editable) s.subSequence(0, 7); 94 } 95 96 // TODO Auto-generated method stub 97 Cursor cursor = database.rawQuery( 98 "select city,location from location_data where number=?", 99 new String[] 100 {s.toString()}); 101 if (cursor.getCount() > 0) 102 { 103 // 必须使用moveToFirst方法将记录指针移动到第1条记录的位置 104 cursor.moveToFirst(); 105 city = cursor.getString(cursor.getColumnIndex("city")); 106 location = cursor.getString(cursor.getColumnIndex("location")); 107 //将结果显示到TextView中 108 tv.setText(et.getText()+"\n"+city.toString()+"\n"+location.toString()); 109 } 110 else { 111 //将结果显示到TextView中 112 tv.setText(""); 113 Toast.makeText(MainActivity.this, "点击查询进行联网搜索", Toast.LENGTH_SHORT).show(); 114 } 115 } 116 }); 117 bt.setOnClickListener(new OnClickListener() { 118 @Override 119 public void onClick(View v) { 120 String result =""; 121 number = et.getText().toString(); 122 String b=""; 123 myurl = baseURL+"?mobileCode="+number+"&userID="+b; 124 t = new Thread(MainActivity.this); 125 t.start(); 126 System.out.println(myurl); 127 } 128 }); 129 } 130 131 private String OpenHttpConnection(String url) 132 { 133 String result = null; 134 HttpGet httpGet = new HttpGet(url); 135 HttpResponse httpResponse = null; 136 try { 137 httpResponse = new DefaultHttpClient().execute(httpGet); 138 } catch (ClientProtocolException e1) { 139 e1.printStackTrace(); 140 } catch (IOException e1) { 141 e1.printStackTrace(); 142 } 143 if (httpResponse.getStatusLine().getStatusCode() == 200) 144 { 145 //第三步,使用getEntity方法活得返回结果 146 try { 147 result = EntityUtils.toString(httpResponse.getEntity()); 148 } catch (ParseException e) { 149 e.printStackTrace(); 150 } catch (IOException e) { 151 e.printStackTrace(); 152 } 153 } 154 return result; 155 } 156 157 private SQLiteDatabase openDatabase() { 158 try 159 { 160 // 获得dictionary.db文件的绝对路径 161 String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 162 File dir = new File(DATABASE_PATH); 163 // 如果/sdcard/dictionary目录中存在,创建这个目录 164 if (!dir.exists()) 165 dir.mkdir(); 166 // 如果在/sdcard/dictionary目录中不存在 167 // dictionary.db文件,则从res\raw目录中复制这个文件到 168 // SD卡的目录(/sdcard/dictionary) 169 if (!(new File(databaseFilename)).exists()) 170 { 171 // 获得封装dictionary.db文件的InputStream对象 172 InputStream is = getResources().openRawResource( 173 R.raw.mobilelocation); 174 FileOutputStream fos = new FileOutputStream(databaseFilename); 175 byte[] buffer = new byte[50000]; 176 int count = 0; 177 // 开始复制dictionary.db文件 178 while ((count = is.read(buffer)) > 0) 179 { 180 fos.write(buffer, 0, count); 181 } 182 //关闭文件流 183 fos.close(); 184 is.close(); 185 } 186 // 打开/sdcard/dictionary目录中的dictionary.db文件 187 SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( 188 databaseFilename, null); 189 return database; 190 } 191 catch (Exception e) 192 { 193 } 194 //如果打开出错,则返回null 195 return null; 196 } 197 //判断字符串是否为数字 198 public boolean isNumeric(String str){ 199 Pattern pattern = Pattern.compile("[0-9]*"); 200 Matcher isNum = pattern.matcher(str); 201 if( !isNum.matches() ){ 202 return false; 203 } 204 return true; 205 } 206 //过滤掉<>中的无用信息 207 private String filterHtml(String source) { 208 if (null == source) { 209 return ""; 210 } 211 return source.replaceAll("</?[^>]+>", "").trim(); 212 } 213 @Override 214 public void run() { 215 temp=OpenHttpConnection(myurl); 216 mHandler.sendEmptyMessage(0); 217 } 218 }
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:orientation="vertical" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 <RelativeLayout 6 android:id="@+id/search" 7 android:layout_width="match_parent" 8 android:layout_height="wrap_content" > 9 <EditText 10 android:id="@+id/et_number" 11 android:layout_marginTop="1dp" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:background="@android:drawable/edit_text" 15 android:hint="请输入手机号" 16 android:layout_alignParentLeft="true" 17 android:layout_toLeftOf="@+id/bt_search" 18 android:ems="11" 19 android:singleLine="true" /> 20 <!-- <ImageView 21 android:id="@+id/iv_delete" 22 android:layout_width="10dp" 23 android:layout_height="10dp" 24 android:scaleType="centerCrop" 25 android:src="@drawable/delete" 26 android:visibility="invisible" 27 /> --> 28 <Button 29 android:id="@+id/bt_srarch" 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:layout_alignParentRight="true" 33 android:layout_alignParentTop="true" 34 android:text="搜索" 35 /> 36 37 </RelativeLayout> 38 39 40 <TextView 41 android:id="@+id/tv_loaction" 42 android:layout_width="wrap_content" 43 android:layout_height="wrap_content" 44 android:text="" /> 45 46 </LinearLayout>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/>
上面的写法虽然能获取到数据,但思路不是很清晰,下面是推荐的写法:
java.nei.HttpURLConnection类是另外一种访问HTTP资源的方式。HTTPURLConnection类具有完全的访问能力,可以取代HttpGet和HttpHost类。
1 private String getData(){ 2 String t=""; 3 try 4 { 5 InputStream is = getNetInputStream(myurl); 6 InputStreamReader isr = new InputStreamReader(is, "utf-8"); 7 BufferedReader br = new BufferedReader(isr); 8 String s = null; 9 while ((s = br.readLine()) != null) 10 { 11 String[] data = s.split(">"); 12 if (data.length > 1) 13 { 14 15 t = data[1]; 16 17 } 18 } 19 is.close(); 20 } 21 catch (Exception e) 22 { 23 // TODO: handle exception 24 } 25 26 return t; 27 } 28 private InputStream getNetInputStream(String urlStr) 29 { 30 try 31 { 32 URL url = new URL(urlStr); 33 URLConnection conn = url.openConnection(); 34 conn.connect(); 35 InputStream is = conn.getInputStream(); 36 return is; 37 } 38 catch (Exception e) 39 { 40 41 } 42 return null; 43 }
完整源码为:
1 package com.highxin.number_location; 2 3 4 import java.io.BufferedReader; 5 import java.io.File; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.InputStreamReader; 10 import java.net.URL; 11 import java.net.URLConnection; 12 import java.util.regex.Matcher; 13 import java.util.regex.Pattern; 14 import org.apache.http.HttpResponse; 15 import org.apache.http.ParseException; 16 import org.apache.http.client.ClientProtocolException; 17 import org.apache.http.client.methods.HttpGet; 18 import org.apache.http.impl.client.DefaultHttpClient; 19 import org.apache.http.util.EntityUtils; 20 import android.app.Activity; 21 import android.database.Cursor; 22 import android.database.sqlite.SQLiteDatabase; 23 import android.os.Bundle; 24 import android.os.Handler; 25 import android.os.Message; 26 import android.text.Editable; 27 import android.text.TextWatcher; 28 import android.util.Log; 29 import android.view.View; 30 import android.view.View.OnClickListener; 31 import android.widget.Button; 32 import android.widget.EditText; 33 import android.widget.TextView; 34 import android.widget.Toast; 35 36 public class MainActivity extends Activity implements Runnable { 37 private SQLiteDatabase database; 38 private final String DATABASE_PATH = android.os.Environment 39 .getExternalStorageDirectory().getAbsolutePath() 40 + "/mobilelocation"; 41 private String number; 42 private String city; 43 private String location; 44 private final String DATABASE_FILENAME = "mobilelocation.db"; 45 private TextView tv; 46 private String baseURL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"; 47 String myurl=""; 48 String myresult=""; 49 String temp=""; 50 Thread t; 51 private Handler mHandler = new Handler() { 52 53 @Override 54 public void handleMessage(Message msg) { 55 super.handleMessage(msg); 56 myresult = filterHtml(temp); 57 tv.setText(myresult.substring(0, myresult.length()-8)); 58 } 59 60 }; 61 @Override 62 protected void onCreate(Bundle savedInstanceState) { 63 super.onCreate(savedInstanceState); 64 setContentView(R.layout.activity_main); 65 final EditText et = (EditText) findViewById(R.id.et_number); 66 Button bt = (Button) findViewById(R.id.bt_srarch); 67 //ImageView iv = (ImageView) findViewById(R.id.iv_delete); 68 tv =(TextView) findViewById(R.id.tv_loaction); 69 70 71 72 database = openDatabase(); 73 et.addTextChangedListener(new TextWatcher() { 74 75 @Override 76 public void onTextChanged(CharSequence s, int start, int before, int count) { 77 // TODO Auto-generated method stub 78 79 } 80 81 @Override 82 public void beforeTextChanged(CharSequence s, int start, int count, 83 int after) { 84 // TODO Auto-generated method stub 85 86 } 87 88 @Override 89 public void afterTextChanged(Editable s) { 90 if(!isNumeric(s.toString()) || s.length()>11 ) { 91 Toast.makeText(MainActivity.this, "您输入的号码有误,请查证后再输!!", Toast.LENGTH_SHORT).show(); 92 return; 93 } 94 if(s.length()<7){ 95 return; 96 } 97 if(s.length()>=7 && s.length()<=11) { 98 s= (Editable) s.subSequence(0, 7); 99 } 100 101 // TODO Auto-generated method stub 102 Cursor cursor = database.rawQuery( 103 "select city,location from location_data where number=?", 104 new String[] 105 {s.toString()}); 106 if (cursor.getCount() > 0) 107 { 108 // 必须使用moveToFirst方法将记录指针移动到第1条记录的位置 109 cursor.moveToFirst(); 110 city = cursor.getString(cursor.getColumnIndex("city")); 111 location = cursor.getString(cursor.getColumnIndex("location")); 112 //将结果显示到TextView中 113 tv.setText(et.getText()+"\n"+city.toString()+"\n"+location.toString()); 114 } 115 else { 116 //将结果显示到TextView中 117 tv.setText(""); 118 Toast.makeText(MainActivity.this, "点击查询进行联网搜索,请先确保数据连接开启", Toast.LENGTH_SHORT).show(); 119 } 120 } 121 }); 122 bt.setOnClickListener(new OnClickListener() { 123 @Override 124 public void onClick(View v) { 125 String result =""; 126 number = et.getText().toString(); 127 String b=""; 128 myurl = baseURL+"?mobileCode="+number+"&userID="+b; 129 t = new Thread(MainActivity.this); 130 t.start(); 131 System.out.println(myurl); 132 } 133 }); 134 } 135 136 // private String OpenHttpConnection(String url) 137 // { 138 // String result = null; 139 // HttpGet httpGet = new HttpGet(url); 140 // HttpResponse httpResponse = null; 141 // try { 142 // httpResponse = new DefaultHttpClient().execute(httpGet); 143 // } catch (ClientProtocolException e1) { 144 // e1.printStackTrace(); 145 // } catch (IOException e1) { 146 // e1.printStackTrace(); 147 // } 148 // if (httpResponse.getStatusLine().getStatusCode() == 200) 149 // { 150 // //第三步,使用getEntity方法活得返回结果 151 // try { 152 // result = EntityUtils.toString(httpResponse.getEntity()); 153 // } catch (ParseException e) { 154 // e.printStackTrace(); 155 // } catch (IOException e) { 156 // e.printStackTrace(); 157 // } 158 // } 159 // return result; 160 // } 161 162 private SQLiteDatabase openDatabase() { 163 try 164 { 165 // 获得dictionary.db文件的绝对路径 166 String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 167 File dir = new File(DATABASE_PATH); 168 // 如果/sdcard/dictionary目录中存在,创建这个目录 169 if (!dir.exists()) 170 dir.mkdir(); 171 // 如果在/sdcard/dictionary目录中不存在 172 // dictionary.db文件,则从res\raw目录中复制这个文件到 173 // SD卡的目录(/sdcard/dictionary) 174 if (!(new File(databaseFilename)).exists()) 175 { 176 // 获得封装dictionary.db文件的InputStream对象 177 InputStream is = getResources().openRawResource( 178 R.raw.mobilelocation); 179 FileOutputStream fos = new FileOutputStream(databaseFilename); 180 byte[] buffer = new byte[50000]; 181 int count = 0; 182 // 开始复制dictionary.db文件 183 while ((count = is.read(buffer)) > 0) 184 { 185 fos.write(buffer, 0, count); 186 } 187 //关闭文件流 188 fos.close(); 189 is.close(); 190 } 191 // 打开/sdcard/dictionary目录中的dictionary.db文件 192 SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( 193 databaseFilename, null); 194 return database; 195 } 196 catch (Exception e) 197 { 198 } 199 //如果打开出错,则返回null 200 return null; 201 } 202 //判断字符串是否为数字 203 public boolean isNumeric(String str){ 204 Pattern pattern = Pattern.compile("[0-9]*"); 205 Matcher isNum = pattern.matcher(str); 206 if( !isNum.matches() ){ 207 return false; 208 } 209 return true; 210 } 211 //过滤掉<>中的无用信息 212 private String filterHtml(String source) { 213 if (null == source) { 214 return ""; 215 } 216 return source.replaceAll("</?[^>]+>", "").trim(); 217 } 218 private String getData(){ 219 String t=""; 220 try 221 { 222 InputStream is = getNetInputStream(myurl); 223 InputStreamReader isr = new InputStreamReader(is, "utf-8"); 224 BufferedReader br = new BufferedReader(isr); 225 String s = null; 226 while ((s = br.readLine()) != null) 227 { 228 String[] data = s.split(">"); 229 if (data.length > 1) 230 { 231 232 t = data[1]; 233 234 } 235 } 236 is.close(); 237 } 238 catch (Exception e) 239 { 240 // TODO: handle exception 241 } 242 243 return t; 244 } 245 private InputStream getNetInputStream(String urlStr) 246 { 247 try 248 { 249 URL url = new URL(urlStr); 250 URLConnection conn = url.openConnection(); 251 conn.connect(); 252 InputStream is = conn.getInputStream(); 253 return is; 254 } 255 catch (Exception e) 256 { 257 258 } 259 return null; 260 } 261 @Override 262 public void run() { 263 temp=getData(); 264 mHandler.sendEmptyMessage(0); 265 } 266 }
源码下载地址:https://files.cnblogs.com/hixin/Number_Location.rar
安装包下载:https://files.cnblogs.com/hixin/%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%9F%A5%E8%AF%A2.apk