日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android TV : 电视输入框架(TIF)剖析

發布時間:2024/4/24 69 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android TV : 电视输入框架(TIF)剖析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android TIF(Android TV input Framework)是Google向電視制造商提供了一套標準的API,用于創建Input模塊來控制Android電視。這套API的底層實現的原理是aidl和provider,從而進行了跨進程通信。系統或第三方的應用可以通過TIF獲得所有輸入(input)的信源(輸入的模塊包括:搜臺模塊,MDMI模塊,網絡模塊等),然后通過aidl切臺輸出到屏幕上。

1.電視相關的知識:
    HDMI:高清晰度多媒體接口(英文:High Definition Multimedia Interface,HDMI)是一種數字化視頻/音頻接口技術,是適合影像傳輸的專用型數字化接口。
    IPTV:網絡電視,也叫VOD電視,三方比如說某某視頻公司提供的視頻資源在電視上播放。
    DTV:數字電視
    ATV:模擬電視
2.TIF的組成部分:
    1)TV Provider (com.android.providers.tv.TvProvider):一個包含頻道、節目和相關權限的數據庫。
    2)TV App (com.android.tv.TvActivity):一個和用戶交互的系統應用。
    3)TV Input Manager (android.media.tv.TvInputManager):一個中間接口層,能夠讓TV Inputs和TV App進行通訊。
    4)TV Input:可以看做是一個代表物理或者虛擬的電視接收器或者輸入端口的應用。Input在TIF中可以看做是一個輸入源。
    5)TV Input HAL (tv_input module):TV Input的硬件抽象層,可以讓系統的TV inputs訪問TV特有硬件。
    6)Parental Control:兒童鎖,一種可以鎖住某些頻道和節目的技術。
    7)HDMI-CEC:一種可以通過HDMI在多種設備上進行遠程控制的技術。CEC(Consumer Electronics Control消費電子控制)

3.TIF官方流程圖:

    

  如上圖所示,TVProvider和TV Input Manager就是TIF中的內容,liveTVApp通過turning調用TV Input Manager獲得一個session,session里面放的是一路信源的狀態,TV Input Manager 必須與 TV Input 創建一對一的會話。liveTVApp通過session以aidl的方式調用TVinputService獲得相關的頻道和具體的節目信息進行播放,并提供家長控制功能。TvInput將獲得的Channel和Programs信息寫入到/data/data/com.android.providers.tv/databases/tv.db數據庫中。

4.TIF為開發者提供的接口
1)TvView:負責顯示播放的內容。它是一個ViewGroup的子類,它是切臺的入口,內置surface用于顯示視頻播放的內容和通過控制session可以控制音量的大小等。
2)TvInputService:TvInputService是一個重要的類,繼承了它并實現一些規范就可以實現一路input信源供其它應用使用。在該service中要實現onCreatSession()方法該方法要返回一個TvInputService.Session對象。這里的service在Manifest中定義時要注意要添加permission和action。添加完之后系統的TvInputManager可以檢測到該service是一個TvInputService,也就是一路信源。
  下面創建一個自定義的Service,而這個Service要繼承系統的TvInputService,當然為了簡化這個過程我們可以使用android官方提供的TIF 隨播內容庫:

compile 'com.google.android.libraries.tv:companionlibrary:0.2'
public class TvService extends BaseTvInputService {
    @Nullable
    @Override
    public TvInputService.Session onCreateSession(@NonNull String inputId) {
        TvInputSessionImpl session = new TvInputSessionImpl(this, inputId);
        session.setOverlayViewEnabled(true);
        return session;
    }
}

這里的BaseTvInputService也是繼承的TvInputService,需要復寫onCreateSession方法,創建自己的Session用于和TvInputManager交互,最后在清單文件中配置如下:

<service
  android:name=".service.TvService"
  android:permission="android.permission.BIND_TV_INPUT">  <intent-filter>    <action android:name="android.media.tv.TvInputService" />  </intent-filter>  <meta-data
    android:name="android.media.tv.input"
    android:resource="@xml/richtvinputservice" /></service>

接著在xml/richtvinputservice中配置了兩個activty,這個是提供LiveTv去打開的,比如第一次啟動這個源時,需要啟動到setupActivity所指定的activity,設置時需要啟動到settingsActivity配置的activity.

<?xml version="1.0" encoding="utf-8"?>
<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="com.xray.tv.input.MainActivity"
    android:setupActivity="com.xray.tv.input.MainActivity" />

3)TvInputService.Sssion:該session類TvView通過Tune方法會指定相應的inputId(往往是該service對應的“包名/.類名”)和uri,uri中包含對應的節目id,該tune方法會調用Session的Onturn方法中,在這個方法中解析傳過來的id,根據id利用TvProvider去查詢數據庫的數據,設置給player,這里使用onSetSurface()方法將TvView創建的surface設置給player,然后player就在該surface上顯示內容。
4)TvContract:介于TvProvider和TvApp之間的一層封裝,它里面封裝了一些uri。里面有兩個內部類是兩個javaBean。他們分別是TvContract.channels(頻道表),TvContract.Programs(頻道里面的節目單,比如少兒頻道里面海賊王第5集,火影忍者第6集等)。
5)TvInputManager:這個是TIF的核心類,它是系統的類,可以監測到在系統的service中注冊"android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS"action的類,并將其設為一路信源。它來管理一些回調,比如video是否可用,video的大小尺寸是否變換。通過下面的代碼可以獲得一個TvInputManager:

TvInputManager tvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE);

  TvInputManager只是我們當前進程的代理,它的真正實現其實是一個系統的Service,所以我們可以知道這個service其實在system_server進程中,在類TvInputManagerService中實現。由于這個地方是跨進程通信,其實它使用的是aidl的方式,所以我們可以找到TvInputManager在aidl中定義的接口:

/**
 * Interface to the TV input manager service.
 * @hide
 */
interface ITvInputManager {
    List<TvInputInfo> getTvInputList(int userId);
    TvInputInfo getTvInputInfo(in String inputId, int userId);
    void updateTvInputInfo(in TvInputInfo inputInfo, int userId);
    int getTvInputState(in String inputId, int userId);

    List<TvContentRatingSystemInfo> getTvContentRatingSystemList(int userId);

    void registerCallback(in ITvInputManagerCallback callback, int userId);
    void unregisterCallback(in ITvInputManagerCallback callback, int userId);

    boolean isParentalControlsEnabled(int userId);
    void setParentalControlsEnabled(boolean enabled, int userId);
    boolean isRatingBlocked(in String rating, int userId);
    List<String> getBlockedRatings(int userId);
    void addBlockedRating(in String rating, int userId);
    void removeBlockedRating(in String rating, int userId);

    void createSession(in ITvInputClient client, in String inputId, boolean isRecordingSession,
            int seq, int userId);
    void releaseSession(in IBinder sessionToken, int userId);
    int getClientPid(in String sessionId);

