如何在Android Studio中使用Gmail API?
在Android Studio中集成Gmail API的分步指南
1. Google Cloud平台前期配置
- 登录Google Cloud控制台,创建新项目
- 搜索并启用Gmail API
- 创建OAuth 2.0客户端ID:选择「安卓应用」类型,填写你的应用包名和SHA-1指纹(Android Studio可通过
Gradle -> Tasks -> android -> signingReport获取指纹) - 下载生成的
google-services.json文件,放到安卓项目的app目录下
2. 项目依赖配置
在Module级别的app/build.gradle的dependencies块中添加以下依赖:
implementation 'com.google.android.gms:play-services-auth:20.7.0' implementation 'com.google.apis:google-api-services-gmail:v1-rev20240105-2.0.0' implementation 'com.google.oauth-client:google-oauth-client-android:1.34.1'
同步Gradle完成依赖下载
3. 实现OAuth授权流程
授权工具类
创建GmailAuthHelper类处理账号登录和授权逻辑:
import android.content.Context; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInClient; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.api.Scope; import com.google.api.services.gmail.GmailScopes; public class GmailAuthHelper { public static final String[] GMAIL_SCOPES = {GmailScopes.GMAIL_READONLY, GmailScopes.GMAIL_SEND}; public static GoogleSignInClient getSignInClient(Context context) { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(GmailScopes.GMAIL_READONLY)) .requestScopes(new Scope(GmailScopes.GMAIL_SEND)) .requestEmail() .build(); return GoogleSignIn.getClient(context, gso); } public static boolean isSignedIn(Context context) { GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(context); return account != null; } }
Activity中处理登录请求
import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInClient; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.tasks.Task; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final int RC_SIGN_IN = 1001; private GoogleSignInClient mSignInClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSignInClient = GmailAuthHelper.getSignInClient(this); findViewById(R.id.btn_sign_in).setOnClickListener(v -> signIn()); } private void signIn() { Intent signInIntent = mSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } } private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // 授权成功,调用Gmail API获取数据 fetchGmailMessages(account); } catch (ApiException e) { Log.w("GmailAuth", "登录失败,错误码:" + e.getStatusCode()); } } }
4. 调用Gmail API获取邮件数据
在MainActivity中添加获取收件箱邮件的方法:
import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListMessagesResponse; import com.google.api.services.gmail.model.Message; import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import java.io.IOException; private void fetchGmailMessages(GoogleSignInAccount account) { new AsyncTask<Void, Void, List<String>>() { @Override protected List<String> doInBackground(Void... voids) { List<String> messageTitles = new ArrayList<>(); try { GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2( getApplicationContext(), Arrays.asList(GmailAuthHelper.GMAIL_SCOPES)) .setSelectedAccount(account.getAccount()); Gmail gmailService = new Gmail.Builder(AndroidHttp.newCompatibleTransport(), JacksonFactory.getDefaultInstance(), credential) .setApplicationName("你的应用名称") .build(); // 获取收件箱前10封邮件的标题 ListMessagesResponse response = gmailService.users().messages().list("me") .setLabelIds(Collections.singletonList("INBOX")) .setMaxResults(10L) .execute(); if (response.getMessages() != null) { for (Message message : response.getMessages()) { Message fullMessage = gmailService.users().messages().get("me", message.getId()) .setFormat("METADATA") .setMetadataHeaders(Collections.singletonList("Subject")) .execute(); String subject = fullMessage.getPayload().getHeaders().get(0).getValue(); messageTitles.add(subject); } } } catch (IOException e) { e.printStackTrace(); } return messageTitles; } @Override protected void onPostExecute(List<String> messageTitles) { // 更新UI展示邮件标题 StringBuilder sb = new StringBuilder(); for (String title : messageTitles) { sb.append(title).append("\n"); } ((TextView) findViewById(R.id.tv_messages)).setText(sb.toString()); } }.execute(); }
5. 关键注意事项
- 网络权限:在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET" /> - 权限范围:根据实际需求申请Scope,避免申请多余权限(比如仅需读邮件就不要申请发送权限)
- 线程处理:所有Gmail API调用必须在子线程执行,示例中用了
AsyncTask,也可替换为Coroutines或RxJava - 测试验证:确保Cloud控制台配置的SHA-1指纹和包名与本地项目完全一致,使用真实Google账号测试
内容的提问来源于stack exchange,提问作者Riiko
相关产品推荐
相关产品推荐

