亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

Android Firebase身份驗證 Google登錄含代碼

Android Firebase身份驗證 – Google登錄

Firebase身份驗證 提供了后端服務,通過使用SDK和內置UI庫來輕松驗證應用程序中的用戶。愛掏網 - it200.com大多數應用程序都需要用戶的身份,了解其狀態后,應用程序會將用戶數據安全地保存在云中。愛掏網 - it200.com它旨在構建一個安全的身份驗證系統。愛掏網 - it200.com

使用Firebase身份驗證,我們將對Google、Facebook、GitHub、Twitter等進行身份驗證登陸。愛掏網 - it200.com

在本教程中,我們將在我們的Android應用程序中集成Firebase身份驗證以實現Google登錄功能,使用 GoogleFirebase APIs愛掏網 - it200.com

1. 在 https://firebase.google.com/ 上創建Firebase開發人員帳戶,并點擊“轉到控制臺”。愛掏網 - it200.com

2. 點擊 ‘添加項目’愛掏網 - it200.com

3. 填寫項目名稱,選擇分析位置、云Firestore位置,接受控制器條款并點擊 ‘創建項目’愛掏網 - it200.com

4. 當您的新項目成功準備好時,請點擊 ‘繼續’ .

5. 選擇 ‘Android’ 平臺的SDK。愛掏網 - it200.com

6. 通過提供所需的應用程序信息并點擊 ‘注冊應用’ 來將您的應用程序注冊到Firebase。愛掏網 - it200.com

我們可以通過以下步驟獲取應用程序證書SHA-1密鑰:

  1. 打開Android工程。愛掏網 - it200.com
  2. 從右側面板中打開Gradle選項卡。愛掏網 - it200.com
  3. 雙擊 ‘signingReport’愛掏網 - it200.com
  4. 我們將在 ‘Gradle控制臺’ 中找到我們的應用程序SHA-1密鑰。愛掏網 - it200.com

7. 現在下載 ‘google-services.json’ 文件并將其集成到Android應用程序中,然后點擊 ‘下一步’ 。愛掏網 - it200.com

8. 在您的應用程序的.gradle文件中添加firebase SDK依賴項,并在IDE中點擊“立即同步”并點擊 “下一步”愛掏網 - it200.com

build.gradle(項目)

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
    classpath 'com.google.gms:google-services:4.0.1'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

build.gradle(模塊)

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.firebase:firebase-auth:16.0.3'
    implementation 'com.google.firebase:firebase-core:16.0.3'
    implementation 'com.google.android.gms:play-services-auth:16.0.0'
    implementation 'com.github.bumptech.glide:glide:3.7.0'
}
apply plugin: 'com.google.gms.google-services'

AndroidManifest.xml

在AndroidManifest.xml文件中添加 Internet 權限以訪問網絡連接。愛掏網 - it200.com

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

9. 運行您的應用程序以驗證安裝配置,如果一切正常,它將顯示一個成功消息,然后點擊 ‘繼續到控制臺’愛掏網 - it200.com

10. 在控制臺頁面上選擇 認證 -gt; 登錄方法 -gt; Google -gt; 啟用 并點擊 ‘保存’愛掏網 - it200.com

Android Firebase身份驗證與Google登錄示例

在這個示例中,我們將在我們的Android應用程序中集成Firebase身份驗證與Google登錄。愛掏網 - it200.com一旦用戶通過Google登錄成功登錄,我們將使用Firebase身份驗證對他們進行身份驗證,然后將用戶重定向到下一個活動(ProfileActivity)并顯示他們的詳細信息。愛掏網 - it200.com

我們需要將下載的 ‘google-services.json’ 文件粘貼到我們的Android項目應用程序目錄中。愛掏網 - it200.com

activity_main.xml

在activity_main.xml文件中添加以下代碼。愛掏網 - it200.com在這個活動中,我們實現了自定義的Google登錄按鈕。愛掏網 - it200.com

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.javatpoint.com.firebasegooglelogin.MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:textSize="20dp"
        android:text="This is main activity, sign in to move next activity." />

    <com.google.android.gms.common.SignInButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sign_in_button"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="20dp">

    </com.google.android.gms.common.SignInButton>


</RelativeLayout>

strings.xml

在string.xml文件中添加您的Web客戶端ID。愛掏網 - it200.com您也可以在程序中使用默認的Google Web客戶端ID。愛掏網 - it200.com

<resources>
    <string name="app_name">Firebase Google Login</string>
    <string name="web_client_id">xxxxxxxx..place your web client id here</string>
</resources>

MainActivity.java