    void setMainSession(in IBinder sessionToken, int userId);
    void setSurface(in IBinder sessionToken, in Surface surface, int userId);
    void dispatchSurfaceChanged(in IBinder sessionToken, int format, int width, int height,
            int userId);
    void setVolume(in IBinder sessionToken, float volume, int userId);
    void tune(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId);
    void setCaptionEnabled(in IBinder sessionToken, boolean enabled, int userId);
    void selectTrack(in IBinder sessionToken, int type, in String trackId, int userId);

    void sendAppPrivateCommand(in IBinder sessionToken, in String action, in Bundle data,
            int userId);

    void createOverlayView(in IBinder sessionToken, in IBinder windowToken, in Rect frame,
            int userId);
    void relayoutOverlayView(in IBinder sessionToken, in Rect frame, int userId);
    void removeOverlayView(in IBinder sessionToken, int userId);

    void unblockContent(in IBinder sessionToken, in String unblockedRating, int userId);

    void timeShiftPlay(in IBinder sessionToken, in Uri recordedProgramUri, int userId);
    void timeShiftPause(in IBinder sessionToken, int userId);
    void timeShiftResume(in IBinder sessionToken, int userId);
    void timeShiftSeekTo(in IBinder sessionToken, long timeMs, int userId);
    void timeShiftSetPlaybackParams(in IBinder sessionToken, in PlaybackParams params, int userId);
    void timeShiftEnablePositionTracking(in IBinder sessionToken, boolean enable, int userId);

    // For the recording session
    void startRecording(in IBinder sessionToken, in Uri programUri, in Bundle params, int userId);
    void stopRecording(in IBinder sessionToken, int userId);

    // For TV input hardware binding
    List<TvInputHardwareInfo> getHardwareList();
    ITvInputHardware acquireTvInputHardware(int deviceId, in ITvInputHardwareCallback callback,
            in TvInputInfo info, int userId, String tvInputSessionId, int priorityHint);
    void releaseTvInputHardware(int deviceId, in ITvInputHardware hardware, int userId);

    // For TV input capturing
    List<TvStreamConfig> getAvailableTvStreamConfigList(in String inputId, int userId);
    boolean captureFrame(in String inputId, in Surface surface, in TvStreamConfig config,
            int userId);
    boolean isSingleSessionActive(int userId);

    // For DVB device binding
    List<DvbDeviceInfo> getDvbDeviceList();
    ParcelFileDescriptor openDvbDevice(in DvbDeviceInfo info, int device);

    // For preview channels and programs
    void sendTvInputNotifyIntent(in Intent intent, int userId);
    void requestChannelBrowsable(in Uri channelUri, int userId);

    // For CTS purpose only. Add/remove a TvInputHardware device
    void addHardwareDevice(in int deviceId);
    void removeHardwareDevice(in int deviceId);
}

它的實現是在TvInputManagerService的內部類BinderService中:

    private final class BinderService extends ITvInputManager.Stub {
        @Override
        public List<TvInputInfo> getTvInputList(int userId) {
            final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
                    Binder.getCallingUid(), userId, "getTvInputList");
            final long identity = Binder.clearCallingIdentity();
            try {
                synchronized (mLock) {
                    UserState userState = getOrCreateUserStateLocked(resolvedUserId);
                    List<TvInputInfo> inputList = new ArrayList<>();
                    for (TvInputState state : userState.inputMap.values()) {
                        inputList.add(state.info);
                    }
                    return inputList;
                }
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        }

        @Override
        public TvInputInfo getTvInputInfo(String inputId, int userId) {
            final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
                    Binder.getCallingUid(), userId, "getTvInputInfo");
            final long identity = Binder.clearCallingIdentity();
            try {
                synchronized (mLock) {
                    UserState userState = getOrCreateUserStateLocked(resolvedUserId);
                    TvInputState state = userState.inputMap.get(inputId);
                    return state == null ? null : state.info;
                }
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        }

    ......
    }

TvInputManagerService是在SystemServer中啟動的,具體在SystemServer類的startOtherServices方法中:

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LIVE_TV)
                    || mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
                t.traceBegin("StartTvInputManager");
                mSystemServiceManager.startService(TvInputManagerService.class);
                t.traceEnd();
            }

注意上面會判斷系統TV和LEANBACK的特征而決定是否啟動TvInputManagerService,特征可在device/google/atv/permissions/tv_core_hardware.xml中進行配置:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<permissions>

    <!-- These are the hardware components that all television devices must
         include.  Devices with optional hardware must also include extra hardware
         files.
    -->
    <feature name="android.hardware.audio.output" />
    <feature name="android.hardware.location" />
    <feature name="android.hardware.location.network" />
    <feature name="android.hardware.screen.landscape" />
    <feature name="android.hardware.type.television" />

    <feature name="android.software.backup" />
    <feature name="android.software.leanback" />
    <feature name="android.software.leanback_only" />
    <feature name="android.software.live_tv" />
    <feature name="android.software.picture_in_picture" notLowRam="true" />
    <feature name="android.software.activities_on_secondary_displays" notLowRam="true" />
    <feature name="android.software.voice_recognizers" notLowRam="true" />
    <feature name="android.software.input_methods" />
    <feature name="android.software.autofill" />

    <feature name="android.software.cts" />

</permissions>

得到TvInputManager后我們可以遍歷拿到系統當前有多少個service是Tv信源:

List<TvInputInfo> list = tvInputManager.getTvInputList();
  for(TvInputInfo info:list){    
  Log.i(TAG, "id:" + info.getId());
}

6) TvInputInfo:TvInput的信息。包括頻道類型,圖標,名稱等信息。
  因為TvInput經常是以第三方應用的方式實現的,當TvInput應用安裝時,TvInputManagerService會檢測安裝包中是否包含TvInputService。

