日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android FM 模块学习之四 源码解析(1)

發布時間:2024/3/26 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android FM 模块学习之四 源码解析(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

前一章我們了解了FM手動調頻,接下來我們要分析FM模塊用到的源碼。此源碼是基于高通平臺的,別的平臺都大同小異,只不過是平臺自己作了些小改動而已。

首先要看的當然是主activity,

?

FMRadio.java

?fmradio 類啟動FMRadioService.java 類調用FmSharedPreferences類進行存儲數據,PresetStation調整頻率

?setVolumeControlStream(AudioManager.STREAM_MUSIC); 音樂回放即媒體音量

?LoadedDataAndState 加載數據狀態

?HorizontalNumberPicker 水平刻度盤類繼承LinearLayout?

?mPicker.setTextSize(mDisplayWidth/ TEXTSIZE_PARAMETER_FOR_NUMBER_PICKER); 設置字體的大小,屏幕寬度除以20

?mPicker.setDensity(outMetrics.densityDpi); 設置控件密度

?mPicker.setOnValueChangedListener 設置監聽事件

?valueToFrequency(newVal); 刻度滑動選中的值,上升下降調整限制值FmConfig 配置文件里setLowerLimit(int lowLimit)在設置里選中地區時候的頻率取值范圍

?mPrefs.getFrequencyStepSize() ,獲得設置的步長大小

?mHandler.post(mRadioChangeFrequency); 更新在刻度盤上顯示頻率信息、

?tuneRadio(int frequency) 調整fm 頻率

?

?FMRadioService.java isFmOn() 方法:

?registerCallbacks 注冊回調IFMRadioServiceCallbacks 的對象、

?ServiceStub 繼承IFMRadioService.Stub 使用到WeakReferenc弱引用, WeakReference 是弱于 SoftReference 的引用類型。弱引用的特性和基本與軟引用相似,區別就在于弱引用所指向的對象只要進行系統垃圾回收,不管內存使用情況如何,永遠對其進行回收(get() 方法返回 null)。

?IBindermBinder = new ServiceStub(this); bindService IBinder 等于serviceStub 對象。

?

fmOn() 部分代碼:

?/**

?* 當來電話不是閑置的時候就返回false

?*/

?

if (TelephonyManager.CALL_STATE_IDLE != getCallState() ) {

?  return bStatus;

?}

?

mReceiver= new FmReceiver(FMRADIO_DEVICE_FD_STRING, fmCallbacks);

?FmReceiver 接受廣播類繼承FmTransceiver

?/ * * * 構造函數接收方對象,

?路徑
電臺和事件回調。

?

* @param devicePath 調頻設備路徑字符串。
回調事件回調處理
從調頻接收機* 事件。

?* /

?public FmReceiver(String devicePath, FmRxEvCallbacksAdaptorcallback) throws InstantiationException {

?  mControl = new FmRxControls();

?  mRxEvents = new FmRxEventListner();

  //registerClient(callback);

?  mCallback = callback;

?}

?

獲得FM 現在的狀態

?public int getFMState()

?{

?/* Current State of FM device */

?  int currFMState =FmTransceiver.getFMPowerState();

?  return currFMState;

?}

?

滑動刻度盤動畫效果:

?mAnimation= AnimationUtils.loadAnimation(this,R.anim.preset_select);

?靜音控件監聽,點擊控件有聲無聲切換。

?mMuteButton.setOnClickListener(mMuteModeClickListener);

?喇叭與耳機監聽切換

?mSpeakerButton.setOnClickListener(mSpeakerClickListener);

?開啟關閉fm 控件切換

?mOnOffButton.setOnClickListener(mTurnOnOffClickListener);

?向右調頻控件監聽

?mForwardButton.setOnClickListener(mForwardClickListener);

?mForwardButton.setOnLongClickListener(mForwardLongClickListener);

?向左調頻控件監聽

?mBackButton.setOnClickListener(mBackClickListener);

?mBackButton.setOnLongClickListener(mBackLongClickListener);

?單擊收藏按鈕把收藏頻率定位調頻到刻度盤上,長期按鈕將刻度盤頻率收藏到按鈕上存儲到data 分區下的fmradio_prefs.xml文件 keytation_name0x1

?頻率顯示控件

?mTuneStationFrequencyTV= (TextView)findViewById(R.id.prog_frequency_tv);

?長按頻率顯示控件監聽方法:

?mTuneStationFrequencyTV.setOnLongClickListener(mFrequencyViewClickListener);

?錄音視圖顯示與監聽事件

?mRecordingMsgTV= (TextView)findViewById(R.id.record_msg_tv);

?if (mRecordingMsgTV != null) {

?  mRecordingMsgTV.setOnClickListener(mRecordButtonListener);

?}

?

自動關掉FM 時間顯示

?mSleepMsgTV= (TextView)findViewById(R.id.sleep_msg_tv);

?fm 信號強度

?mRSSI =(ImageView)findViewById(R.id.signal_level);

?if (mRSSI != null) {

?  mRSSI.setVisibility(View.INVISIBLE);

?}

?

顯示控件顯示信息等數據顯示

?protectedvoid setDisplayvalue()

?onRestart()

?獲取 IFMRadioService 請求焦點

?onStop 中方法調用private boolean isSleepTimerActive() 是否是睡眠。

?if(isSleepTimerActive()){

?  mSleepUpdateHandlerThread.interrupt();

?}

?

如果是睡眠活動就睡眠更新線程中斷線程

當錄音開始,走onStop() 方法時候就停止錄音更新線程

?private boolean isRecording()

?if (null!= mRecordUpdateHandlerThread) {

?  mRecordUpdateHandlerThread.interrupt();

?}

?

public void onStart()

?用戶選擇高清晰多媒體顯示創建命令失敗.

?1 、如果未保存則調用onCreateDialog(int) ,然后再調用onPrepareDialog(int, Dialog)

?(2) 如果保存了對話框對象,則直接調用onPrepareDialog(int,Dialog), 不會再去create,所以有時候當你再輸入框里無論如何輸入什么內容,對話框的內容都是第一次產生的。

?removeDialog(int) 是用來清除Activity 保存下來的Dialog對象,如果不加removeDialog將會導致無論在對話框里輸入什么內容,

?彈出來的對話框始終都是第一次保留下來的,這里所以要加上它

?創建搜索dialog

?createSearchDlg(id,dlgBuilder)

?

?FMConfig.java

?public int getRdsStd () {

?  return mRdsStd;

?}

?registerFMSettingListner(); 注冊收音機設置配置文件

?mPrefs.Load(); 調用FmSharedPreferences Load()方法獲取fmradio_prefs.xml數據

?遇見bug: 將設置地區自動選擇印度(外單項目)

?/* LoadConfiguration */

?if(Locale.getDefault().equals(Locale.CHINA)) {

?  setCountry(sp.getInt(FMCONFIG_COUNTRY,REGIONAL_BAND_CHINA));

?} else {

?  setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_NORTH_AMERICA));

