亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

Android開發筆記之簡單基站定位程序的實現

2020-07-26 03:07:11
字體:
來源:轉載
供稿:網友

經過學習,已經對Android程序的開發流程有了個大體的了解,為了提高我們的學習興趣,在這一節我們將編寫一個簡單的基站定位程序。現在LBS(Location Based Service,基于位置的服務)移動應用相當流行(如:微信,切客,嘀咕,街旁等),基站定位是這類程序用到的關鍵性技術之一,我們來揭開它的神秘面紗吧。

在這一節里,我們會接觸到事件、TelephonyManager、HTTP通信、JSON的使用等知識點。

在Android操作系統下,基站定位其實很簡單,先說一下實現流程:

調用SDK中的API(TelephonyManager)獲得MCC、MNC、LAC、CID等信息,然后通過google的API獲得所在位置的經緯度,最后再通過google map的API獲得實際的地理位置。(google真牛?。?/p>

有同學會問:MNC、MCC、LAC、CID都是些什么東西?google又怎么通過這些東西就獲得經緯度了呢?

我們一起來學習一下:

MCC,Mobile Country Code,移動國家代碼(中國的為460);

MNC,Mobile Network Code,移動網絡號碼(中國移動為00,中國聯通為01);

LAC,Location Area Code,位置區域碼;

CID,Cell Identity,基站編號,是個16位的數據(范圍是0到65535)。

了解了這幾個名詞的意思,相信有些朋友已經知道后面的事了:google存儲了這些信息,直接查詢就能得到經緯度了。(至于google怎么得到移動、聯通的基站信息,這就不得而知了,反正google免費提供接口,直接調用就是)

下面開始動手。

一、設置界面

我們在上一節的程序的基礎上進行開發,在DemoActivity的界面上實現這個功能。

首先我們將DemoActivity使用的布局修改一下:

第1行為TextView,顯示提示文字;第2行為一個Button,觸發事件;第3行、第4行分別顯示基站信息和地理位置(現在為空,看不到)。

layout/main.xml文件內容如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical" >   <TextView    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="Please click the button below to get your location" />   <Button    android:id="@+id/button1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Click Me" />   <TextView    android:id="@+id/cellText"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="" />   <TextView    android:id="@+id/lacationText"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="" /> </LinearLayout>

接下來我們打開DemoActivity.java編寫代碼。

二、為按鈕綁定事件

我們在Activity創建時綁定事件,將以下代碼添加到setContentView(R.layout.main);后:

/** 為按鈕綁定事件 */Button btnGetLocation = (Button)findViewById(R.id.button1);btnGetLocation.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View arg0) {    // TODO Auto-generated method stub    onBtnClick();  }});

同時還需要在頭部import相關組件:

import android.view.View;import android.widget.Button;import android.view.View.OnClickListener;

我們來分析一下這段代碼:

首先我們通過findViewById(R.id.button1)找到按鈕這個對象,前面加(Button)表示顯示的轉換為Button對象;

然后設置按鈕點擊事件的監聽器,參數為OnClickListener對象,再重載這個類的onClick方法,調用onBtnClick方法(這個方法得由我們自己去寫,他在點擊按鈕時被調用)。

好了,調用方法寫好了,我們來寫實現(調用后需要做什么事)。動手編碼之前先在腦中整理好思路,養成好習慣。

我們需要在DemoActivty類中添加如下私有方法:

我們需要剛剛提到的onBtnClick回調方法,被調用時實現取得基站信息、獲取經緯度、獲取地理位置、顯示的功能。但是很顯然,全部揉到一個方法里面并不是個好主意,我們將它分割為幾個方法;

  • 添加獲取基站信息的方法getCellInfo,返回基站信息;
  • 添加獲取經緯度的方法getItude,傳入基站信息,返回經緯度;
  • 添加獲取地理位置的方法getLocation,傳入經緯度,返回地理位置;
  • 添加顯示結果的方法showResult,傳入得到的信息在界面上顯示出來。

好了,先將方法添上,完整代碼如下:

package com.android.demo; import android.R.bool;import android.R.integer;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.view.View.OnClickListener; public class DemoActivity extends Activity {  /** Called when the activity is first created. */  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);         /** 為按鈕綁定事件 */    Button btnGetLocation = (Button)findViewById(R.id.button1);    btnGetLocation.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View arg0) {        // TODO Auto-generated method stub        onBtnClick();      }    });  }     /** 基站信息結構體 */  public class SCell{    public int MCC;    public int MNC;    public int LAC;    public int CID;  }     /** 經緯度信息結構體 */  public class SItude{    public String latitude;    public String longitude;  }     /** 按鈕點擊回調函數 */  private void onBtnClick(){       }     /** 獲取基站信息 */  private SCell getCellInfo(){   }     /** 獲取經緯度 */  private SItude getItude(SCell cell){       }     /** 獲取地理位置 */  private String getLocation(SItude itude){       }     /** 顯示結果 */  private void showResult(SCell cell, String location){       }}

現在在onBtnClick方法中編碼,依次調用后面幾個方法,代碼如下:

/** 按鈕點擊回調函數 */private void onBtnClick(){  /** 彈出一個等待狀態的框 */  ProgressDialog mProgressDialog = new ProgressDialog(this);  mProgressDialog.setMessage("正在獲取中...");  mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  mProgressDialog.show();     try {    /** 獲取基站數據 */    SCell cell = getCellInfo();         /** 根據基站數據獲取經緯度 */    SItude itude = getItude(cell);         /** 獲取地理位置 */    String location = getLocation(itude);         /** 顯示結果 */    showResult(cell, location);         /** 關閉對話框 */    mProgressDialog.dismiss();  }catch (Exception e) {    /** 關閉對話框 */    mProgressDialog.dismiss();    /** 顯示錯誤 */    TextView cellText = (TextView)findViewById(R.id.cellText);    cellText.setText(e.getMessage());  }}

按鈕相關的工作就完成了,接下來編寫獲取基站信息的方法。

三、獲取基站信息

獲取基站信息我們需要調用SDK提供的API中的TelephonyManager,需要在文件頭部引入:

import android.telephony.TelephonyManager;import android.telephony.gsm.GsmCellLocation;

完整代碼為:

/** * 獲取基站信息 *  * @throws Exception */private SCell getCellInfo() throws Exception {  SCell cell = new SCell();   /** 調用API獲取基站信息 */  TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();  if (location == null)    throw new Exception("獲取基站信息失敗");   String operator = mTelNet.getNetworkOperator();  int mcc = Integer.parseInt(operator.substring(0, 3));  int mnc = Integer.parseInt(operator.substring(3));  int cid = location.getCid();  int lac = location.getLac();   /** 將獲得的數據放到結構體中 */  cell.MCC = mcc;  cell.MNC = mnc;  cell.LAC = lac;  cell.CID = cid;   return cell;}

如果獲得的位置信息為null將拋出錯誤,不再繼續執行。最后將獲取的基站信息封裝為結構體返回。

四、獲取經緯度

在這一步,我們需要采用HTTP調用google的API以獲取基站所在的經緯度。

Android作為一款互聯網手機,聯網的功能必不可少。Android提供了多個接口供我們使用,這里我們使用DefaultHttpClient。

完整的方法代碼如下:

/** * 獲取經緯度 *  * @throws Exception */private SItude getItude(SCell cell) throws Exception {  SItude itude = new SItude();   /** 采用Android默認的HttpClient */  HttpClient client = new DefaultHttpClient();  /** 采用POST方法 */  HttpPost post = new HttpPost("http://www.google.com/loc/json");  try {    /** 構造POST的JSON數據 */    JSONObject holder = new JSONObject();    holder.put("version", "1.1.0");    holder.put("host", "maps.google.com");    holder.put("address_language", "zh_CN");    holder.put("request_address", true);    holder.put("radio_type", "gsm");    holder.put("carrier", "HTC");     JSONObject tower = new JSONObject();    tower.put("mobile_country_code", cell.MCC);    tower.put("mobile_network_code", cell.MNC);    tower.put("cell_id", cell.CID);    tower.put("location_area_code", cell.LAC);     JSONArray towerarray = new JSONArray();    towerarray.put(tower);    holder.put("cell_towers", towerarray);     StringEntity query = new StringEntity(holder.toString());    post.setEntity(query);     /** 發出POST數據并獲取返回數據 */    HttpResponse response = client.execute(post);    HttpEntity entity = response.getEntity();    BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));    StringBuffer strBuff = new StringBuffer();    String result = null;    while ((result = buffReader.readLine()) != null) {      strBuff.append(result);    }     /** 解析返回的JSON數據獲得經緯度 */    JSONObject json = new JSONObject(strBuff.toString());    JSONObject subjosn = new JSONObject(json.getString("location"));     itude.latitude = subjosn.getString("latitude");    itude.longitude = subjosn.getString("longitude");         Log.i("Itude", itude.latitude + itude.longitude);       } catch (Exception e) {    Log.e(e.getMessage(), e.toString());    throw new Exception("獲取經緯度出現錯誤:"+e.getMessage());  } finally{    post.abort();    client = null;  }     return itude;}