在MainActivity.java類中添加以下代碼。愛掏網 - it200.comMainActivity.java類中使用的類和方法的功能如下:

  1. 使用 new FirebaseAuth.AuthStateListener() 作為身份驗證偵聽器,檢查用戶是否登入。愛掏網 - it200.com如果用戶成功登入,則執行其他Firebase邏輯。愛掏網 - it200.com
  2. 使用 new GoogleSignInOptions.Builder() 方法配置Google Sign-in,使用requestEmail選項獲取用戶數據。愛掏網 - it200.com
  3. 點擊“登錄”按鈕時,調用 Auth.GoogleSignInApi.getSignInIntent(googleApiClient) ,并通過startActivityForResult()啟動意圖。愛掏網 - it200.com
  4. onActivityResult() 中獲取Google Sign-in請求的結果。愛掏網 - it200.com
  5. 如果 handleSignInResult(result) 返回true,則使用idToken獲取Google認證。愛掏網 - it200.com
  6. 調用 firebaseAuthWithGoogle(credential) 與Google進行Firebase身份驗證。愛掏網 - it200.com

如果Firebase身份驗證成功,我們將用戶重定向到下一個活動(ProfileActivity.java)。愛掏網 - it200.com

package example.javatpoint.com.firebasegooglelogin;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "MainActivity";
    private SignInButton signInButton;
    private GoogleApiClient googleApiClient;
    private static final int RC_SIGN_IN = 1;
    String name, email;
    String idToken;
    private FirebaseAuth firebaseAuth;
    private FirebaseAuth.AuthStateListener authStateListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
        //this is where we start the Auth state Listener to listen for whether the user is signed in or not
        authStateListener = new FirebaseAuth.AuthStateListener(){
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                // Get signedIn user
                FirebaseUser user = firebaseAuth.getCurrentUser();

                //if user is signed in, we call a helper method to save the user details to Firebase
                if (user != null) {
                    // User is signed in
                    // you could place other firebase code
                    //logic to save the user details to Firebase
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
            }
        };

        GoogleSignInOptions gso =  new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.web_client_id))//you can also use R.string.default_web_client_id
                .requestEmail()
                .build();
        googleApiClient=new GoogleApiClient.Builder(this)
                .enableAutoManage(this,this)
                .addApi(Auth.GOOGLE_SIGN_IN_API,gso)
                .build();

        signInButton = findViewById(R.id.sign_in_button);
        signInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
                startActivityForResult(intent,RC_SIGN_IN);
            }
        });
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==RC_SIGN_IN){
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
    }

    private void handleSignInResult(GoogleSignInResult result){
        if(result.isSuccess()){
            GoogleSignInAccount account = result.getSignInAccount();
            idToken = account.getIdToken();
            name = account.getDisplayName();
            email = account.getEmail();
            // you can store user data to SharedPreference
            AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
            firebaseAuthWithGoogle(credential); 
        }else{
            // Google Sign In failed, update UI appropriately
            Log.e(TAG, "Login Unsuccessful. "+result);
            Toast.makeText(this, "Login Unsuccessful", Toast.LENGTH_SHORT).show();
        }
    }
    private void firebaseAuthWithGoogle(AuthCredential credential){

        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
                        if(task.isSuccessful()){
                            Toast.makeText(MainActivity.this, "Login successful", Toast.LENGTH_SHORT).show();
                            gotoProfile();
                        }else{
                            Log.w(TAG, "signInWithCredential" + task.getException().getMessage());
                            task.getException().printStackTrace();
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }

                    }
                });
    }




    private void gotoProfile(){
        Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();
    }
    @Override
    protected void onStart() {
        super.onStart();
        if (authStateListener != null){
            FirebaseAuth.getInstance().signOut();
        }
        firebaseAuth.addAuthStateListener(authStateListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (authStateListener != null){
            firebaseAuth.removeAuthStateListener(authStateListener);
        }
    }

}

profile_activity.xml

將以下代碼添加到profile_activity.xml文件中。愛掏網 - it200.comImageView用于顯示用戶個人資料圖像,TextView用于顯示姓名、電子郵件、ID,按鈕用于注銷。愛掏網 - it200.com

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.javatpoint.com.firebasegooglelogin.ProfileActivity">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">
            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/profileImage"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/name"
                android:text="name"
                android:textSize="20dp"
                android:layout_marginTop="20dp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/email"
                android:textSize="20dp"
                android:text="email"
                android:layout_marginTop="20dp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/userId"
                android:textSize="20dp"
                android:text="id"
                android:layout_marginTop="20dp"/>
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/logoutBtn"
                android:text="Logout"
                android:layout_marginTop="30dp"/>
        </LinearLayout>