private void registerBroadcastReceivers() {
        PackageMonitor monitor = new PackageMonitor() {
            private void buildTvInputList(String[] packages) {
                synchronized (mLock) {
                    if (mCurrentUserId == getChangingUserId()) {
                        buildTvInputListLocked(mCurrentUserId, packages);
                        buildTvContentRatingSystemListLocked(mCurrentUserId);
                    }
                }
            }
 
            @Override
            public void onPackageUpdateFinished(String packageName, int uid) {
                if (DEBUG) Slog.d(TAG, "onPackageUpdateFinished(packageName=" + packageName + ")");
                // This callback is invoked when the TV input is reinstalled.
                // In this case, isReplacing() always returns true.
                buildTvInputList(new String[] { packageName });
            }
 
          ...
    }

當有安裝包安裝時,監測其中是否有TvInputService,并且權限符合則綁定這個Service.

private void buildTvInputListLocked(int userId, String[] updatedPackages) {
        UserState userState = getOrCreateUserStateLocked(userId);
        userState.packageSet.clear();
 
        if (DEBUG) Slog.d(TAG, "buildTvInputList");
        PackageManager pm = mContext.getPackageManager();
        List<ResolveInfo> services = pm.queryIntentServicesAsUser(
                new Intent(TvInputService.SERVICE_INTERFACE),
                PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
                userId);
        List<TvInputInfo> inputList = new ArrayList<>();
        for (ResolveInfo ri : services) {
            ServiceInfo si = ri.serviceInfo;
            //檢測是否有android.permission.BIND_TV_INPUT這個權限
            if (!android.Manifest.permission.BIND_TV_INPUT.equals(si.permission)) {
                Slog.w(TAG, "Skipping TV input " + si.name + ": it does not require the permission "
                        + android.Manifest.permission.BIND_TV_INPUT);
                continue;
            }
 
            ComponentName component = new ComponentName(si.packageName, si.name);
            if (hasHardwarePermission(pm, component)) {
                ServiceState serviceState = userState.serviceStateMap.get(component);
                if (serviceState == null) {
                    // New hardware input found. Create a new ServiceState and connect to the
                    // service to populate the hardware list.
                    serviceState = new ServiceState(component, userId);
                    userState.serviceStateMap.put(component, serviceState);
                    updateServiceConnectionLocked(component, userId);
                } else {
                    inputList.addAll(serviceState.hardwareInputMap.values());
                }
            } else {
                try {
                    TvInputInfo info = new TvInputInfo.Builder(mContext, ri).build();
                    inputList.add(info);
                } catch (Exception e) {
                    Slog.e(TAG, "failed to load TV input " + si.name, e);
                    continue;
                }
            }
            userState.packageSet.add(si.packageName);
        }
 
        Map<String, TvInputState> inputMap = new HashMap<>();
        for (TvInputInfo info : inputList) {
            if (DEBUG) {
                Slog.d(TAG, "add " + info.getId());
            }
            TvInputState inputState = userState.inputMap.get(info.getId());
            if (inputState == null) {
                inputState = new TvInputState();
            }
            inputState.info = info;
            inputMap.put(info.getId(), inputState);
        }
 
        for (String inputId : inputMap.keySet()) {
            if (!userState.inputMap.containsKey(inputId)) {
                notifyInputAddedLocked(userState, inputId);
            } else if (updatedPackages != null) {
                // Notify the package updates
                ComponentName component = inputMap.get(inputId).info.getComponent();
                for (String updatedPackage : updatedPackages) {
                    if (component.getPackageName().equals(updatedPackage)) {
                        //綁定TvInputService
                        updateServiceConnectionLocked(component, userId);
                        notifyInputUpdatedLocked(userState, inputId);
                        break;
                    }
                }
            }
        }
        ...
    }

綁定第三方自定義的TvInputService:

private void updateServiceConnectionLocked(ComponentName component, int userId) {
        UserState userState = getOrCreateUserStateLocked(userId);
        ServiceState serviceState = userState.serviceStateMap.get(component);
        if (serviceState == null) {
            return;
        }
        if (serviceState.reconnecting) {
            if (!serviceState.sessionTokens.isEmpty()) {
                // wait until all the sessions are removed.
                return;
            }
            serviceState.reconnecting = false;
        }
 
        boolean shouldBind;
        if (userId == mCurrentUserId) {
            shouldBind = !serviceState.sessionTokens.isEmpty() || serviceState.isHardware;
        } else {
            // For a non-current user,
            // if sessionTokens is not empty, it contains recording sessions only
            // because other sessions must have been removed while switching user
            // and non-recording sessions are not created by createSession().
            shouldBind = !serviceState.sessionTokens.isEmpty();
        }
 
        if (serviceState.service == null && shouldBind) {
            // This means that the service is not yet connected but its state indicates that we
            // have pending requests. Then, connect the service.
            if (serviceState.bound) {
                // We have already bound to the service so we don't try to bind again until after we
                // unbind later on.
                return;
            }
            if (DEBUG) {
                Slog.d(TAG, "bindServiceAsUser(service=" + component + ", userId=" + userId + ")");
            }
            //bind 第三方應用自定義的TvInputService
            Intent i = new Intent(TvInputService.SERVICE_INTERFACE).setComponent(component);
            serviceState.bound = mContext.bindServiceAsUser(
                    i, serviceState.connection,
                    Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
                    new UserHandle(userId));
        } else if (serviceState.service != null && !shouldBind) {
            // This means that the service is already connected but its state indicates that we have
            // nothing to do with it. Then, disconnect the service.
            if (DEBUG) {
                Slog.d(TAG, "unbindService(service=" + component + ")");
            }
            mContext.unbindService(serviceState.connection);
            userState.serviceStateMap.remove(component);
        }
    }

TvInputService現在綁定了,那么TvInputMangerService和TvInputService交互的邏輯就到了ServiceConnection中,它的實現在InputServiceConnection中:

        @Override
        public void onServiceConnected(ComponentName component, IBinder service) {
            if (DEBUG) {
                Slog.d(TAG, "onServiceConnected(component=" + component + ")");
            }
            synchronized (mLock) {
                UserState userState = mUserStates.get(mUserId);
                if (userState == null) {
                    // The user was removed while connecting.
                    mContext.unbindService(this);
                    return;
                }
                ServiceState serviceState = userState.serviceStateMap.get(mComponent);
                serviceState.service = ITvInputService.Stub.asInterface(service);

                // Register a callback, if we need to.
                if (serviceState.isHardware && serviceState.callback == null) {
                    serviceState.callback = new ServiceCallback(mComponent, mUserId);
                    try {
                        serviceState.service.registerCallback(serviceState.callback);
                    } catch (RemoteException e) {
                        Slog.e(TAG, "error in registerCallback", e);
                    }
                }

                List<IBinder> tokensToBeRemoved = new ArrayList<>();

                // And create sessions, if any.
                for (IBinder sessionToken : serviceState.sessionTokens) {
                    if (!createSessionInternalLocked(serviceState.service, sessionToken, mUserId)) {
                        tokensToBeRemoved.add(sessionToken);
                    }
                }

                for (IBinder sessionToken : tokensToBeRemoved) {
                    removeSessionStateLocked(sessionToken, mUserId);
                }

                for (TvInputState inputState : userState.inputMap.values()) {
                    if (inputState.info.getComponent().equals(component)
                            && inputState.state != INPUT_STATE_CONNECTED) {
                        notifyInputStateChangedLocked(userState, inputState.info.getId(),
                                inputState.state, null);
                    }
                }

                if (serviceState.isHardware) {
                    serviceState.hardwareInputMap.clear();
                    for (TvInputHardwareInfo hardware : mTvInputHardwareManager.getHardwareList()) {
                        try {
                            serviceState.service.notifyHardwareAdded(hardware);
                        } catch (RemoteException e) {
                            Slog.e(TAG, "error in notifyHardwareAdded", e);
                        }
                    }
                    for (HdmiDeviceInfo device : mTvInputHardwareManager.getHdmiDeviceList()) {
                        try {
                            serviceState.service.notifyHdmiDeviceAdded(device);
                        } catch (RemoteException e) {
                            Slog.e(TAG, "error in notifyHdmiDeviceAdded", e);
                        }
                    }
                }
            }
        }

  在onServiceConnected成功后,就可以拿到從TvInputService中獲取的Binder對象,和第三方的TvInputService聯通進行交互,它們之間交互需要創建一個Session,也就是TvInputService.Session,這個Session中的交互是通過ITvInputSessionCallback來實現。

7)TvInputCallback:TvView的一個內部類,TvInputCallBack可以反饋給TvView一些信息比如連接service是否成功,Video是否可用等:
ITvInputSessionCallback.aidl