?}

?

/* Last list the user was navigating */

?Local.getDafault() 在第一次刷機后設置本地語言后

?protected void onPause() 的時候,將信息保存mPrefs.Save();

?ScrollerText 控件繼承Handler

?/ * * * 移動一個字符留下的文字和文章

?*SCROLLER_UPDATE_DELAY_MS 后延遲下更新消息。 * 如果滾動整個字符串, 然后它會顯示整個字符串 * 并等待SCROLLER_RESTART_DELAY_MS 滾動重啟 * /

?voidupdateText() 更新錄音時間

?停止錄音時間跟新

?void stopScroll() {

?  mStatus = SCROLLER_STOPPED;

?  removeMessages(SCROLLER_MSG_TICK);

?  removeMessages(SCROLLER_MSG_RESTART);

?  removeMessages(SCROLLER_MSG_START);

?  resetScroll();

?}

?

重新設置錄音時間顯示

?private void resetScroll()

?啟動錄音時間

?void startScroll() {

?初始化搜索

?private void initiateSearch(int pty)

?resetSearch() 重新收索

?private void cancelSearch() 關閉收索

?初始化搜索列表

?private void initiateSearchList()

?初始化睡眠定時器

?private void initiateSleepTimer(long seconds) {

?  mSleepAtPhoneTime =(SystemClock.elapsedRealtime()) + (seconds * 1000);

?  Log.d(LOGTAG, "Sleep in seconds:" + seconds);

?  initiateSleepThread();

?}

?

初始化睡眠線程

?private void initiateSleepThread()

?

?Intent launchPreferencesIntent = new Intent().setClass(this,

?Settings.class);

?launchPreferencesIntent.putExtra(Settings.RX_MODE,true);

?startActivityForResult(launchPreferencesIntent,

?ACTIVITY_RESULT_SETTINGS);

?private void enableSpeaker() ? 揚聲器可用

?private void updateExpiredRecordTime() 更新錄音時間

?private Runnable doRecordProcessing = new Runnable() 錄音進度

?public void onResume()

?mService.registerCallbacks(mServiceCallbacks); 注冊回調service

?mService.cancelDelayedStop(FMRadioService.STOP_SERVICE); 延遲關閉FMRadioService

?public? boolean bindToService(Context context,ServiceConnection callback) 啟動在FMRadio onStart()方法判斷條件啟動FMRadioService

?if((mService == null ) && (false == bindToService(this, osc)))

?onDestroy() 方法中解綁nRegisterReceiver(mFmSettingReceiver);

?boolean isWiredHeadsetAvailable() 判斷耳機是否可用,在FMRadioService 類里添加public void registerHeadsetListener()注冊耳機監聽事件,mHeadsetPlugged = (intent.getIntExtra("state", 0) == 1);狀態監聽

?Intent 里的public static final String ACTION_HEADSET_PLUG =

?"android.intent.action.HEADSET_PLUG"; 耳機靜態常量定義。

?

再啟動FMRadioService 監聽 registerHeadsetListener();耳機

?/ * *

?確定是否一個內部天線。

?* FMOn

?返回緩存的值初始化。

?*

?* @return

?真正的如果內部天線可用或連線

?*

?耳機插入,如果內部天線是錯誤的

?*沒有和有線耳機不是插入。

?* /

?

public boolean isAntennaAvailable()FMRadioService

?public void readInternalAntennaAvailable() 確定是否有內部天線,調用類FMReceivce 的父類FMTransceiver類發送接收信號類

?public boolean getInternalAntenna() 方法,通過FmReceiverJNI 類調用getControlNative方法。

?恢復設置默認地區設置private voidRestoreDefaults()

?當天線可以用的時候就調用UI 界面可用顯示

?private void enableRadioOnOffUI() {

?  boolean bEnable = isFmOn();

?  /* Disable if no antenna/headset isavailable */

?  if (!isAntennaAvailable()) {

?    bEnable = false;

?  }

?  enableRadioOnOffUI(bEnable);

?? }

?

調用此方法private void enableRadioOnOffUI(boolean bEnable) 顯示FMRadio.java UI界面

?boolean isCallActive() 電話呼叫活動,FMRadioService isCallActive當狀態不為零表示在通話中

?public boolean isCallActive()

?{   

???? //Non-zero: Call state is RINGING orOFFHOOK on the available subscriptions

?  //zero: Call state is IDLE on all theavailable subscriptions

?  if(0 != getCallState()) return true;

?    return false;

?}

?

private void enableRadio() 可使用收音機

?private void disableRadio() 不可用收音機

?private void resetRadio() 重新設置收音機

?public void clearStationList() 清除電臺列表信息

?public boolean fmConfigure() 收音機配置

?/ *

?設置調頻模塊自動切換到另一個頻率

?*

?站如果一個頻率的信號強度比

?*目前調諧頻率。

?*

?*布爾bEnable::自動切換到更強的交替頻率。

?*:不要切換到備用頻率。

?* @return真實如果設置自動對焦模式api調用成功,錯誤如果api失敗了。

?*:回調FmRxEvRadioTuneStatus時將調用

?*完成不同的頻率。

?* /

?調用FMRadioService publicboolean enableAutoAF(boolean bEnable)方法。

?public void fmAudioOutputMode() 輸出立體聲音

?private void startRecording() 錄音開始

?private void setRecordingStopImage() 錄音停止圖片設置

?private void setRecordingStartImage() 錄音開始圖片設置、

?private void startRecordingTimer() 錄音啟動的時間

?private void stopRecording() 停止錄音

?private boolean isRecording() 判斷是否在錄音

?private boolean isSpeakerEnabled() 判斷揚聲器是可用

?private boolean stationExists(PresetStationstation ) 長按收藏按鈕式電臺頻率是都存在

?private void addToPresets() 添加電臺頻率顯示到按鈕上

?FmSharedPreferences.addStation(selectedStation.getName(),selectedStation.getFrequency(),currentList);

?setupPresetLayout();

?

調用FmSharedPreferences 類的addStation方法添加到mListOfPlists列表里

?private void resetSearchProgress() 重置搜索進度

?updateSearchProgress() 更新搜索進度

?setupPresetLayout() 安裝頻率布局,收藏頻率至按鈕上初始化

?updateStationInfoToUI() 更新電臺信息界面信息

?private boolean isFmOn() 收音機是否開啟

?

/* 如果啟用了模擬路徑返回true */

?public boolean isAnalogModeEnabled() {

?  return misAnalogPathEnabled;

?}

?

/ * 返回調頻(Soc) 音頻硬件是否有限。

?* @return真如果調頻音頻是柔和的,假如果不低調。

?* /

?public boolean isMuted() {

?  return mMuted;

?}

?private boolean isScanActive() 掃描活動布爾值

?private boolean isSeekActive() 查找活動布爾值

?private boolean isSearchActive() 搜索活動布爾值

?public PresetStation getCurrentTunedStation() 獲得現在調整電臺

?private void SeekNextStation() 在搜索查找下一個頻率

?private void initiateSearch(int pty) 初始化搜索

?/** SEEK Station with the matching PI */

?private void initiatePISearch(int pi) 需找匹配的頻率

?private void resetSearch() 從新搜索

?private void cancelSearch() 關閉搜索

?private void initiateSearchList() 初始化搜索列表

?private void initiateSleepTimer(long seconds)? 初始化睡眠計時器

?private void initiateSleepThread() 初始化睡眠線程

?private void endSleepTimer() 結束睡眠計時器時間

?private boolean hasSleepTimerExpired() 睡眠計時器停止

?private boolean isSleepTimerActive() 睡眠計時器活動是否活動

?private void updateExpiredSleepTime() 更新停止睡眠時間

?private String makeTimeString(long secs) 時間格式字符串

?private void tuneRadio(int frequency) 調整收音機頻率

?private void resetFMStationInfoUI() 從新設置收音機電臺顯示界面信息

?

IFMRadioServiceCallbacks 類回調時候

?Runnable mRadioEnabled = new Runnable() 收音機可用

?Runnable mRadioDisabled = new Runnable() 收音機不可用

?Runnable mRadioReset = new Runnable() 收音機重新設置

?Runnable mUpdateStationInfo = new Runnable() 跟新收音機電臺信息

?Runnable mOnMute = new Runnable() 收音機靜音設置

?Runnable mOnStereo = new Runnable() 立體聲音

?Runnable mUpdateRadioText = new Runnable() 更新收音機文本信息

?Runnable mRadioChangeFrequency = newRunnable() 調整頻率

?Runnable mUpdateExtenRadioText = newRunnable() 更新延伸收音機文本信息

?Runnable mUpdateProgramService = newRunnable() 跟新service 進度

?private void DebugToasts(String str, intduration) 彈出提示信息

?private void registerFMSettingListner()? 注冊設置改變監聽

?private void unRegisterReceiver(BroadcastReceiver myReceiver) 卸載注冊避免重復注冊報異常

?

?

下面分享的是FM模塊的保存方法,即FmSharedPreferences.java

?

??? FmSharedPreferences(Context context)在構造方法中加載Load()方法

??? public void? Load(){
????????? Log.d(LOGTAG, "Load preferences ");
????????? if(mContext == null)
????????? {
???????????? return;
????????? }
????????? SharedPreferences sp = mContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
????????? mTunedFrequency = sp.getInt(PREF_LAST_TUNED_FREQUENCY, DEFAULT_NO_FREQUENCY);
????????? mRecordDuration = sp.getInt(LAST_RECORD_DURATION, RECORD_DUR_INDEX_0_VAL);
????????? mAFAutoSwitch = sp.getBoolean(LAST_AF_JUMP_VALUE, true);
????????? mAudioOutputMode = sp.getBoolean(AUDIO_OUTPUT_MODE, true);
????????? if(sp.getInt(FMCONFIG_COUNTRY, 0) == REGIONAL_BAND_USER_DEFINED) {
???????????? mBandMinFreq = sp.getInt(FMCONFIG_MIN, mBandMinFreq);
???????????? mBandMaxFreq = sp.getInt(FMCONFIG_MAX, mBandMaxFreq);
???????????? mChanSpacing = sp.getInt(FMCONFIG_STEP, mChanSpacing);
????????? }
??? ?
????????? int num_lists = sp.getInt(LIST_NUM, 1);
????????? if (mListOfPlists.size() == 0) {
????????? for (int listIter = 0; listIter < num_lists; listIter++) {
???????????????? String listName = sp.getString(LIST_NAME + listIter, "FM - " + (listIter+1));
???????????????? int numStations = sp.getInt(STATION_NUM + listIter, 1);
???????????????? if (listIter == 0) {
???????????????????? createFirstPresetList(listName);
???????????????? } else {
???????????????????? createPresetList(listName);
???????????????? }
???????????????? PresetList curList = mListOfPlists.get(listIter);
???????????????? for (int stationIter = 0; stationIter < numStations; stationIter++) {
????????????????????? String stationName = sp.getString(STATION_NAME + listIter + "x" + stationIter,
????????????????????????????????????????????????????????? DEFAULT_NO_NAME);
????????????????????? int stationFreq = sp.getInt(STATION_FREQUENCY + listIter + "x" + stationIter,
?????????????????????????????????????????????????????? DEFAULT_NO_FREQUENCY);
????????????????????? PresetStation station = curList.addStation(stationName, stationFreq);
??? ?
????????????????????? int stationId = sp.getInt(STATION_ID + listIter + "x" + stationIter,
????????????????????????????????????????????????? DEFAULT_NO_STATIONID);
????????????????????? station.setPI(stationId);
??? ?
????????????????????? int pty = sp.getInt(STATION_PTY + listIter + "x" + stationIter, DEFAULT_NO_PTY);
????????????????????? station.setPty(pty);
??? ?
????????????????????? int rdsSupported = sp.getInt(STATION_RDS + listIter + "x" + stationIter,
???????????????????????????????????????????????????? DEFAULT_NO_RDSSUP);
????????????????????? if (rdsSupported != 0) {
????????????????????????? station.setRDSSupported(true);
????????????????????? } else {
????????????????????????? station.setRDSSupported(false);
????????????????????? }
????????? /* Load Configuration */?? ?
??????????? setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_NORTH_AMERICA));
????????? /* Last list the user was navigating */
????????? mListIndex = sp.getInt(LAST_LIST_INDEX, 0);
????????? if(mListIndex >= num_lists)
????????? {mListIndex=0;
????????? }
?????? }

??? 初始化取出sp一些數據
??? 根據系統初始化地區設置當地頻率 ?
??? /*Load Configuration */
???????? if (Locale.getDefault().equals(Locale.CHINA)) {
???????????? setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_CHINA));
???????? } else {
???????????? setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_NORTH_AMERICA));
???????? }
???????? /* Last list the user was navigating */