在這里采用POST方法將JSON數據發送到googleAPI,google返回JSON數據,我們得到數據后解析,得到經緯度信息。

五、獲取物理位置

得到經緯度后,我們將之轉換為物理地址。

我們仍然使用DefaultHttpClient來調用google地圖的API,獲得物理信息,不過在這里我們使用GET方法。

完整的方法代碼如下:

/** * 獲取地理位置 *  * @throws Exception */private String getLocation(SItude itude) throws Exception {  String resultString = "";   /** 這里采用get方法,直接將參數加到URL上 */  String urlString = String.format("http://maps.google.cn/maps/geo?key=abcdefg&q=%s,%s", itude.latitude, itude.longitude);  Log.i("URL", urlString);   /** 新建HttpClient */  HttpClient client = new DefaultHttpClient();  /** 采用GET方法 */  HttpGet get = new HttpGet(urlString);  try {    /** 發起GET請求并獲得返回數據 */    HttpResponse response = client.execute(get);    HttpEntity entity = response.getEntity();    BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));    StringBuffer strBuff = new StringBuffer();    String result = null;    while ((result = buffReader.readLine()) != null) {      strBuff.append(result);    }    resultString = strBuff.toString();     /** 解析JSON數據,獲得物理地址 */    if (resultString != null && resultString.length() > 0) {      JSONObject jsonobject = new JSONObject(resultString);      JSONArray jsonArray = new JSONArray(jsonobject.get("Placemark").toString());      resultString = "";      for (int i = 0; i < jsonArray.length(); i++) {        resultString = jsonArray.getJSONObject(i).getString("address");      }    }  } catch (Exception e) {    throw new Exception("獲取物理位置出現錯誤:" + e.getMessage());  } finally {    get.abort();    client = null;  }   return resultString;}