/**
 * Helper interface for ITvInputSession to allow the TV input to notify the system service when a
 * new session has been created.
 * @hide
 */
oneway interface ITvInputSessionCallback {
    void onSessionCreated(ITvInputSession session, in IBinder hardwareSessionToken);
    void onSessionEvent(in String name, in Bundle args);
    void onChannelRetuned(in Uri channelUri);
    void onTracksChanged(in List<TvTrackInfo> tracks);
    void onTrackSelected(int type, in String trackId);
    void onVideoAvailable();
    void onVideoUnavailable(int reason);
    void onContentAllowed();
    void onContentBlocked(in String rating);
    void onLayoutSurface(int left, int top, int right, int bottom);
    void onTimeShiftStatusChanged(int status);
    void onTimeShiftStartPositionChanged(long timeMs);
    void onTimeShiftCurrentPositionChanged(long timeMs);

    // For the recording session
    void onTuned(in Uri channelUri);
    void onRecordingStopped(in Uri recordedProgramUri);
    void onError(int error);
}

自定義第三方TvInputService時,根據需求實現以上方法:

tvView.setCallback(new TvView.TvInputCallback() {    
    @Override    
    public void onConnectionFailed(String inputId) {
         super.onConnectionFailed(inputId);
         LogUtil.i(this,"MainActivity.onConnectionFailed:"+inputId); 
    }
    @Override    
    public void onDisconnected(String inputId) { 
        super.onDisconnected(inputId);
         LogUtil.i(this,"MainActivity.onDisconnected."); 
    }    
   @Override    
   public void onVideoSizeChanged(String inputId, int width, int height) { 
        super.onVideoSizeChanged(inputId, width, height); 
        LogUtil.i(this,"MainActivity.onVideoSizeChanged.");    
   }    
   @Override
     public void onVideoAvailable(String inputId) {
        super.onVideoAvailable(inputId);
        LogUtil.i(this,"MainActivity.onVideoAvailable.inputId:"+inputId);
    }
    @Override
    public void onVideoUnavailable(String inputId, int reason) {
        super.onVideoUnavailable(inputId, reason);
        LogUtil.i(this,"MainActivity.onVideoUnavailable.");
    }    
......
});

至此,TvInputManager和第三方TvInputService的交互就完成了。

8)TvProvider:

LiveTv和TvInput之間交互還有一種方式就是TvProvider, TvInput應用會將自己的頻道和節目數據寫入TvProvider對應的數據庫中,數據庫的位置在:/data/data/com.android.providers.tv/databases/tv.db

這樣LiveTv就可以讀取TvProvider中的數據了。當然這里的數據除了LiveTv和當前的TvInput應用,其他應用是沒有權限讀取的。

總結

以上是生活随笔為你收集整理的Android TV : 电视输入框架(TIF)剖析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