??????????? 保存頻率
??? public void Save()
???????????? 設置默認的地區
??? public static void SetDefaults()
??????????? 設置調整頻率
??? public static void setTunedFrequency(intfrequency)
??????????? 獲取調整頻率
??? public static int getTunedFrequency()
??????????? 獲取下一個頻率
??? public static int getNextTuneFrequency(intfrequency)
??????????? 獲取上一個頻率
??? public static int getPrevTuneFrequency(intfrequency)
??? / * *
??? * @param mFMConfiguration mFMConfiguration設置
??? * /
??? public static void setFMConfiguration(FmConfig mFMConfig)
??? /**
??????? *@return the mFMConfiguration
?????? */
????? public static FmConfig getFMConfiguration() {
???????? return mFMConfiguration;
?????? }
???   設置fm播放的頻率范圍
??? public static void setRadioBand(int band)
?????????? 獲取fm頻率范圍限制
??? public static int getRadioBand()
??  ? 獲取間隔
??? public static int getChSpacing()
???   設置遠程數據服務
??? public static void setRdsStd(int std)
??? mFMConfiguration.setRdsStd(std);
??  ? 獲取遠程數據服務
??? public static int getRdsStd()
??? mFMConfiguration.getRdsStd();
???   設置國家地區
??? public static void setCountry(intnCountryCode)
???   獲取國家地區
??? public static int getCountry()
??????????? 設置聲音輸出模板
??? setAudioOutputMode
???   設置錄音是否持續
??? public static void setRecordDuration(intdurationIndex)

