从2019年8月开始,GoogleAuthUtil.getToken()已被弃用
步骤如下:
确保在app模块build.gradle
文件中添加以下依赖项:
implementation 'com.google.api-client:google-api-client:1.31.5'
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.31.5'
implementation 'com.google.apis:google-api-services-oauth2:v2-rev157-1.25.0'
将您的OAuth 2.0客户端ID(client_id)添加到项目中。 要生成OAuth 2.0客户端ID,请按照以下步骤操作:
要使用GoogleAuthUtil.getToken()的替代方法获取访问令牌,请使用以下代码:
import android.content.Context;
import android.util.Log;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.oauth2.Oauth2;
import com.google.api.services.oauth2.model.TokenResponse;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String CLIENT_SECRET_FILE = "/client_secret.json";
private static final List<String> SCOPES = Arrays.asList("https://www.googleapis.com/auth/userinfo.profile");
private static final String TOKENS_DIRECTORY_PATH = "tokens";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
try {
String accessToken = getAccessToken();
Log.i("MainActivity", "Access token: " + accessToken);
} catch (Exception e) {
Log.e("MainActivity", "Failed to get access token", e);
}
}
}).start();
}
private String getAccessToken() throws Exception {
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(getAssets().open(CLIENT_SECRET_FILE)));
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(getFilesDir(), FileDataStoreFactory.getDefaultInstance().getDefaultDataStore(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
TokenResponse response = flow.newTokenRequest("YOUR_REFRESH_TOKEN").setRedirectUri("urn:ietf:wg:oauth:2.0:oob").execute();
return response.getAccessToken();
}
}
在这里,替换CLIENT_SECRET_FILE
的值为你的客户端密钥文件名.json。此外,替换YOUR_REFRESH_TOKEN
的值为从Google获取的刷新令牌。
请注意,访问令牌将过期。因此,您需要使用刷新令牌定期刷新访问令牌。要刷新访问令牌,只需使用相同的GoogleAuthorizationCodeFlow
实例调用newTokenRequest().setRefreshToken().execute()
。
现在,在需要访问令牌的地方,您可以使用上面提到的getAccessToken()
方法来获取访问令牌。确保在后台线程上运行这些操作,以避免在主线程上执行网络操作。
领取专属 10元无门槛券
手把手带您无忧上云