</RelativeLayout>

ProfileActivity.java

在這個ProfileActivity.java類中,我們獲取用戶信息并顯示。愛掏網 - it200.comGoogleSignInResult類實現了Result接口,表示調用Google Play服務的API方法后的最終結果。愛掏網 - it200.com

GoogleSignInAccount類保存用戶的必要信息。愛掏網 - it200.com

package example.javatpoint.com.firebasegooglelogin;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.OptionalPendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.firebase.auth.FirebaseAuth;

public class ProfileActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
    Button logoutBtn;
    TextView userName,userEmail,userId;
    ImageView profileImage;
    private GoogleApiClient googleApiClient;
    private GoogleSignInOptions gso;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

        logoutBtn = findViewById(R.id.logoutBtn);
        userName = findViewById(R.id.name);
        userEmail = findViewById(R.id.email);
        userId = findViewById(R.id.userId);
        profileImage = findViewById(R.id.profileImage);

        gso =  new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        googleApiClient=new GoogleApiClient.Builder(this)
                .enableAutoManage(this,this)
                .addApi(Auth.GOOGLE_SIGN_IN_API,gso)
                .build();


        logoutBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirebaseAuth.getInstance().signOut();
                Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                        new ResultCallback<Status>() {
                            @Override
                            public void onResult(Status status) {
                                if (status.isSuccess()){
                                    gotoMainActivity();
                                }else{
                                    Toast.makeText(getApplicationContext(),"Session not close",Toast.LENGTH_LONG).show();
                                }
                            }
                        });
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        OptionalPendingResult<GoogleSignInResult> opr= Auth.GoogleSignInApi.silentSignIn(googleApiClient);
        if(opr.isDone()){
            GoogleSignInResult result=opr.get();
            handleSignInResult(result);
        }else{
            opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
                @Override
                public void onResult(@NonNull GoogleSignInResult googleSignInResult) {
                    handleSignInResult(googleSignInResult);
                }
            });
        }
    }
    private void handleSignInResult(GoogleSignInResult result){
        if(result.isSuccess()){
            GoogleSignInAccount account=result.getSignInAccount();
            userName.setText(account.getDisplayName());
            userEmail.setText(account.getEmail());
            userId.setText(account.getId());
            try{
                Glide.with(this).load(account.getPhotoUrl()).into(profileImage);
            }catch (NullPointerException e){
                Toast.makeText(getApplicationContext(),"image not found",Toast.LENGTH_LONG).show();
            }

        }else{
            gotoMainActivity();
        }
    }
    private void gotoMainActivity(){
        Intent intent=new Intent(this,MainActivity.class);
        startActivity(intent);
    }
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}