?

?

總結:個人認為以上只能作為參考,但是大體框架變化不大。

?

轉載于:https://www.cnblogs.com/kings-boke/p/4269825.html

總結

以上是生活随笔為你收集整理的Android FM 模块学习之四 源码解析(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩亚洲视频 | 午夜亚洲精品 | 高h视频在线免费观看 | 国产91av在线播放 | 色婷婷视频网 | 天天插天天操 | 国产伦精品一区二区三区四区视频 | 久久久视频在线 | 88av在线播放 | 中文字幕av播放 | 曰韩精品| 蜜臀av在线观看 | 四虎永久免费影院 | 艳妇乳肉豪妇荡乳av | 男人和女人做爽爽视频 | 初音未来打屁股 | 亚洲一区二区三区午夜 | 色综合久久88色综合天天免费 | 精品无码久久久久 | 欧美一区二区三区久久久 | 国产尤物在线视频 | 四虎黄色 | 成人做爰视频www网站小优视频 | av在线入口 | 第一页在线视频 | 六月激情综合网 | xxxxwww一片 | 囯产精品久久久久久 | 老鸭窝成人 | 殴美黄色大片 | 日本免费一区视频 | 在线观看欧美一区 | 日韩高清在线一区二区 | 草草影院1 | 青青草国产成人av片免费 | 国产精品传媒在线观看 | av日韩免费 | 波多野久久 | 日韩一区二区三区免费在线观看 | 国模精品一区 | 国产精品vip | 娇妻之欲海泛舟无弹窗笔趣阁 | 日韩在线观看免费高清 | 麻豆视频在线播放 | 欧美精品综合 | 7799精品视频| 少妇一级淫片免费放播放 | av中文字幕一区二区三区 | 91成人免费视频 | 国产精品色片 | 香蕉视频国产在线观看 | 国产一卡二卡在线播放 | www.99视频 | 成人视品 | 在线观看亚洲精品视频 | 免费在线观看黄网站 | 六月综合激情 | 全部免费毛片 | 干夜夜 | 日韩成人免费在线视频 | 中文字幕在线观看视频www | 奇米影视色 | 51国产偷自视频区视频 | 亚洲欧美综合另类 | 亚洲第一国产 | 国产欧美自拍 | 美女扒开粉嫩尿口 | 亚洲黄色成人网 | wwww日本60 | 中文字幕av亚洲精品一部二部 | 亚洲超碰在线观看 | 青草国产 | 女人和拘做爰正片视频 | 97精品国产97久久久久久春色 | 日韩高清一区二区 | 日本免费在线观看 | 五月婷婷狠狠爱 | 亚洲欧美精品一区二区 | 婷婷综合精品 | 欧美熟妇另类久久久久久不卡 | 亚洲国产精品狼友在线观看 | 免费在线一级片 | 中文字幕一区二区人妻痴汉电车 | 国产91精品在线观看 | 日韩精品电影一区二区三区 | 欧美视频一区二区三区在线观看 | 亚洲高清影院 | 最新超碰| 午夜av免费观看 | 成人99视频 | 大肉大捧一进一出好爽视频动漫 | 天堂国产一区二区三区 | 国产成年人免费视频 | 伊人免费在线观看高清版 | 欧av在线 | 少妇精品无码一区二区免费视频 | 99re这里只有精品首页 | 午夜免费视频网站 | av最新网址 |