GET方法就比POST方法簡單多了,得到的數據同樣為JSON格式,解析一下得到物理地址。

六、顯示結果

好了,我們已經得到我們想要的信息了,我們把它顯示出來,方法代碼如下:

/** 顯示結果 */private void showResult(SCell cell, String location) {  TextView cellText = (TextView) findViewById(R.id.cellText);  cellText.setText(String.format("基站信息:mcc:%d, mnc:%d, lac:%d, cid:%d",      cell.MCC, cell.MNC, cell.LAC, cell.CID));   TextView locationText = (TextView) findViewById(R.id.lacationText);  locationText.setText("物理位置:" + location);}

七、運行程序

我們的編碼工作已經完成了。在上面的代碼中有些地方需要的引入代碼沒有提到,下面把完整的代碼貼出來:

package com.android.demo; import java.io.BufferedReader;import java.io.InputStreamReader; import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray;import org.json.JSONObject; import android.app.Activity;import android.app.ProgressDialog;import android.content.Context;import android.os.Bundle;import android.telephony.TelephonyManager;import android.telephony.gsm.GsmCellLocation;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.view.View.OnClickListener; public class DemoActivity extends Activity {  /** Called when the activity is first created. */  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);     /** 為按鈕綁定事件 */    Button btnGetLocation = (Button) findViewById(R.id.button1);    btnGetLocation.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View arg0) {        // TODO Auto-generated method stub        onBtnClick();      }    });  }     /** 基站信息結構體 */  public class SCell{    public int MCC;    public int MNC;    public int LAC;    public int CID;  }     /** 經緯度信息結構體 */  public class SItude{    public String latitude;    public String longitude;  }     /** 按鈕點擊回調函數 */  private void onBtnClick() {    /** 彈出一個等待狀態的框 */    ProgressDialog mProgressDialog = new ProgressDialog(this);    mProgressDialog.setMessage("正在獲取中...");    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);    mProgressDialog.show();     try {      /** 獲取基站數據 */      SCell cell = getCellInfo();       /** 根據基站數據獲取經緯度 */      SItude itude = getItude(cell);       /** 獲取地理位置 */      String location = getLocation(itude);       /** 顯示結果 */      showResult(cell, location);       /** 關閉對話框 */      mProgressDialog.dismiss();    } catch (Exception e) {      /** 關閉對話框 */      mProgressDialog.dismiss();      /** 顯示錯誤 */      TextView cellText = (TextView) findViewById(R.id.cellText);      cellText.setText(e.getMessage());      Log.e("Error", e.getMessage());    }  }     /**   * 獲取基站信息   *    * @throws Exception   */  private SCell getCellInfo() throws Exception {    SCell cell = new SCell();     /** 調用API獲取基站信息 */    TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);    GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();    if (location == null)      throw new Exception("獲取基站信息失敗");     String operator = mTelNet.getNetworkOperator();    int mcc = Integer.parseInt(operator.substring(0, 3));    int mnc = Integer.parseInt(operator.substring(3));    int cid = location.getCid();    int lac = location.getLac();     /** 將獲得的數據放到結構體中 */    cell.MCC = mcc;    cell.MNC = mnc;    cell.LAC = lac;    cell.CID = cid;     return cell;  }     /**   * 獲取經緯度   *    * @throws Exception   */  private SItude getItude(SCell cell) throws Exception {    SItude itude = new SItude();     /** 采用Android默認的HttpClient */    HttpClient client = new DefaultHttpClient();    /** 采用POST方法 */    HttpPost post = new HttpPost("http://www.google.com/loc/json");    try {      /** 構造POST的JSON數據 */      JSONObject holder = new JSONObject();      holder.put("version", "1.1.0");      holder.put("host", "maps.google.com");      holder.put("address_language", "zh_CN");      holder.put("request_address", true);      holder.put("radio_type", "gsm");      holder.put("carrier", "HTC");       JSONObject tower = new JSONObject();      tower.put("mobile_country_code", cell.MCC);      tower.put("mobile_network_code", cell.MNC);      tower.put("cell_id", cell.CID);      tower.put("location_area_code", cell.LAC);       JSONArray towerarray = new JSONArray();      towerarray.put(tower);      holder.put("cell_towers", towerarray);       StringEntity query = new StringEntity(holder.toString());      post.setEntity(query);       /** 發出POST數據并獲取返回數據 */      HttpResponse response = client.execute(post);      HttpEntity entity = response.getEntity();      BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));      StringBuffer strBuff = new StringBuffer();      String result = null;      while ((result = buffReader.readLine()) != null) {        strBuff.append(result);      }       /** 解析返回的JSON數據獲得經緯度 */      JSONObject json = new JSONObject(strBuff.toString());      JSONObject subjosn = new JSONObject(json.getString("location"));       itude.latitude = subjosn.getString("latitude");      itude.longitude = subjosn.getString("longitude");             Log.i("Itude", itude.latitude + itude.longitude);           } catch (Exception e) {      Log.e(e.getMessage(), e.toString());      throw new Exception("獲取經緯度出現錯誤:"+e.getMessage());    } finally{      post.abort();      client = null;    }         return itude;  }     /**   * 獲取地理位置   *    * @throws Exception   */  private String getLocation(SItude itude) throws Exception {    String resultString = "";     /** 這里采用get方法,直接將參數加到URL上 */    String urlString = String.format("http://maps.google.cn/maps/geo?key=abcdefg&q=%s,%s", itude.latitude, itude.longitude);    Log.i("URL", urlString);     /** 新建HttpClient */    HttpClient client = new DefaultHttpClient();    /** 采用GET方法 */    HttpGet get = new HttpGet(urlString);    try {      /** 發起GET請求并獲得返回數據 */      HttpResponse response = client.execute(get);      HttpEntity entity = response.getEntity();      BufferedReader buffReader = new BufferedReader(new InputStreamReader(entity.getContent()));      StringBuffer strBuff = new StringBuffer();      String result = null;      while ((result = buffReader.readLine()) != null) {        strBuff.append(result);      }      resultString = strBuff.toString();       /** 解析JSON數據,獲得物理地址 */      if (resultString != null && resultString.length() > 0) {        JSONObject jsonobject = new JSONObject(resultString);        JSONArray jsonArray = new JSONArray(jsonobject.get("Placemark").toString());        resultString = "";        for (int i = 0; i < jsonArray.length(); i++) {          resultString = jsonArray.getJSONObject(i).getString("address");        }      }    } catch (Exception e) {      throw new Exception("獲取物理位置出現錯誤:" + e.getMessage());    } finally {      get.abort();      client = null;    }     return resultString;  }     /** 顯示結果 */  private void showResult(SCell cell, String location) {    TextView cellText = (TextView) findViewById(R.id.cellText);    cellText.setText(String.format("基站信息:mcc:%d, mnc:%d, lac:%d, cid:%d",        cell.MCC, cell.MNC, cell.LAC, cell.CID));     TextView locationText = (TextView) findViewById(R.id.lacationText);    locationText.setText("物理位置:" + location);  }}

我們連上手機在手機上運行程序看看。

不出意外的話程序運行起來了,自動跳轉到了主界面。點擊“Click Me”,出錯了!

詳細的錯誤信息為:Neither user 10078 nor current process has android.permission.ACCESS_COARSE_LOCATION.

原來是沒有權限,經過前面的學習,我們知道Android在應用的安全上下了一番功夫,要用一些特殊功能必須先報告,安裝應用的時候列給用戶看,必須要得到用戶的允許。這里我們用了獲取基站信息的功能,涉及到用戶的隱私了,所以我們必須申明一下。

打開AndroidManifest.xml配置文件,在里面添加相應的配置信息:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

我們繼續把網絡連接的權限申明也加上:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

再編譯運行看看(點擊“Click Me”后程序會卡住,等待一段時間才有反應,取決于網絡情況):

成功啦!

可能有的同學還是出現錯誤,沒有成功:

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

亚洲午夜久久久影院| 国产成人福利视频| 国产亚洲欧美日韩美女| 欧美极品在线播放| 91成人精品网站| 成人免费网站在线| 日韩电影中文字幕av| 欧美电影免费观看大全| 久久99精品久久久久久青青91| 久久久免费观看视频| 色播久久人人爽人人爽人人片视av| 午夜精品久久久久久久久久久久久| 69久久夜色精品国产7777| 91精品视频网站| 国产精品欧美日韩一区二区| 日韩中文在线中文网在线观看| 国产91精品高潮白浆喷水| 韩国国内大量揄拍精品视频| 久久精品国产亚洲7777| 精品一区二区三区电影| 91美女片黄在线观| 亚洲欧美日韩精品久久亚洲区| 欧美—级a级欧美特级ar全黄| 亚洲综合国产精品| 欧美怡春院一区二区三区| 亚洲第一页在线| 日韩av免费观影| 日产日韩在线亚洲欧美| 亚洲天堂av网| 精品久久久久久久久久ntr影视| 国产精品丝袜白浆摸在线| 亚洲精品久久久久久下一站| 青青精品视频播放| 久久视频在线播放| 日韩视频免费在线| 欧美极品第一页| 91po在线观看91精品国产性色| 中文字幕久精品免费视频| 国产成人短视频| 韩国精品久久久999| 欧美综合一区第一页| 成人在线视频福利| 亚洲美女自拍视频| 国产亚洲a∨片在线观看| 亚洲人成电影在线| 国产日产欧美a一级在线| 久久精品99久久久久久久久| 国内自拍欧美激情| 日韩在线视频网| 亚洲自拍偷拍在线| 国产精品久久久久久久av电影| 91精品国产综合久久香蕉922| 日韩专区中文字幕| 51色欧美片视频在线观看| 在线看片第一页欧美| 成人午夜在线观看| 亚洲综合社区网| 一区二区三区四区在线观看视频| 91黑丝高跟在线| 国产精品视频26uuu| 亚洲成人网久久久| 黄色一区二区三区| 国产成人精品视频在线观看| 国产精品久久久久久超碰| 国产狼人综合免费视频| 成人亚洲欧美一区二区三区| 欧美黑人极品猛少妇色xxxxx| 久久综合久久88| 97视频免费看| 成人黄色av播放免费| 亚洲a中文字幕| 在线电影欧美日韩一区二区私密| 91精品在线观| 日韩中文字幕精品| 一本色道久久88亚洲综合88| 最新亚洲国产精品| 欧美最顶级丰满的aⅴ艳星| 全亚洲最色的网站在线观看| 国产精品久久久久77777| 在线国产精品视频| 韩日欧美一区二区| 欧美裸体男粗大视频在线观看| 日韩最新免费不卡| 裸体女人亚洲精品一区| 欧美福利小视频| 97精品伊人久久久大香线蕉| 91国偷自产一区二区三区的观看方式| 日韩精品视频在线免费观看| 88xx成人精品| 国产亚洲精品美女久久久| 久久国产精品免费视频| 国内自拍欧美激情| 97av在线视频免费播放| 欧美黄色免费网站| 精品无人区太爽高潮在线播放| 2019亚洲男人天堂| 国产精品久久精品| 久久国产精品偷| 中文字幕亚洲字幕| 久久精品电影网| 亚洲区中文字幕| 国产剧情久久久久久| 欧美日韩国产综合新一区| 欧美性猛交xxxx富婆| 亚洲另类欧美自拍| 欧美野外wwwxxx| 中文字幕免费精品一区高清| 国产一区二区三区日韩欧美| 国产色视频一区| 欧美黑人巨大精品一区二区| 国产精品第七影院| 欧美精品在线观看91| 亚洲乱码国产乱码精品精天堂| 国产精品欧美日韩| 在线精品国产成人综合| 国产精品亚洲片夜色在线| 色综合伊人色综合网| 韩国欧美亚洲国产| 欧美另类老肥妇| 国产日产久久高清欧美一区| 韩国福利视频一区| 国产剧情久久久久久| 日韩国产高清视频在线| 日韩亚洲欧美中文在线| 久久艹在线视频| 成人激情春色网| 日韩中文字幕在线| 高清欧美性猛交| www亚洲精品| 欧美日韩一区二区免费视频| 国产视频一区在线| 欧美丝袜第一区| 国产激情999| 欧美精品18videos性欧美| 中文字幕一精品亚洲无线一区| 久久久免费在线观看| 91精品免费久久久久久久久| 国产综合在线观看视频| 欧美亚洲成人精品| 亚洲欧洲高清在线| 色777狠狠综合秋免鲁丝| 亚洲第一男人天堂| 97精品视频在线播放| 伊人久久久久久久久久久| 精品久久久久久亚洲国产300| 欧美一级免费视频| 一区二区欧美久久| 8090成年在线看片午夜| 久久久亚洲影院你懂的| 91日本在线观看| 国产成人精品视频在线| 国产精品电影观看| 精品久久久免费| 日韩av在线免费| 日韩精品中文字| 亚洲欧美激情另类校园| 亚洲精品有码在线| 久久亚洲国产精品| 日韩中文字幕在线播放| 日韩精品在线电影| 国产精品成人免费电影| 91亚洲午夜在线| 欧美激情精品在线| 亚洲伊人久久大香线蕉av|