Я создал мобильное приложение Kotlin для использования Gmail API. Но после входа в систему с учетной записью Google оно не будет автоматически перенаправляться обратно в приложение. Можете ли вы помочь мне с этим?
`Это мой исходный код.
private val SCOPES = setOf(
GmailScopes.GMAIL_LABELS, // メールのラベルを取得する権限
GmailScopes.GMAIL_READONLY, // メールを読み取る権限
GmailScopes.GMAIL_MODIFY, // メールのラベルの修正や送信なども行える権限
)
val APP_STORAGE_ACCESS_REQUEST_CODE: Int = 501 // Any value
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val policy = ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
Log.d("DEBUG","T")
var authBtn = findViewById(R.id.sign_in_button) as Button
authBtn.setOnClickListener(){
runGmailAUth()
}
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
fun getCredentials(
httpTransport: NetHttpTransport,
jsonFactory: GsonFactory,
credentialsFilePath: String = "credentials.json",
tokenDir: String = "tokens"
): Credential? {
// OAuth認証情報の読み込み
val inputStream = getAssets().open(credentialsFilePath)
// json形式の認証情報を読み込む
val clientSecrets: GoogleClientSecrets = GoogleClientSecrets
.load(jsonFactory, InputStreamReader(inputStream))
val appWorkingDirectory = getApplicationInfo().dataDir
val dataDirectory = File(appWorkingDirectory, tokenDir)
// 認証フローの設定をする。
val flow: GoogleAuthorizationCodeFlow = GoogleAuthorizationCodeFlow
.Builder(httpTransport, jsonFactory, clientSecrets, SCOPES)
.setDataStoreFactory(FileDataStoreFactory(dataDirectory)) // トークン保存先ディレクトリの指定
.setAccessType("offline") // web applicationの場合はonline, それ以外はoffline
.build()
Я подозреваю, что ошибка может быть связана с этой строкой кода. Браузер не откроет приложение после полного входа в систему.
val receiver = LocalServerReceiver.Builder().setPort(8888).build()
val ab: AuthorizationCodeInstalledApp =
object : AuthorizationCodeInstalledApp(flow, receiver) {
@Throws(IOException::class)
override fun onAuthorization(authorizationUrl: AuthorizationCodeRequestUrl) {
val url = authorizationUrl.build()
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(browserIntent)
}
}
return ab.authorize("user").setAccessToken("user")
}
fun runGmailAUth() {
val jsonFactory: GsonFactory = GsonFactory.getDefaultInstance()
Log.d("TAG", "runGmailAuth() Function")
// Googleが提供するHTTPクライアントを生成(これは、通常のNetHttpTransportにGoogle API用のルート証明書が埋め込まれていたりするようです。)
val httpTransport = GoogleNetHttpTransport.newTrustedTransport()
val credential = getCredentials(httpTransport, jsonFactory, "credentials.json")
// Gmail serviceを作成。Gmailの各種操作には以降このserviceを使用します。
val service: Gmail = Gmail.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("kotlin-gmail-reader")
.build()
readMailAndRemoveUnread(service) // 下で実装します
}
fun readMailAndRemoveUnread(service: Gmail) {
// code to send mail.
}
data class MailMessage(val date: String, val from: String, val subject: String, val body: String)
Подробнее здесь: https://stackoverflow.com/questions/790 ... le-account