輸出:

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

    
    

    国产精品女人久久久久久| 久久久久国产一区二区三区四区 | 亚洲图片欧美一区| 国产一区二区三区免费在线观看 | 免费观看久久久4p| 亚洲欧美日韩精品综合在线观看 | 亚洲欧洲日本国产| 国产精品一区二区三区观看| 欧美精品v国产精品v日韩精品| 亚洲欧美在线看| 一区二区三区四区五区精品| 一区二区在线看| 国产精品丝袜白浆摸在线| 欧美精品亚洲二区| 久久综合给合久久狠狠色| 亚洲欧美日韩在线高清直播| 一区二区激情小说| 亚洲精品色图| 亚洲精品少妇| 亚洲激情二区| 亚洲国产午夜| 亚洲大胆人体在线| 国语自产偷拍精品视频偷| 国产精品视频一二三| 欧美性久久久| 国产精品久久久久毛片大屁完整版 | 久久亚洲综合色| 亚洲综合99| 亚洲一区二区三区中文字幕在线 | 欧美精品粉嫩高潮一区二区| 另类图片国产| 嫩模写真一区二区三区三州| 久久手机免费观看| 麻豆精品视频| 欧美高清成人| 欧美三级网址| 国产精品免费一区二区三区观看| 欧美图区在线视频| 国产精品一区二区视频| 国产亚洲欧洲| 亚洲国产精品嫩草影院| 亚洲日韩欧美视频| 亚洲一区精品视频| 欧美中文在线视频| 美女露胸一区二区三区| 欧美成人影音| 国产精品久线观看视频| 国产嫩草影院久久久久| 在线观看亚洲一区| 99国产精品国产精品久久| 亚洲午夜在线观看| 久久精品九九| 欧美日韩在线电影| 国产一区二区三区在线播放免费观看| 狠狠色综合网| 日韩亚洲欧美在线观看| 91久久久久久久久| 亚洲一区影音先锋| 嫩草伊人久久精品少妇av杨幂| 欧美日本国产一区| 国产一区999| 亚洲精品日韩综合观看成人91| 亚洲视频在线观看一区| 久久久蜜臀国产一区二区| 欧美日韩成人一区| 国产一区二区久久| aa亚洲婷婷| 蜜桃av一区二区| 国产麻豆精品视频| 亚洲精品久久在线| 欧美一区二区视频网站| 欧美女主播在线| 亚洲成人在线视频网站| 亚洲在线视频网站| 欧美日韩国产精品| 亚洲国产精品传媒在线观看| 午夜欧美精品久久久久久久| 欧美连裤袜在线视频| 黄色精品一二区| 欧美一区二区三区久久精品茉莉花 | 日韩午夜在线| 久热精品视频在线观看| 国产欧美日韩激情| 亚洲一区二区三区免费在线观看| 久久夜色撩人精品| 国产一区二区黄| 久久爱www.| 国产性色一区二区| 亚洲欧洲av一区二区| 欧美日韩精品在线| 亚洲每日更新| 欧美日韩高清在线观看| 亚洲欧洲美洲综合色网| 老司机午夜精品视频| 在线不卡a资源高清| 久久夜色精品国产欧美乱极品 | 国内精品久久久| 欧美一区二区三区在线| 国产精品一二三四| 亚洲欧美另类国产| 国产精品综合久久久| 欧美一级理论性理论a| 国产精品久久久久久久久久免费看| 99在线热播精品免费| 欧美午夜在线观看| 欧美一区观看| 国产一区日韩二区欧美三区| 久久久久久有精品国产| 亚洲第一黄网| 欧美乱大交xxxxx| 亚洲图片在线观看| 国产精品自在在线| 久久久久久久久久码影片| 国产综合在线看| 久久综合狠狠综合久久综青草 | 欧美电影免费观看网站 | 欧美日韩欧美一区二区| 在线亚洲精品| 国产嫩草一区二区三区在线观看| 校园激情久久| 亚洲国产精品一区二区www| 欧美精品三级在线观看| 亚洲视频免费观看| 国产午夜亚洲精品羞羞网站| 另类亚洲自拍| 亚洲在线不卡| 在线视频观看日韩| 国产精品v片在线观看不卡| 久久av资源网站| 亚洲美女福利视频网站| 国产伦理精品不卡| 蜜桃av综合| 亚洲欧美综合一区| 亚洲精品九九| 国产一区视频在线观看免费| 欧美激情精品久久久久| 久久gogo国模裸体人体| 亚洲美女av网站| 国内久久视频| 国产精品腿扒开做爽爽爽挤奶网站| 久久亚洲色图| 亚洲欧美另类在线观看| 亚洲精品日产精品乱码不卡| 国产网站欧美日韩免费精品在线观看 | 久久精品在线观看| 在线一区亚洲| 亚洲福利视频一区二区| 国产欧美日韩激情| 欧美屁股在线| 久久综合伊人77777蜜臀| 午夜国产精品视频免费体验区| 亚洲日本va午夜在线影院| 国产日韩欧美视频在线| 欧美精品久久天天躁| 久久久欧美精品| 久久不射中文字幕| 亚洲欧美日韩综合国产aⅴ| 一本色道综合亚洲| 亚洲精品少妇30p| 亚洲福利视频网站| 黄色精品免费| 尤物网精品视频| 国产一区二区在线免费观看| 国产精品亚洲视频| 国产精品视频99| 国产精品igao视频网网址不卡日韩| 欧美高清视频| 欧美成人综合网站| 欧美成人综合一区| 久久午夜羞羞影院免费观看| 久久久久久穴| 免费在线观看一区二区| 久久乐国产精品| 美女成人午夜| 欧美国产日本在线| 欧美精品亚洲一区二区在线播放| 欧美不卡激情三级在线观看| 欧美xart系列高清| 欧美日韩免费网站| 国产精品日韩一区二区三区| 国产喷白浆一区二区三区| 国产综合av| 亚洲激情另类| 亚洲天堂免费观看| 欧美一区二区在线视频| 久久精品99国产精品酒店日本| 久久久久看片| 欧美日韩不卡一区| 国产精品自拍在线| 亚洲第一视频| 亚洲特级毛片| 久久综合久久久| 欧美视频一区二区三区在线观看| 国产精品久久午夜夜伦鲁鲁| 国产欧美日本| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品ⅴa在线观看h| 国模精品一区二区三区| 亚洲美女在线一区| 新片速递亚洲合集欧美合集|