{"id":700,"date":"2023-10-15T15:16:24","date_gmt":"2023-05-05T00:58:39","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/index.php\/2023\/11\/30\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/"},"modified":"2025-08-03T03:45:02","modified_gmt":"2025-08-02T19:45:02","slug":"%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/","title":{"rendered":"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd"},"content":{"rendered":"<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u8ba8\u8bba\u667a\u80fd\u9501\u5b9a\u529f\u80fd\uff0c\u5e76\u5c06\u5176\u5e94\u7528\u4e8e\u6211\u4eec\u7684Android\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h2>Google\u667a\u80fd\u9501<\/h2>\n<p>Google\u667a\u80fd\u9501\u7528\u4e8e\u81ea\u52a8\u767b\u5f55\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ea\u9700\u4fdd\u5b58\u4e00\u6b21\u51ed\u636e\u3002\u8fd9\u610f\u5473\u7740\uff0c\u5982\u679c\u60a8\u5728\u4e00\u6bb5\u65f6\u95f4\u540e\u91cd\u65b0\u5b89\u88c5\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ea\u8981\u60a8\u6ca1\u6709\u4eceChrome\u5bc6\u7801\u4e2d\u5220\u9664\u5b83\u4eec\uff0c\u60a8\u5c31\u53ef\u4ee5\u4f7f\u7528\u5148\u524d\u4fdd\u5b58\u7684\u51ed\u636e\u81ea\u52a8\u767b\u5f55\u3002<\/p>\n<p>\u8c37\u6b4c\u667a\u80fd\u9501\u901a\u8fc7\u4e00\u6b21\u8f7b\u89e6\u5373\u53ef\u767b\u5f55\u3002<\/p>\n<p>\u4e3a\u4e86\u5728\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\u96c6\u6210\u667a\u80fd\u9501\uff0c\u60a8\u9700\u8981\u4f7f\u7528\u51ed\u636eAPI\u3002\u51ed\u636eAPI\u5141\u8bb8\u7528\u6237\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u5728\u6253\u5f00\u5e94\u7528\u7a0b\u5e8f\u65f6\u8bf7\u6c42\u51ed\u636e\u3002<\/li>\n<li>\u4ece\u767b\u5f55\u8868\u5355\u4fdd\u5b58\u51ed\u636e\u3002<\/li>\n<li>\u5728\u5e94\u7528\u7a0b\u5e8f\u548c\u7f51\u7ad9\u4e4b\u95f4\u540c\u6b65\u51ed\u636e\u3002<\/li>\n<li>\u663e\u793a\u7535\u5b50\u90ae\u4ef6\u63d0\u793a\uff0c\u4ee5\u4fbf\u5728\u767b\u5f55\/\u6ce8\u518c\u8fc7\u7a0b\u4e2d\u5e2e\u52a9\u7528\u6237\u3002<\/li>\n<\/ul>\n<p>\u4e3a\u4e86\u5728\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528Google\u667a\u80fd\u9501\uff0c\u60a8\u9700\u8981\u6dfb\u52a0\u4ee5\u4e0b\u4f9d\u8d56\u9879\uff1a<\/p>\n<pre class=\"post-pre\"><code>dependencies {\r\n    implementation 'com.google.android.gms:play-services-auth:16.0.0'\r\n}\r\n<\/code><\/pre>\n<p>SmartLock\u5728\u60a8\u7684Android\u5e94\u7528\u7a0b\u5e8f\u4e2d\u9700\u8981\u8bbe\u7f6eGoogleApiClient\u3002\u53ea\u6709\u4e00\u4e2a\u51ed\u8bc1\u65f6\uff0cSmartLock\u5141\u8bb8\u81ea\u52a8\u767b\u5f55\u3002\u5982\u679c\u5b58\u5728\u591a\u4e2a\u51ed\u8bc1\uff0c\u5219\u4f1a\u5728\u5bf9\u8bdd\u6846\u4e2d\u663e\u793a\u5b83\u4eec\u3002<\/p>\n<p>\u4e4b\u524d\u6211\u4eec\u4e60\u60ef\u4e8e\u4f7f\u7528SharedPreferences\u6765\u81ea\u52a8\u767b\u5f55\u5e76\u672c\u5730\u4fdd\u5b58\u51ed\u636e\u3002\u73b0\u5728\u6709\u4e86Google\u667a\u80fd\u9501\u5b9a\uff0c\u4e00\u5207\u90fd\u7531Google\u670d\u52a1\u5668\u5904\u7406\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u51ed\u8bc1API\u4e2d\u7684\u4e3b\u8981\u65b9\u6cd5\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>save(GoogleApiClient client, Credential credential) &#8211; \u4fdd\u5b58\u51ed\u636e<\/li>\n<li>request(GoogleApiClient client, CredentialRequest request) &#8211; \u8bf7\u6c42\u4e3a\u5e94\u7528\u7a0b\u5e8f\u4fdd\u5b58\u7684\u6240\u6709\u51ed\u636e<\/li>\n<li>getHintPickerIntent(GoogleApiClient client, HintRequest request) &#8211; \u663e\u793a\u60a8\u5df2\u767b\u5f55\u7684\u5e10\u6237\u5217\u8868\uff0c\u4ee5\u4fbf\u5feb\u901f\u586b\u5199\u767b\u5f55\u8868\u5355<\/li>\n<li>disableAutoSignIn(GoogleApiClient client) &#8211; \u7981\u7528\u81ea\u52a8\u767b\u5f55<\/li>\n<li>delete(GoogleApiClient client, Credential credential) &#8211; \u5220\u9664\u51ed\u636e<\/li>\n<\/ul>\n<p>\u60a8\u53ef\u4ee5\u901a\u8fc7\u8bbf\u95ee passwords.google.com \u67e5\u770b\u4fdd\u5b58\u5728Google\u8d26\u6237\u4e2d\u7684\u6240\u6709\u51ed\u636e\u3002\u5bf9\u4e8e\u5177\u6709\u667a\u80fd\u9501\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u767b\u5f55\u5c4f\u5e55\u4ee3\u7801\u9700\u8981\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u7ed3\u6784\u5316\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u68c0\u67e5\u51ed\u636e\u3002\u5982\u679c\u5b58\u5728\u5355\u4e2a\u51ed\u636e\uff0c\u5219\u81ea\u52a8\u767b\u5f55\u6216\u81ea\u52a8\u586b\u5145\u767b\u5f55\u8868\u5355\u3002<\/li>\n<li>\u5982\u679c\u6709\u591a\u4e2a\u51ed\u636e\uff0c\u5219\u5728\u5bf9\u8bdd\u6846\u4e2d\u663e\u793a\u5b83\u4eec\uff0c\u8ba9\u7528\u6237\u9009\u62e9\u3002<\/li>\n<li>\u5982\u679c\u6ca1\u6709\u4fdd\u5b58\u7684\u51ed\u636e\uff0c\u60a8\u53ef\u4ee5\u8ba9\u7528\u6237\u586b\u5199\u8868\u5355\uff0c\u6216\u8005\u901a\u8fc7\u81ea\u52a8\u586b\u5145\u6216\u663e\u793a\u5305\u542b\u53ef\u7528\u767b\u5f55\u5e10\u6237\u7684\u63d0\u793a\u5bf9\u8bdd\u6846\u6765\u7b80\u5316\u64cd\u4f5c\u3002<\/li>\n<\/ul>\n<h3>\u5f00\u59cb\u5165\u95e8<\/h3>\n<p>\u8ba9\u6211\u4eec\u5f00\u59cb\u5728Android\u5e94\u7528\u4e2d\u5b9e\u73b0\u667a\u80fd\u9501\u529f\u80fd\u3002\u5efa\u7acbGoogleApiClient\u3002<\/p>\n<pre class=\"post-pre\"><code>mGoogleApiClient = new GoogleApiClient.Builder(this)\r\n                .addConnectionCallbacks(this)\r\n                .addApi(Auth.CREDENTIALS_API)\r\n                .enableAutoManage(this, this)\r\n                .build();\r\n<\/code><\/pre>\n<p>\u5b9e\u73b0GoogleApiClient\u63a5\u53e3\u5e76\u5b9e\u73b0\u65b9\u6cd5\u3002\u521d\u59cb\u5316\u51ed\u8bc1\u5ba2\u6237\u7aef\u3002<\/p>\n<pre class=\"post-pre\"><code>CredentialsOptions options = new CredentialsOptions.Builder()\r\n                .forceEnableSaveDialog()\r\n                .build();\r\n\r\n\r\nCredentialsClient mCredentialsApiClient = Credentials.getClient(this, options);\r\n<\/code><\/pre>\n<p>\u9700\u8981\u5728Android Oreo\u53ca\u4ee5\u4e0a\u7248\u672c\u4e2d\u4f7f\u7528forceEnableSaveDialog()\u3002\u521b\u5efaCredentialRequest\u3002<\/p>\n<pre class=\"post-pre\"><code>CredentialRequest mCredentialRequest = new CredentialRequest.Builder()\r\n                .setPasswordLoginSupported(true)\r\n                .setAccountTypes(IdentityProviders.GOOGLE)\r\n                .build();\r\n<\/code><\/pre>\n<p>\u63d0\u53d6\u51ed\u8bc1<\/p>\n<pre class=\"post-pre\"><code>Auth.CredentialsApi.request(mGoogleApiClient, mCredentialRequest).setResultCallback(this);\r\n<\/code><\/pre>\n<p>setResultCallBack\u9700\u8981\u6211\u4eec\u91cd\u5199\u63a5\u53e3ResultCallback\u4e2d\u7684onResult\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code>@Override\r\n    public void onResult(@NonNull CredentialRequestResult credentialRequestResult) {\r\n\r\n        Status status = credentialRequestResult.getStatus();\r\n        if (status.isSuccess()) {\r\n            onCredentialRetrieved(credentialRequestResult.getCredential());\r\n        } else {\r\n            if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {\r\n                try {\r\n                    isResolving = true;\r\n                    status.startResolutionForResult(this, RC_READ);\r\n                } catch (IntentSender.SendIntentException e) {\r\n                    Log.d(TAG, e.toString());\r\n                }\r\n            } else {\r\n\r\n                showHintDialog();\r\n            }\r\n        }\r\n    }\r\n<\/code><\/pre>\n<p>\u6709\u4e09\u79cd\u60c5\u51b5\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u5355\u4e00\u51ed\u8bc1 &#8211; \u6210\u529f &#8211; \u81ea\u52a8\u767b\u5f55<\/li>\n<li>\u591a\u4e2a\u51ed\u8bc1 &#8211; \u89e3\u51b3\u5e76\u5728\u5bf9\u8bdd\u6846\u4e2d\u663e\u793a\u6240\u6709\u53ef\u7528\u51ed\u8bc1<\/li>\n<li>\u6ca1\u6709\u51ed\u636e &#8211; \u663e\u793a\u5305\u542b\u6240\u6709\u53ef\u7528\u767b\u5f55\u5e10\u6237\u7684\u63d0\u793a\u5bf9\u8bdd\u6846<\/li>\n<\/ul>\n<p>\u5f53\u72b6\u6001\u7801\u4e3aRESOLUTION_REQUIRED\u65f6\uff0c\u610f\u5473\u7740\u6709\u591a\u4e2a\u9700\u8981\u89e3\u51b3\u7684\u51ed\u636e\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u8c03\u7528startResolutionForResult\u65b9\u6cd5\uff0c\u5728onActivityResult\u65b9\u6cd5\u4e2d\u8fd4\u56de\u7ed3\u679c\u3002\u6211\u4eec\u4f7f\u7528\u4e00\u4e2a\u5e03\u5c14\u6807\u5fd7\u6765\u9632\u6b62\u591a\u6b21\u89e3\u51b3\u3002\u8fd9\u5c06\u5bfc\u81f4\u5efa\u7acb\u591a\u4e2a\u5bf9\u8bdd\u6846\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u4e86\u89e3\u4e86SmartLock\u529f\u80fd\u7684\u8981\u70b9\uff0c\u8ba9\u6211\u4eec\u5b8c\u6574\u5b9e\u73b0\u5b83\uff0c\u5305\u62ec\u4fdd\u5b58\u548c\u5220\u9664\u51ed\u636e\u7684\u529f\u80fd\u3002<\/p>\n<h3>\u9879\u76ee\u7ed3\u6784<\/h3>\n<h3>\u4ee3\u7801<\/h3>\n<h2>\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501\u5b9e\u73b0\uff08\u7b2c2\u90e8\u5206\uff09<\/h2>\n<p>\u4e0b\u9762\u662factivity_main.xml\u5e03\u5c40\u7684\u4ee3\u7801\uff1a<\/p>\n<pre class=\"post-pre\"><code>\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;android.support.constraint.ConstraintLayout xmlns:android=\"https:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"https:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"https:\/\/schemas.android.com\/tools\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    android:importantForAutofill=\"noExcludeDescendants\"&gt;\r\n\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/btnLogin\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginLeft=\"8dp\"\r\n        android:layout_marginRight=\"8dp\"\r\n        android:layout_marginTop=\"24dp\"\r\n        android:text=\"\u767b\u5f55\"\r\n        app:layout_constraintLeft_toLeftOf=\"parent\"\r\n        app:layout_constraintRight_toRightOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/inPassword\" \/&gt;\r\n\r\n    &lt;EditText\r\n        android:id=\"@+id\/inEmail\"\r\n        android:layout_width=\"0dp\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginLeft=\"16dp\"\r\n        android:layout_marginRight=\"16dp\"\r\n        android:layout_marginTop=\"32dp\"\r\n        android:ems=\"10\"\r\n        android:hint=\"\u90ae\u7bb1\"\r\n        android:inputType=\"textEmailAddress\"\r\n        app:layout_constraintHorizontal_bias=\"0.503\"\r\n        app:layout_constraintLeft_toLeftOf=\"parent\"\r\n        app:layout_constraintRight_toRightOf=\"parent\" \/&gt;\r\n\r\n\r\n    &lt;EditText\r\n        android:id=\"@+id\/inPassword\"\r\n        android:layout_width=\"0dp\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginLeft=\"16dp\"\r\n        android:layout_marginRight=\"16dp\"\r\n        android:layout_marginTop=\"8dp\"\r\n        android:ems=\"10\"\r\n        android:hint=\"\u5bc6\u7801\"\r\n        android:inputType=\"textPassword\"\r\n        app:layout_constraintLeft_toLeftOf=\"parent\"\r\n        app:layout_constraintRight_toRightOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/inEmail\" \/&gt;\r\n\r\n\r\n&lt;\/android.support.constraint.ConstraintLayout&gt;\r\n<\/code><\/pre>\n<p>android:importantForAutofill=&#8221;noExcludeDescendants&#8221;\u8868\u793a\u7528\u4e8e\u7981\u7528EditText\u5b57\u6bb5\u4e0a\u7684\u81ea\u52a8\u586b\u5145\u3002\u5173\u4e8e\u81ea\u52a8\u586b\u5145API\u7684\u8ba8\u8bba\u5c06\u5728\u53e6\u4e00\u4e2a\u6559\u7a0b\u4e2d\u8fdb\u884c\u3002\u4e0b\u9762\u662fMainActivity.java\u7c7b\u7684\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.androidgooglesmartlock;\r\n\r\nimport android.app.PendingIntent;\r\nimport android.content.Intent;\r\nimport android.content.IntentSender;\r\nimport android.support.annotation.NonNull;\r\nimport android.support.annotation.Nullable;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.os.Bundle;\r\nimport android.text.TextUtils;\r\nimport android.util.Log;\r\nimport android.util.Patterns;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\nimport android.widget.Toast;\r\n\r\nimport com.google.android.gms.auth.api.Auth;\r\nimport com.google.android.gms.auth.api.credentials.Credential;\r\nimport com.google.android.gms.auth.api.credentials.CredentialPickerConfig;\r\nimport com.google.android.gms.auth.api.credentials.CredentialRequest;\r\nimport com.google.android.gms.auth.api.credentials.CredentialRequestResponse;\r\nimport com.google.android.gms.auth.api.credentials.CredentialRequestResult;\r\nimport com.google.android.gms.auth.api.credentials.Credentials;\r\nimport com.google.android.gms.auth.api.credentials.CredentialsClient;\r\nimport com.google.android.gms.auth.api.credentials.CredentialsOptions;\r\nimport com.google.android.gms.auth.api.credentials.HintRequest;\r\nimport com.google.android.gms.auth.api.credentials.IdentityProviders;\r\nimport com.google.android.gms.auth.api.signin.GoogleSignIn;\r\nimport com.google.android.gms.auth.api.signin.GoogleSignInAccount;\r\nimport com.google.android.gms.auth.api.signin.GoogleSignInClient;\r\nimport com.google.android.gms.auth.api.signin.GoogleSignInOptions;\r\nimport com.google.android.gms.common.ConnectionResult;\r\nimport com.google.android.gms.common.api.ApiException;\r\nimport com.google.android.gms.common.api.CommonStatusCodes;\r\nimport com.google.android.gms.common.api.GoogleApiClient;\r\nimport com.google.android.gms.common.api.ResolvableApiException;\r\nimport com.google.android.gms.common.api.ResultCallback;\r\nimport com.google.android.gms.common.api.Status;\r\nimport com.google.android.gms.tasks.OnCompleteListener;\r\nimport com.google.android.gms.tasks.Task;\r\n\r\nimport java.util.regex.Pattern;\r\n\r\npublic class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback&lt;CredentialRequestResult&gt; {\r\n\r\n    private GoogleApiClient mGoogleApiClient;\r\n    CredentialsClient mCredentialsApiClient;\r\n    CredentialRequest mCredentialRequest;\r\n    public static final String TAG = \"API123\";\r\n    private static final int RC_READ = 3;\r\n    private static final int RC_SAVE = 1;\r\n    private static final int RC_HINT = 2;\r\n    boolean isResolving;\r\n\r\n    Button btnLogin;\r\n    EditText inEmail, inPassword;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n\r\n        setUpGoogleApiClient();\r\n\r\n        \/\/ Android Oreo\u7cfb\u7edf\u9700\u8981\r\n        CredentialsOptions options = new CredentialsOptions.Builder()\r\n                .forceEnableSaveDialog()\r\n                .build();\r\n\r\n\r\n        mCredentialsApiClient = Credentials.getClient(this, options);\r\n        createCredentialRequest();\r\n\r\n        btnLogin = findViewById(R.id.btnLogin);\r\n        inEmail = findViewById(R.id.inEmail);\r\n        inPassword = findViewById(R.id.inPassword);\r\n\r\n        btnLogin.setOnClickListener(new View.OnClickListener() {\r\n            @Override\r\n            public void onClick(View view) {\r\n\r\n                String email = inEmail.getText().toString();\r\n                String password = inPassword.getText().toString();\r\n                if (TextUtils.isEmpty(email) || TextUtils.isEmpty(password) || !Patterns.EMAIL_ADDRESS.matcher(email).matches())\r\n                    showToast(\"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u90ae\u7bb1\u548c\u5bc6\u7801\");\r\n\r\n                else {\r\n\r\n                    Credential credential = new Credential.Builder(email)\r\n                            .setPassword(password)\r\n                            .build();\r\n\r\n                    saveCredentials(credential);\r\n                }\r\n\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ \u8bbe\u7f6eGoogle API\u5ba2\u6237\u7aef\r\n    public void setUpGoogleApiClient() {\r\n\r\n\r\n        mGoogleApiClient = new GoogleApiClient.Builder(this)\r\n                .addConnectionCallbacks(this)\r\n                .addApi(Auth.CREDENTIALS_API)\r\n                .enableAutoManage(this, this)\r\n                .build();\r\n    }\r\n\r\n    \/\/ \u521b\u5efa\u51ed\u636e\u8bf7\u6c42\r\n    public void createCredentialRequest() {\r\n        mCredentialRequest = new CredentialRequest.Builder()\r\n                .setPasswordLoginSupported(true)\r\n                .setAccountTypes(IdentityProviders.GOOGLE)\r\n                .build();\r\n    }\r\n\r\n    \/\/ \u8bf7\u6c42\u51ed\u636e\r\n    public void requestCredentials() {\r\n        Auth.CredentialsApi.request(mGoogleApiClient, mCredentialRequest).setResultCallback(this);\r\n    }\r\n\r\n\r\n    \/\/ \u5f53\u51ed\u636e\u88ab\u68c0\u7d22\u5230\u65f6\u8c03\u7528\r\n    private void onCredentialRetrieved(Credential credential) {\r\n        String accountType = credential.getAccountType();\r\n        if (accountType == null) {\r\n            \/\/ \u4f7f\u7528\u51ed\u636e\u4e2d\u7684\u4fe1\u606f\u767b\u5f55\u7528\u6237\r\n            gotoNext();\r\n        } else if (accountType.equals(IdentityProviders.GOOGLE)) {\r\n\r\n\r\n            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\r\n                    .requestEmail()\r\n                    .build();\r\n\r\n            GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);\r\n            Task&lt;GoogleSignInAccount&gt; task = signInClient.silentSignIn();\r\n\r\n            task.addOnCompleteListener(new OnCompleteListener&lt;GoogleSignInAccount&gt;() {\r\n                @Override\r\n                public void onComplete(@NonNull Task&lt;GoogleSignInAccount&gt; task) {\r\n                    if (task.isSuccessful()) {\r\n                        \/\/ \u53c2\u89c1\"\u5904\u7406\u6210\u529f\u7684\u51ed\u636e\u8bf7\u6c42\"\r\n                        populateLoginFields(task.getResult().getEmail(), null);\r\n                    } else {\r\n                        showToast(\"\u65e0\u6cd5\u8fdb\u884c\u8c37\u6b4c\u767b\u5f55\");\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n\r\n    \/\/ \u8df3\u8f6c\u5230\u4e0b\u4e00\u4e2a\u6d3b\u52a8\r\n    public void gotoNext() {\r\n        startActivity(new Intent(this, SecondActivity.class));\r\n        finish();\r\n    }\r\n\r\n\r\n    \/\/ \u663e\u793a\u63d0\u793a\u4fe1\u606f\r\n    public void showToast(String s) {\r\n        Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();\r\n    }\r\n\r\n\r\n    @Override\r\n    public void onConnected(@Nullable Bundle bundle) {\r\n        Log.d(\"API123\", \"\u5df2\u8fde\u63a5\");\r\n        requestCredentials();\r\n\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionSuspended(int i) {\r\n\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {\r\n\r\n    }\r\n\r\n    @Override\r\n    protected void onDestroy() {\r\n        mGoogleApiClient.disconnect();\r\n        super.onDestroy();\r\n    }\r\n\r\n    @Override\r\n    public void onResult(@NonNull CredentialRequestResult credentialRequestResult) {\r\n\r\n        Status status = credentialRequestResult.getStatus();\r\n        if (status.isSuccess()) {\r\n            onCredentialRetrieved(credentialRequestResult.getCredential());\r\n        } else {\r\n            if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {\r\n                try {\r\n                    isResolving = true;\r\n                    status.startResolutionForResult(this, RC_READ);\r\n                } catch (IntentSender.SendIntentException e) {\r\n                    Log.d(TAG, e.toString());\r\n                }\r\n            } else {\r\n\r\n                showHintDialog();\r\n            }\r\n        }\r\n    }\r\n\r\n    @Override\r\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r\n        super.onActivityResult(requestCode, resultCode, data);\r\n\r\n        Log.d(TAG, \"\u6d3b\u52a8\u7ed3\u679c\");\r\n        if (requestCode == RC_READ) {\r\n            if (resultCode == RESULT_OK) {\r\n                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);\r\n                onCredentialRetrieved(credential);\r\n            } else {\r\n                Log.d(TAG, \"\u8bf7\u6c42\u5931\u8d25\");\r\n            }\r\n            isResolving = false;\r\n        }\r\n\r\n        if (requestCode == RC_HINT) {\r\n            if (resultCode == RESULT_OK) {\r\n                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);\r\n                populateLoginFields(credential.getId(), \"\");\r\n            } else {\r\n                showToast(\"\u63d0\u793a\u5bf9\u8bdd\u6846\u5df2\u5173\u95ed\");\r\n            }\r\n        }\r\n\r\n        if (requestCode == RC_SAVE) {\r\n            if (resultCode == RESULT_OK) {\r\n                Log.d(TAG, \"\u4fdd\u5b58: \u6210\u529f\");\r\n                gotoNext();\r\n                showToast(\"\u51ed\u636e\u5df2\u4fdd\u5b58\");\r\n            }\r\n        }\r\n\r\n\r\n    }\r\n\r\n    \/\/ \u586b\u5145\u767b\u5f55\u5b57\u6bb5\r\n    public void populateLoginFields(String email, String password) {\r\n        if (!TextUtils.isEmpty(email))\r\n            inEmail.setText(email);\r\n\r\n        if (!TextUtils.isEmpty(password))\r\n            inPassword.setText(password);\r\n    }\r\n\r\n    \/\/ \u663e\u793a\u63d0\u793a\u5bf9\u8bdd\u6846\r\n    public void showHintDialog() {\r\n        HintRequest hintRequest = new HintRequest.Builder()\r\n                .setHintPickerConfig(new CredentialPickerConfig.Builder()\r\n                        .setShowCancelButton(true)\r\n                        .build())\r\n                .setEmailAddressIdentifierSupported(true)\r\n                .setAccountTypes(IdentityProviders.GOOGLE)\r\n                .build();\r\n\r\n        PendingIntent intent = mCredentialsApiClient.getHintPickerIntent(hintRequest);\r\n        try {\r\n            startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);\r\n        } catch (IntentSender.SendIntentException e) {\r\n            Log.e(TAG, \"\u65e0\u6cd5\u542f\u52a8\u63d0\u793a\u9009\u62e9\u5668\u610f\u56fe\", e);\r\n        }\r\n    }\r\n\r\n    \/\/ \u4fdd\u5b58\u51ed\u636e\r\n    public void saveCredentials(Credential credential) {\r\n\r\n\r\n        mCredentialsApiClient.save(credential).addOnCompleteListener(new OnCompleteListener&lt;Void&gt;() {\r\n            @Override\r\n            public void onComplete(@NonNull Task&lt;Void&gt; task) {\r\n                if (task.isSuccessful()) {\r\n                    Log.d(TAG, \"\u4fdd\u5b58: \u6210\u529f\");\r\n                    showToast(\"\u51ed\u636e\u5df2\u4fdd\u5b58\");\r\n                    return;\r\n                }\r\n\r\n                Exception e = task.getException();\r\n                if (e instanceof ResolvableApiException) {\r\n                    \/\/ \u5c1d\u8bd5\u89e3\u51b3\u4fdd\u5b58\u8bf7\u6c42\u3002\u5982\u679c\u51ed\u636e\u662f\u65b0\u7684\uff0c\u8fd9\u5c06\u63d0\u793a\u7528\u6237\u3002\r\n                    ResolvableApiException rae = (ResolvableApiException) e;\r\n                    try {\r\n                        rae.startResolutionForResult(MainActivity.this, RC_SAVE);\r\n                    } catch (IntentSender.SendIntentException f) {\r\n                        \/\/ \u65e0\u6cd5\u89e3\u51b3\u8bf7\u6c42\r\n                        Log.e(TAG, \"\u53d1\u9001\u89e3\u51b3\u65b9\u6848\u5931\u8d25\u3002\", f);\r\n                        showToast(\"\u4fdd\u5b58\u5931\u8d25\");\r\n                    }\r\n                } else {\r\n                    \/\/ \u8bf7\u6c42\u6ca1\u6709\u89e3\u51b3\u65b9\u6848\r\n                    showToast(\"\u4fdd\u5b58\u5931\u8d25\");\r\n                }\r\n            }\r\n        });\r\n\r\n    }\r\n}\r\n\r\n<\/code><\/pre>\n<p>\u5728onConnected\u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u8bf7\u6c42\u53ef\u7528\u7684\u51ed\u636e\u3002\u8fd9\u610f\u5473\u7740\u4e00\u65e6\u542f\u52a8\u6d3b\u52a8\uff0c\u5982\u679c\u6709\u4efb\u4f55\u51ed\u636e\uff0c\u5219\u4f1a\u68c0\u7d22\u5230\u3002\u5982\u679c\u6709\u4e00\u4e2a\u51ed\u636e\uff0c\u5b83\u5c06\u81ea\u52a8\u767b\u5f55\u5e76\u8f6c\u5230\u4e0b\u4e00\u4e2a\u6d3b\u52a8\u3002\u4ee5\u4e0b\u662factivity_second.xml\u5e03\u5c40\u7684\u4ee3\u7801\uff1a<\/p>\n<pre class=\"post-pre\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;android.support.constraint.ConstraintLayout xmlns:android=\"https:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"https:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"https:\/\/schemas.android.com\/tools\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    tools:context=\".SecondActivity\"&gt;\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/btnDeleteAccount\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"8dp\"\r\n        android:text=\"\u5220\u9664\u8d26\u6237\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/btnSignOut\" \/&gt;\r\n\r\n    &lt;TextView\r\n        android:id=\"@+id\/textView\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:text=\"\u60a8\u5df2\u767b\u5f55\u3002\"\r\n        app:layout_constraintBottom_toBottomOf=\"parent\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/btnSignOut\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"8dp\"\r\n        android:text=\"\u9000\u51fa\u767b\u5f55\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/textView\" \/&gt;\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/btnSignOutDisableAutoSign\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:text=\"\u9000\u51fa\u767b\u5f55\u5e76\u7981\u7528\u81ea\u52a8\u767b\u5f55\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/btnDeleteAccount\" \/&gt;\r\n&lt;\/android.support.constraint.ConstraintLayout&gt;\r\n<\/code><\/pre>\n<p>\u5728SecondActivity\u4e2d\uff0c\u6211\u4eec\u5c06\u6267\u884c\u4e09\u4e2a\u4e0d\u540c\u7684\u64cd\u4f5c &#8211; \u9000\u51fa\u767b\u5f55\u3001\u9000\u51fa\u767b\u5f55\u5e76\u7981\u7528\u4e0b\u6b21\u81ea\u52a8\u767b\u5f55\u3001\u5220\u9664\u51ed\u636e\u3002\u4e0b\u9762\u662fSecondActivity.java\u7c7b\u7684\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code>package com.Olivia.androidgooglesmartlock;\r\n\r\nimport android.content.Intent;\r\nimport android.content.IntentSender;\r\nimport android.support.annotation.NonNull;\r\nimport android.support.annotation.Nullable;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.os.Bundle;\r\nimport android.util.Log;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.Toast;\r\n\r\nimport com.google.android.gms.auth.api.Auth;\r\nimport com.google.android.gms.auth.api.credentials.Credential;\r\nimport com.google.android.gms.auth.api.credentials.CredentialRequest;\r\nimport com.google.android.gms.auth.api.credentials.CredentialRequestResult;\r\nimport com.google.android.gms.auth.api.credentials.Credentials;\r\nimport com.google.android.gms.auth.api.credentials.CredentialsClient;\r\nimport com.google.android.gms.common.ConnectionResult;\r\nimport com.google.android.gms.common.api.GoogleApiClient;\r\nimport com.google.android.gms.common.api.ResultCallback;\r\nimport com.google.android.gms.common.api.Status;\r\n\r\npublic class SecondActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback&lt;CredentialRequestResult&gt; {\r\n\r\n\r\n    Button btnSignOut, btnSignOutDisableAuto, btnDelete;\r\n    private GoogleApiClient mGoogleApiClient;\r\n    CredentialsClient mCredentialsApiClient;\r\n    CredentialRequest mCredentialRequest;\r\n    public static final String TAG = \"API123\";\r\n    private static final int RC_REQUEST = 4;\r\n\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_second);\r\n\r\n        setUpGoogleApiClient();\r\n        mCredentialsApiClient = Credentials.getClient(this);\r\n\r\n\r\n        btnSignOut = findViewById(R.id.btnSignOut);\r\n        btnSignOutDisableAuto = findViewById(R.id.btnSignOutDisableAutoSign);\r\n        btnDelete = findViewById(R.id.btnDeleteAccount);\r\n\r\n        btnSignOut.setOnClickListener(this);\r\n        btnSignOutDisableAuto.setOnClickListener(this);\r\n        btnDelete.setOnClickListener(this);\r\n    }\r\n\r\n    @Override\r\n    public void onClick(View view) {\r\n        switch (view.getId()) {\r\n            case R.id.btnSignOut:\r\n                signOut(false);\r\n                break;\r\n            case R.id.btnSignOutDisableAutoSign:\r\n                signOut(true);\r\n                break;\r\n            case R.id.btnDeleteAccount:\r\n                requestCredentials();\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void onConnected(@Nullable Bundle bundle) {\r\n\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionSuspended(int i) {\r\n\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {\r\n\r\n    }\r\n\r\n    @Override\r\n    public void onResult(@NonNull CredentialRequestResult credentialRequestResult) {\r\n\r\n        Status status = credentialRequestResult.getStatus();\r\n        if (status.isSuccess()) {\r\n            onCredentialSuccess(credentialRequestResult.getCredential());\r\n        } else {\r\n            if (status.hasResolution()) {\r\n                try {\r\n                    status.startResolutionForResult(this, RC_REQUEST);\r\n                } catch (IntentSender.SendIntentException e) {\r\n                    Log.d(TAG, e.toString());\r\n                }\r\n            } else {\r\n                showToast(\"\u8bf7\u6c42\u5931\u8d25\");\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/ \u8bbe\u7f6eGoogle API\u5ba2\u6237\u7aef\r\n    public void setUpGoogleApiClient() {\r\n\r\n        mGoogleApiClient = new GoogleApiClient.Builder(this)\r\n                .addConnectionCallbacks(this)\r\n                .addApi(Auth.CREDENTIALS_API)\r\n                .enableAutoManage(this, this)\r\n                .build();\r\n    }\r\n\r\n\r\n    \/\/ \u8bf7\u6c42\u51ed\u636e\r\n    private void requestCredentials() {\r\n        mCredentialRequest = new CredentialRequest.Builder()\r\n                .setPasswordLoginSupported(true)\r\n                .build();\r\n\r\n        Auth.CredentialsApi.request(mGoogleApiClient, mCredentialRequest).setResultCallback(this);\r\n    }\r\n\r\n\r\n    @Override\r\n    protected void onDestroy() {\r\n        mGoogleApiClient.disconnect();\r\n        super.onDestroy();\r\n    }\r\n\r\n    \/\/ \u51ed\u636e\u6210\u529f\u5904\u7406\r\n    private void onCredentialSuccess(Credential credential) {\r\n\r\n        Auth.CredentialsApi.delete(mGoogleApiClient, credential).setResultCallback(new ResultCallback&lt;Status&gt;() {\r\n            @Override\r\n            public void onResult(@NonNull Status status) {\r\n                if (status.isSuccess()) {\r\n                    signOut(false);\r\n                } else {\r\n                    showToast(\"\u8d26\u6237\u5220\u9664\u5931\u8d25\");\r\n                }\r\n            }\r\n        });\r\n\r\n\r\n    }\r\n\r\n    @Override\r\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r\n        super.onActivityResult(requestCode, resultCode, data);\r\n        if (requestCode == RC_REQUEST) {\r\n            if (resultCode == RESULT_OK) {\r\n                showToast(\"\u5df2\u5220\u9664\");\r\n                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);\r\n                onCredentialSuccess(credential);\r\n            } else {\r\n                Log.d(TAG, \"\u8bf7\u6c42\u5931\u8d25\");\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/ \u663e\u793a\u63d0\u793a\u4fe1\u606f\r\n    public void showToast(String s) {\r\n        Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();\r\n    }\r\n\r\n    \/\/ \u9000\u51fa\u767b\u5f55\r\n    private void signOut(boolean disableAutoSignIn) {\r\n\r\n        if (disableAutoSignIn)\r\n            Auth.CredentialsApi.disableAutoSignIn(mGoogleApiClient);\r\n\r\n        startActivity(new Intent(this, MainActivity.class));\r\n        finish();\r\n    }\r\n}\r\n\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u5e94\u7528\u7684\u8f93\u51fa\u5982\u4e0b\uff1a\u6211\u4eec\u521b\u5efa\u4e86\u7b2c\u4e00\u4e2a\u8d26\u6237\uff0c\u5e76\u53d1\u73b0\u6bcf\u6b21\u6253\u5f00\u5e94\u7528\u65f6\uff0c\u5b83\u4f1a\u81ea\u52a8\u767b\u5f55\u3002\u9664\u975e\u6211\u4eec\u7981\u7528\u81ea\u52a8\u767b\u5f55\u3002\u7136\u540e\u5b83\u4f1a\u5728\u767b\u5f55\u4e4b\u524d\u8bf7\u6c42\u6743\u9650\u3002\u6211\u4eec\u53c8\u521b\u5efa\u4e86\u53e6\u4e00\u4e2a\u8d26\u6237\u3002\u8fd9\u6b21\u5f53\u6211\u4eec\u5220\u9664\u5b83\u65f6\uff0c\u5728\u5220\u9664\u540e\u5e94\u7528\u4f1a\u81ea\u52a8\u767b\u5f55\u5230\u7b2c\u4e00\u4e2a\u8d26\u6237\u3002\u6559\u7a0b\u5230\u6b64\u7ed3\u675f\u3002\u53ef\u4ee5\u5728\u4e0b\u9762\u7684\u94fe\u63a5\u4e2d\u4e0b\u8f7d\u8fd9\u4e2a\u9879\u76ee\uff1a<\/p>\n<h3>\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501<\/h3>\n<p><a href=\"#\">GitHub \u9879\u76ee\u94fe\u63a5<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u8ba8\u8bba\u667a\u80fd\u9501\u5b9a\u529f\u80fd\uff0c\u5e76\u5c06\u5176\u5e94\u7528\u4e8e\u6211\u4eec\u7684Android\u5e94\u7528\u7a0b\u5e8f\u3002 Google\u667a\u80fd\u9501 Googl [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[1931,1932,1933,1934,1935],"class_list":["post-700","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-android","tag-google","tag-1933","tag-1934","tag-1935"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd\" \/>\n<meta property=\"og:description\" content=\"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-05T00:58:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-02T19:45:02+00:00\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/\",\"name\":\"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-05-05T00:58:39+00:00\",\"dateModified\":\"2025-08-02T19:45:02+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"description\":\"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd - Blog - Silicon Cloud","description":"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd","og_description":"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5b89\u5353\u8c37\u6b4c\u667a\u80fd\u9501\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-05-05T00:58:39+00:00","article_modified_time":"2025-08-02T19:45:02+00:00","author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/","name":"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-05-05T00:58:39+00:00","dateModified":"2025-08-02T19:45:02+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"description":"\u8be6\u7ec6\u4ecb\u7ecd\u5b89\u5353\u624b\u673a\u4e0aGoogle\u667a\u80fd\u9501\u7684\u8bbe\u7f6e\u65b9\u6cd5\u4e0e\u4f7f\u7528\u6280\u5de7\u3002\u4e86\u89e3\u5982\u4f55\u5229\u7528\u53ef\u4fe1\u4f4d\u7f6e\u3001\u53ef\u4fe1\u8bbe\u5907\u3001\u9762\u90e8\u8bc6\u522b\u7b49\u529f\u80fd\uff0c\u8ba9\u4f60\u7684Android\u8bbe\u5907\u89e3\u9501\u66f4\u4fbf\u6377\u5b89\u5168\u3002\u672c\u6587\u63d0\u4f9b\u6b65\u9aa4\u6e05\u6670\u7684\u64cd\u4f5c\u6307\u5357\uff0c\u5e2e\u52a9\u4f60\u8f7b\u677e\u914d\u7f6e\u8c37\u6b4c\u667a\u80fd\u9501\uff0c\u63d0\u5347\u624b\u673a\u4f7f\u7528\u4f53\u9a8c\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5b89\u5353\u624b\u673aGoogle\u667a\u80fd\u9501\u4f7f\u7528\u6559\u7a0b\uff1a\u8f7b\u677e\u8bbe\u7f6e\u667a\u80fd\u89e3\u9501\u529f\u80fd"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%ae%89%e5%8d%93%e8%b0%b7%e6%ad%8c%e6%99%ba%e8%83%bd%e9%94%81\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=700"}],"version-history":[{"count":4,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/700\/revisions"}],"predecessor-version":[{"id":110522,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/700\/revisions\/110522"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}