91久久精品一区二区二区 | 日本中文字幕视频 | 国产精品免费视频观看 | 成人羞羞视频在线观看免费 | 波多野结衣视频一区 | 久久久av电影 | 国产精品99蜜臀久久不卡二区 | 有没有在线观看av | 国产精品日韩在线播放 | 欧美日韩免费一区 | 欧美最猛性xxxxx免费 | 国产精品99久久久久久有的能看 | 91免费视频黄 | 中文字幕在线观看播放 | 国产精品久久久视频 | 国产精品久久影院 | 91成人在线免费观看 | 五月婷婷在线播放 | 亚洲国产成人精品在线观看 | 麻豆国产电影 | 国产精品a成v人在线播放 | 欧美另类重口 | 久久综合久久久久88 | 亚洲精品av中文字幕在线在线 | 有没有在线观看av | 婷婷激情久久 | 欧美性色网站 | 婷婷草 | 亚洲黄色一级电影 | 欧日韩在线视频 | 国产美女视频 | 五月婷婷婷婷婷 | 国产精在线 | 天堂av在线网 | 久久99国产精品二区护士 | 成人性生爱a∨ | av在线播放免费 | 91网址在线观看 | 激情久久伊人 | 久久精品视频在线观看免费 | 人人澡人人草 | 久久y| 伊人久久国产精品 | 亚洲黄色av网址 | 超碰人人在线观看 | 97色狠狠| 69亚洲精品 | 91成人精品一区在线播放69 | 欧美在线观看视频免费 | 成人av在线资源 | 18久久久久久 | 欧美激情视频在线免费观看 | 国产视频欧美视频 | 色综合激情久久 | 天天综合网久久 | 久久成人人人人精品欧 | 国产精品电影一区二区 | 国产精品亚洲成人 | 国产91精品高清一区二区三区 | av手机版 | 2022中文字幕在线观看 | 一区二区三区韩国免费中文网站 | 久久99九九99精品 | 国产精品国产亚洲精品看不卡15 | 国产在线观看免费观看 | 免费午夜网站 | 91精品在线免费视频 | 中文字幕一二三区 | 久久精品com | 国产精品视频线看 | 97成人精品视频在线观看 | 成人av电影免费在线播放 | 欧美日韩国产免费视频 | 欧美韩国日本在线 | 成人黄性视频 | 精品亚洲免a | 欧美日韩在线观看视频 | 国产一级视频在线观看 | 操少妇视频 | 美女视频免费精品 | 中国一级片免费看 | 韩国一区视频 | 国产精品久久久久永久免费 | 国产一区二区精品久久 | 久久国产精品久久精品 | 久久精品国产免费看久久精品 | 玖玖视频网| 日日干日日色 | 奇米777777 | 欧美大片mv免费 | 国产色女 | 国产小视频网站 | 就色干综合 | 日本特黄一级 | 狠狠色婷婷丁香六月 | 欧美激情第一页xxx 午夜性福利 | 97色婷婷人人爽人人 | 丁香六月中文字幕 | 天天天天色射综合 | 亚洲妇女av | 国产剧情久久 | 日日干干 | 国产一级视屏 | 久久久久久久久久久影院 | 亚洲精品视频二区 | 99久久夜色精品国产亚洲96 | 在线观看视频在线观看 | 在线免费观看羞羞视频 | 亚洲国产网站 | 久久伊人精品天天 | 韩日三级av| 在线观看你懂的网址 | 又色又爽又黄 | 国产精品va最新国产精品视频 | 免费在线a| 国产美女视频 | 亚洲精品自在在线观看 | 亚洲 欧美 日韩 综合 | 欧美激情视频在线观看免费 | 在线观看福利网站 | 亚洲一区在线看 | 国产视频一区二区在线播放 | 国产视频九色蝌蚪 | 又黄又刺激视频 | 五月婷婷影视 | 啪啪激情网 | www.天天射.com| 天天操福利视频 | 欧美亚洲免费在线一区 | 综合色站导航 | 国产剧情在线一区 | 丝袜美女在线观看 | 视频直播国产精品 | 日韩三区在线观看 | 亚洲日韩欧美一区二区在线 | 亚洲乱码精品久久久久 | 亚洲免费国产 | 99r在线观看 | 色婷婷97 | 中文字幕在线视频一区二区三区 | 天天射综合 | 日韩久久久久久久久久久久 | 久久人人爽人人爽人人片av软件 | 国产精品久久久久9999 | 亚洲精品 在线视频 | 久久你懂的 | 天天做天天爱天天爽综合网 | 久久成人精品电影 | 国产无吗一区二区三区在线欢 | 亚洲成人精品久久久 | 日韩videos | 久久1区 | 国产视频一区精品 | 国产精品一区二区三区视频免费 | 操操操夜夜操 | 亚洲年轻女教师毛茸茸 | www天天操 | 五月天欧美精品 | 天天干天天插 | 麻豆va一区二区三区久久浪 | 三级性生活视频 | 99亚洲精品在线 | 免费成人av在线看 | 欧美aaa级片| 区一区二区三在线观看 | 日韩精品一区二区三区丰满 | 国产99一区视频免费 | 久草在线91| 97成人啪啪网 | 国产精品一区在线播放 | 欧美日韩在线观看视频 | 欧美精品国产精品 | 国产精品久久久久久久久久久不卡 | 四虎在线视频 | a√天堂中文在线 | 99久久国产免费,99久久国产免费大片 | 91网在线看 | 中文字幕免费看 | 一区二区中文字幕在线播放 | 二区三区在线视频 | 国产小视频91 | 亚洲精品乱码久久久久v最新版 | 午夜国产福利视频 | 成人天堂网 | 国产亚洲情侣一区二区无 | 国产精品a成v人在线播放 | 日韩毛片在线播放 | 欧美日韩在线观看一区二区 | 伊人影院av| 日韩欧美亚州 | 久久久久高清 | 日本中文字幕久久 | 久久激情视频网 | 2022久久国产露脸精品国产 | 欧美日韩天堂 | 天天干天天做天天操 | 毛片无卡免费无播放器 | 99久久久国产精品免费99 | 丁香花在线观看免费完整版视频 | 国产 中文 日韩 欧美 | 99久久久久免费精品国产 | av资源在线看 | 国产精品国产精品 | 久草在线在线视频 | 日韩福利在线观看 | 免费看黄在线网站 | 美女在线国产 | 一级黄色在线免费观看 | 日日夜夜天天 | 99久久精品久久亚洲精品 | 国产97视频 | 中文字幕在线视频免费播放 | 欧美精品久久久久久久免费 | 亚洲高清视频一区二区三区 | 日韩城人在线 | 国产精品对白一区二区三区 | 日韩视频一区二区三区 | 三级黄色欧美 | 色婷婷 亚洲 | 中文字幕一区在线观看视频 | 色天天久久 | 九九电影在线 | 国产伦精品一区二区三区无广告 | 久久综合五月婷婷 | 国产美女精品视频免费观看 | 成人黄色电影在线播放 | 五月天天在线 | 日韩av五月天| 国产免费观看久久黄 | 2022中文字幕在线观看 | 婷婷久操 | 国产日产亚洲精华av | 久草热视频| 在线 视频 一区二区 | 精品国产一区二区三区四 | 成人一级黄色片 | 色婷婷成人 | 色国产在线 | 狠狠狠色 | 天天曰天天干 | 黄色三级免费片 | 中文免费在线观看 | av高清一区二区三区 | 日韩免费成人av | 久久久久免费精品国产 | 特级毛片网站 | 美女av电影| 国产成人免费观看 | 久久国产精品99国产精 | 99久久国产免费,99久久国产免费大片 | 操高跟美女 | 久草免费在线视频 | 国产婷婷精品 | 91少妇精拍在线播放 | 免费视频久久久 | 日韩a在线播放 | 国产手机av | 国产黄a三级| 国产在线色站 | 人人澡人人爱 | 91人人射 | 精品久久国产精品 | 日日干干 | 在线免费中文字幕 | 天堂视频中文在线 | 中文字幕刺激在线 | 五月天天天操 | 在线日本看片免费人成视久网 | 亚洲第一中文网 | 久久综合色播五月 | 亚洲精品久久激情国产片 | 激情网站免费观看 | 国产成人精品一区二区三区在线 | 91高清免费在线观看 | 欧产日产国产69 | 久操操 | 亚洲乱码精品久久久久 | 婷婷综合伊人 | 亚洲激情婷婷 | 极品美女被弄高潮视频网站 | 欧美精品久久久久久久亚洲调教 | 欧美日韩3p | 久久天 | 97涩涩视频 | 在线观看日韩精品视频 | 亚洲五月激情 | 又湿又紧又大又爽a视频国产 | 久久久久久久久精 | 四虎国产精品永久在线国在线 | 日韩a在线看| 国产亚洲成av片在线观看 | 日本mv大片欧洲mv大片 | 91看毛片| 五月综合网 | 天天操夜夜叫 | 欧美精品三级 | 国产美女无遮挡永久免费 | 成人欧美在线 | 国内亚洲精品 | 亚洲天堂毛片 | 国产视频九色蝌蚪 | 99免费在线观看视频 | 中文字幕在线字幕中文 | 欧美va在线观看 | 欧美一级性| 五月天中文字幕mv在线 | 婷婷色在线 | 999热视频 | 久久99久国产精品黄毛片入口 | 欧美 高跟鞋交 xxxxhd | 久久亚洲专区 | 韩国av免费在线观看 | 久久精品视频中文字幕 | 久草网免费 | 亚洲成人免费 | 国产精品视频 | 麻豆传媒视频在线免费观看 | 麻豆视频国产 | 黄a网站 | 久久免费公开视频 | 在线91色 | a级国产乱理论片在线观看 特级毛片在线观看 | 色综合天天爱 | 亚洲成人免费在线 | 国产97超碰| 日本精品一区二区在线观看 | 免费久久99精品国产婷婷六月 | 成人四虎影院 | 欧美成人999 | 天天干中文字幕 | 久久艹在线观看 | 免费黄色小网站 | 午夜国产福利视频 | 久久人人爽av | 成人精品999 | 九九热免费观看 | 日本特黄特色aaa大片免费 | 黄色成人av在线 | 国产精品久久在线观看 | 中文字幕国语官网在线视频 | 国内亚洲精品 | 99久久99久久精品国产片 | 久久这里有| 开心丁香婷婷深爱五月 | 亚洲成人黄色在线观看 | 伊甸园永久入口www 99热 精品在线 | 久久一区二区三区国产精品 | 在线导航av | 狠狠躁夜夜a产精品视频 | 在线观看av麻豆 | 日本在线观看中文字幕 | 亚洲精品福利在线 | 一区二区成人国产精品 | 婷婷六月丁| 国产精品男女 | 91成人天堂久久成人 | 亚洲夜夜综合 | 久久久久亚洲最大xxxx | 欧美国产日韩在线视频 | 久草资源在线观看 | 国产又粗又硬又爽的视频 | 韩国一区二区三区视频 | 天天操天天艹 | 九九九视频精品 | 免费看久久久 | 日韩网站视频 | 麻豆91网站| 亚洲欧洲日韩 | 欧美久久久久久久久久 | 久久99国产精品自在自在app | 日韩在线观看中文字幕 | 亚洲成人av一区二区 | 亚洲视频免费在线观看 | 国产婷婷色 | 国产在线 一区二区三区 | 99精品网站| 国产视频九色蝌蚪 | 久久国产精品99久久久久久丝袜 | 久草视频中文在线 | 日韩欧美精品在线观看 | 亚洲日本色 | 久久精品一区二区国产 | 中中文字幕av在线 | 香蕉视频免费在线播放 | 在线视频18在线视频4k | 福利片免费看 | 少妇视频在线播放 | 一区二区三区在线播放 | 黄色网址a | 亚洲理论电影 | 91一区啪爱嗯打偷拍欧美 | 久久久69 | 51久久夜色精品国产麻豆 | 日韩av免费一区 | av观看在线观看 | 亚洲另类在线视频 | 亚洲电影久久 | 国产中文在线字幕 | 国产偷v国产偷∨精品视频 在线草 | 一区二区不卡在线观看 | 免费视频国产 | 国产精品久久久久av | 久久久精品网 | 亚欧日韩av | 亚洲日本在线一区 | 日韩欧美视频一区二区 | 热久久在线视频 | 国产亚洲免费的视频看 | 奇米影视在线99精品 | 国产精品久久一 | av在线免费不卡 | 欧美一区中文字幕 | 精品黄色片 | 久久99久久99精品免视看婷婷 | 黄色成年片 | 欧美视频不卡 | 天天综合区 | 手机在线观看国产精品 | 香蕉视频在线免费 | 亚洲做受高潮欧美裸体 | 精品国偷自产在线 | 亚洲va天堂va欧美ⅴa在线 | 欧美日韩精品在线观看 | 国产高清亚洲 | 波多野结依在线观看 | 国产精品a久久久久 | 亚洲日本中文字幕在线观看 | 视频二区在线 | 久久久麻豆视频 | 免费日韩av片 | 一区在线播放 | 亚洲乱码中文字幕综合 | av在线电影网站 | 欧美精选一区二区三区 | 久久精品国产精品 | 亚洲精品久久激情国产片 | 天天看天天干天天操 | 不卡中文字幕av | 免费午夜av | 最新免费中文字幕 | 激情图片区 | 麻豆91网站| 亚洲精品久久久久久久蜜桃 | 97久久精品午夜一区二区 | 久久免费播放视频 | 国产精品久久久久久五月尺 | 日韩免费高清在线观看 | 国产精品久久久久毛片大屁完整版 | 九热精品 | 综合色影院 | 另类五月激情 | 国产1级毛片 | 亚洲全部视频 | 美女国产精品 | 精品美女在线观看 | 91chinese在线| 国产精品免费人成网站 | av软件在线观看 | 波多野结衣在线观看视频 | 九九热中文字幕 | 日本3级在线观看 | 亚洲欧美激情插 | 精品欧美小视频在线观看 | 啪啪免费观看网站 | 伊人天堂久久 | 免费av大全| 伊人天天色| 嫩草伊人久久精品少妇av | 久久综合色综合88 | 黄色视屏免费在线观看 | 久久久久久蜜av免费网站 | 五月婷婷在线观看 | 久久婷亚洲五月一区天天躁 | 久久高清免费观看 | 色婷婷中文 | 免费看片网站91 | 国产伦理剧 | av在线播放免费 | 国产一区在线免费观看视频 | 国产成人精品一区在线 | 色a资源在线 | 在线观看的av网站 | 日韩av有码在线 | 亚洲黄色av一区 | 超碰人人国产 | 人人爽人人爽人人爽人人爽 | 国产精品99页 | 97成人精品 | 国产亚洲精品久久久久秋 | 91av在| 亚洲在线a | 欧美日韩色婷婷 | 国产麻豆精品一区二区 | 五月在线 | 久久天天躁狠狠躁亚洲综合公司 | 国产无套精品久久久久久 | 成片人卡1卡2卡3手机免费看 | 日韩狠狠操 | 激情欧美日韩一区二区 | 91在线看黄| 久久综合久久综合这里只有精品 | 免费国产ww | 亚洲国产精品一区二区久久hs | 91在线观看高清 | 免费福利视频导航 | 91精品国产91热久久久做人人 | 欧美巨乳网 | 国产伦理精品一区二区 | 日韩国产在线观看 | 国产老太婆免费交性大片 | 一区二区三区高清不卡 | 99久久这里有精品 | 国产麻豆剧果冻传媒视频播放量 | 欧美一级xxxx | 久久免费久久 | 深爱五月激情五月 | 亚洲成人免费 | 久草精品在线观看 | 国产精品成人a免费观看 | 97视频一区 | 亚洲国产合集 | 国产九色在线播放九色 | 四虎影视成人永久免费观看亚洲欧美 | 奇米7777狠狠狠琪琪视频 | 美女网站视频久久 | 精品久久久久久综合 | 午夜精品视频免费在线观看 | 久久只精品99品免费久23小说 | 美女露久久 | 天天操天天干天天玩 | 91久久精品一区二区三区 | 国产精品视频在线观看 | 国产精品12 | 国产99免费视频 | 日韩精品极品视频 | 久久综合久久综合这里只有精品 | 日本在线视频一区二区三区 | 日本午夜在线亚洲.国产 | 国产91精品久久久久 | 成人av免费在线播放 | 国产精品午夜8888 | 亚洲自拍av在线 | 日韩美女免费线视频 | 国产字幕在线观看 | 91精品视频播放 | 亚洲视频久久久 | 国产精品一区二区你懂的 | 午夜视频免费 | 在线一二三四区 | aⅴ精品av导航| 黄色一级大片在线免费看产 | 国产欧美在线一区二区三区 | 婷婷精品 | 亚洲高清在线视频 | 日韩精品中文字幕有码 | 狠狠干 狠狠操 | 青青草国产精品视频 | 色婷婷国产精品一区在线观看 | 毛片永久新网址首页 | 国产区网址 | 国模一区二区三区四区 | 少妇激情久久 | 午夜精品久久久久久99热明星 | 狠狠色狠狠色终合网 | 四虎影视国产精品免费久久 | 日日激情| 最新99热 | 亚洲 在线 | 日韩在线观看三区 | 久久精精品视频 | 日日夜夜天天综合 | 国产黄色高清 | 久久久久在线视频 | 精品1区2区 | 日韩久久一区二区 | 欧美精品一区二区三区一线天视频 | 一区二区精品在线视频 | 国产 日韩 在线 亚洲 字幕 中文 | 国产美女网 | 天天爽夜夜爽人人爽曰av | 久久成人国产精品免费软件 | 天天综合精品 | 国产精品av免费观看 | 97精品国产一二三产区 | 在线视频 区 | 激情综合站| h文在线观看免费 | 天堂av观看 | 日韩电影在线观看一区 | 婷婷国产v亚洲v欧美久久 | 午夜国产在线观看 | 激情综合色综合久久 | 久草视频在线资源站 | 久久av福利 | 成人免费看片网址 | av黄免费看 | 精品国模一区二区三区 | 欧美日韩国产高清视频 | 日韩午夜av | 在线观看免费日韩 | 18性欧美xxxⅹ性满足 | 狠狠操狠狠干2017 | 欧美aa级 | 美女国产网站 | 日韩av成人在线观看 | 欧美性黑人 | 奇米先锋 | 亚洲久草网| 国产不卡在线播放 | 黄色一级在线免费观看 | 中文字幕国内精品 | 久久黄色免费观看 | 国产精彩视频一区二区 | 国产亚洲精品久久久网站好莱 | 亚洲高清国产视频 | 三级黄色片在线观看 | 激情久久一区二区三区 | 亚洲日本在线一区 | 国产精品一区二区三区在线 | 日b视频在线观看网址 | 中文字幕第一页在线视频 | 国产精品一码二码三码在线 | 三级动图 | 91视频黄色| 激情五月***国产精品 | av日韩中文 | 久久综合久久综合这里只有精品 | 激情五月婷婷激情 | 中文区中文字幕免费看 | 天天躁天天操 | 日韩一区精品 | 国产成人精品福利 | 亚洲涩涩网站 | 在线韩国电影免费观影完整版 | 欧美一二三区在线播放 | 毛片区 | 美女久久视频 | 少妇bbb搡bbbb搡bbbb | 狠狠色丁香婷婷综合橹88 | 嫩嫩影院理论片 | 中文字幕中文字幕在线中文字幕三区 | 嫩草av在线 | 97热久久免费频精品99 | 一区二区影视 | 黄色网在线免费观看 | 一区二区三区高清在线 | 黄色软件在线看 | 98精品国产自产在线观看 | 99久久激情 | 日韩黄色免费电影 | 中文字幕色婷婷在线视频 | 视频直播国产精品 | 日韩电影中文字幕在线 | 久久99久久99免费视频 | 精品美女久久久久 | 国产一级在线观看 | 福利二区视频 | 亚洲专区 国产精品 | 日韩中文在线观看 | 99在线视频免费观看 | 丁香在线观看完整电影视频 | 欧美成人理伦片 | 久久不卡电影 | 日韩欧美一区二区在线 | 天天干夜夜夜操天 | 久久美女精品 | 九九久久在线看 | 亚洲精品资源 | 亚洲天堂网在线观看视频 | 天天做天天爱夜夜爽 | 99这里都是精品 | 四虎国产精品成人免费4hu | 亚洲综合国产精品 | 97超碰人人澡人人爱 | 午夜久久网站 | 久草com| 99精品国产在热久久 | 九九视频免费在线观看 | 欧美精品久久久久久久 | 亚洲一区精品人人爽人人躁 | 亚洲国产欧美一区二区三区丁香婷 | 97夜夜澡人人爽人人免费 | 深夜福利视频一区二区 | 四虎影视成人精品 | 国产精品手机视频 | 99视| 国产做爰视频 | 97在线精品国自产拍中文 | 最新国产在线视频 | 91丨九色丨丝袜 | 亚洲影院天堂 | 国产精品国产三级在线专区 | 日韩中文字幕免费电影 | 香蕉视频国产在线观看 | 日韩在线观看a | 国产成人在线网站 | 一区二区成人国产精品 | 成人av网页 | 六月色播 | 狠狠色伊人亚洲综合成人 | 精品在线观 | 六月婷操 | 欧美极度另类性三渗透 | 亚洲国产福利视频 | 亚洲久草视频 | 国产精品久久久久久模特 | 免费久久久 | 最新极品jizzhd欧美 | 亚洲免费成人 | 免费视频一区二区 | 国产一区二区精品 | 少妇按摩av| 国际av在线 | 手机看片中文字幕 | 看片网站黄 | 色婷婷视频在线 | 黄色特级一级片 | 久久久久免费视频 | 国产精品日韩 | 久久久久国产成人精品亚洲午夜 | 亚洲精品成人av在线 | 日三级在线| 亚州精品天堂中文字幕 | av久久在线 | 国产精品一区二区三区久久 | 免费亚洲黄色 | 综合色综合| 久久久久久久久久电影 | 91看片看淫黄大片 | 亚洲aaa毛片 | 久久黄色小说视频 | 久久久久久久久久久久久久电影 | 99久久久久久 | 一级a毛片高清视频 | 亚洲精品乱码久久久久久按摩 | 三日本三级少妇三级99 | 日韩免费视频在线观看 | 国产精品久久久久久久久婷婷 | 在线观看视频国产一区 | 婷婷激情av | 国内精品久久久久影院日本资源 | 久久国产精品免费观看 | 久久99九九99精品 | 亚洲一区动漫 | 亚洲成av人影院 | 日日天天干 | 超碰免费av | 最新91在线视频 | 欧美一级片免费 | 色在线免费 | 亚洲视频999 | 欧洲色综合 | 久久婷婷五月综合色丁香 | 久久国产系列 | 亚州av成人 | www.五月婷婷.com | 亚洲精品国产成人 | 久草在线免费新视频 | 国产理论片在线观看 | 成人久久免费 | 久久99国产精品二区护士 | 草莓视频在线观看免费观看 | 亚洲精品视频在线观看免费视频 | 在线观看视频福利 | 992tv在线观看网站 | 国产成人精品综合久久久 | 日日骑| 色综合网| 91少妇精拍在线播放 | 免费在线观看av不卡 | 久久国内精品 | 久草在线官网 | 99久久999久久久精玫瑰 | 国偷自产视频一区二区久 | av免费网站 | 久久国产精品一区二区三区四区 | 黄网站免费久久 | 日韩欧美在线高清 | 视频国产一区二区三区 | 2019中文在线观看 | 日本字幕网 | 最近中文字幕高清字幕免费mv | www久久久久 | 天天天天天天天操 | 日韩欧美在线免费 | 亚洲精品va | 粉嫩av一区二区三区四区五区 | 丁香影院在线 | 国产精品久久久一区二区三区网站 | 日韩视频二区 | 狠狠天天 | 国产69精品久久久久99 | 国产精品99久久久久的智能播放 | 欧美激情精品久久久久 | 亚洲专区免费观看 | 国产日韩在线播放 | 亚洲一级二级 | 国产一级电影免费观看 | 中文字幕国产精品 | 国产主播99| 国产三级国产精品国产专区50 | 亚洲精品久久久蜜臀下载官网 | 久久精选视频 | 99视频+国产日韩欧美 | 中文字幕免费一区 | 欧美一级免费黄色片 | 午夜999 | 青青色影院 | 国产精品久久久777 成人手机在线视频 | 97色资源| 中文字幕av电影下载 | 99精品福利 | 日韩欧美在线国产 | 在线免费高清一区二区三区 | 精品一区精品二区 | 免费看黄在线看 | 午夜精品福利一区二区三区蜜桃 | 久久国语露脸国产精品电影 | 成年人看片 | 四虎影视成人永久免费观看视频 | 成人免费视频在线观看 | 精品理论片 | 色网站免费在线观看 | 999国产 | 狠狠色丁香婷婷综合欧美 | 最新中文在线视频 | a视频免费| 国产精品毛片久久久久久 | 人人爽人人爽人人片av免 | 欧美中文字幕久久 | 中文字幕乱码在线播放 | 91少妇精拍在线播放 | 在线观看成人一级片 | 日韩有码中文字幕在线 | 色婷婷伊人 | 有码中文字幕在线观看 | 美女在线免费观看视频 | 日韩中文在线字幕 | 欧美a在线免费观看 | 天天干.com | 奇米影视8888在线观看大全免费 | 99久久久国产精品免费99 | 精品国产aⅴ一区二区三区 在线直播av | 成人黄色片在线播放 | 麻豆一精品传二传媒短视频 | 国产精品18久久久久久久 | 天天碰天天操视频 | 手机色在线 | 精品在线99 | 国产亚洲91| 成人免费在线观看入口 | 人人爽人人爽人人片av免 | 亚洲精品午夜国产va久久成人 | 在线电影a| 国产色秀视频 | 婷婷综合久久 | 操一草| 日韩欧美高清不卡 | 天天综合91 | a成人v | 一区二区三区免费在线播放 | av色影院 | 99久久精品免费视频 | 天天爱天天射 | av不卡免费在线观看 | 伊人资源视频在线 | 91视频久久 | 久久爱www. | 国产精品涩涩屋www在线观看 | 一区二区三区免费在线观看视频 | 天天看天天干 | 天天摸日日摸人人看 | 日韩在线一二三区 | 久久久高清| 国产视频在线免费 | 在线免费av播放 | 欧美精品中文字幕亚洲专区 | 在线精品视频免费观看 | 在线亚洲高清视频 | 中文字幕频道 | 亚洲在线视频观看 | 伊人宗合网 | 色天堂在线视频 | 日韩欧美不卡 | 国产一二区精品 | 精品美女久久久久 | 99免费看片| 尤物一区二区三区 | 国产系列精品av | 国产美女黄网站免费 | 亚洲精品麻豆视频 | 在线看黄网站 | 伊人国产视频 | 一区二区中文字幕在线 | 日韩精品 在线视频 | 国产黄色av影视 | 亚洲电影在线看 | 爱射综合 | 97av精品| 欧美在线1区 | 午夜美女福利直播 | 国产h在线播放 | 99精品视频免费全部在线 | 91精品国产三级a在线观看 | 日韩av免费一区 | 99久久99 | 亚洲 欧洲 国产 日本 综合 | 中文字幕在线视频一区二区 | 一本—道久久a久久精品蜜桃 | 亚洲精品av在线 | 免费久久久久久 | 97偷拍视频 | 少妇精品久久久一区二区免费 | 免费人成网 | 成人免费av电影 | 国产99精品 | 欧美成天堂网地址 | www在线观看国产 | 又黄又爽又湿又无遮挡的在线视频 | 欧美激情视频一区二区三区免费 | 成人在线播放免费观看 | 天天色图| 免费看色的网站 | 成人在线观看资源 | 77国产精品 | 丁香六月婷婷开心婷婷网 | 色www精品视频在线观看 | 亚洲国产mv | 久草视频精品 | 国际精品网| 久久久久久久精 | 精品视频免费看 | 在线中文字幕一区二区 | 国产精品夜夜夜一区二区三区尤 | 成人av片在线观看 | 人人爽人人看 | 夜夜骑天天操 | 亚洲成年人免费网站 | 国产+日韩欧美 | 中文字幕在线观看完整版 | 色综合久| 久久久久久国产精品亚洲78 | 91香蕉视频好色先生 | 亚洲欧洲久久久 | 在线国产不卡 | 久久夜色电影 | 极品美女被弄高潮视频网站 | 欧美国产大片 | 久久9999久久免费精品国产 | 久久99国产精品二区护士 | av五月婷婷| 国产成人久久 | 国产高清av在线播放 | 日日夜夜网 | 人人插人人看 | 黄色av一级片 | 日韩欧美精品在线观看 | 成人av影院在线观看 | 在线观看不卡视频 | 欧美地下肉体性派对 | 999久久国产精品免费观看网站 | www狠狠| 亚洲性xxxx | 国产精品永久久久久久久久久 | 中文字幕久久网 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久久久久久久18 | 久久综合爱 | 国产精品永久久久久久久久久 | 亚洲va在线va天堂va偷拍 | 九九热久久免费视频 | 国产精品无 | 午夜在线观看影院 | 久久久www成人免费精品张筱雨 | 在线观看中文av | 黄色特一级片 | 国产精品久久久久久久久久了 | 成人h动漫在线看 | 日韩有色 | 久久久国产精品久久久 | 亚洲专区一二三 | 免费黄色在线播放 | 日韩大片免费在线观看 | 中文字幕一区二区三区在线播放 | 97超碰人人干 | 国产精品com| 人人操日日干 | 欧美精品久久人人躁人人爽 | 在线观看的a站 | 性色av免费看 | 99久久精品免费看国产一区二区三区 | 黄色亚洲在线 | 天天天射 | 婷婷六月天在线 | 日韩欧美在线综合网 | 97在线超碰| 国产91精品久久久久久 | 久久国产热视频 |