Google APIを使用するAndroidアプリケーションを開発しています。そのために、google-play-service-libプロジェクト。
私はこれに従っています link GoogleApiClientオブジェクトを初期化します。
私のコード:
1)onCreate()
メソッドで、GoogleApiClientオブジェクトを作成しています:
_mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API, null)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
_
2)onStart()
で、mGoogleApiClient.connect()
を呼び出します。
3)私のアクティビティはConnectionCallbacksとOnConnectionFailedListener。を実装します
4)onConnectionFailed()
メソッドは次のようになります。
_public void onConnectionFailed(ConnectionResult result) {
//in dubug result looks like : ConnectionResult{
//statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent
// {41f8ca70: Android.os.BinderProxy@41f8ca10}}
try {
if(!mIntentInProgress && result.hasResolution())
{
mIntentInProgress=true;
result.startResolutionForResult(mActivity, RC_SIGN_IN);
}
} catch (SendIntentException e) {
e.printStackTrace();
}
}
_
5)onActivityResult()
メソッドには以下が含まれます。
_if (requestCode == RC_SIGN_IN) {
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
_
アプリを実行すると、内部エラーがポップアップしたことを示すToastが表示されます。 Googleコンソールでプロジェクトを作成しました。
同じ問題がありました。
ドキュメントから:クライアントは、APIを使用せずに続行するか、startResolutionForResult(Activity、int)を呼び出してユーザーにサインインを促すことができます。
したがって、startResolutionForResult()関数を使用してサインインを試みる必要があります
@Override
public void onConnectionFailed(ConnectionResult result) {
if (result.hasResolution()) {
try {
// !!!
result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
} catch (SendIntentException e) {
mPlusClient.connect();
}
}
mConnectionResult = result;
}
グーグルの instructionss に従うだけ
AND[〜#〜] caution [〜#〜]
まだ開発モードになっているので、ゲームを公開する前に、テストメールアドレスをGAME DETAILSセンターに追加したかどうかを確認してください。
Google Play Developer's Consoleにアップロードされたapkにあるキーストアでアプリに署名していることを確認します(テストする場合は、アルファ版としてアップロードし、非公開のまま公開できます)。
そうでない場合、それは他のものかもしれません。アカウントのメールアドレスがアカウント詳細ページ(歯車アイコンのある設定メニュー)のテスターにリストされており、ライセンスされた応答がRESPOND_NORMALLYではなくLICENSEDに設定されていることを確認します。
これがbestの答えかどうかはわかりませんが、うまくいきました。 BasicSamples TakeANumber MainActivityからonConnectionFailed()をコピーしました。 BaseGameUtilsを呼び出して解決します。もちろん、これは、プロジェクトにBaseGameUtilsライブラリが含まれていることを意味します。これは、ワームの別の缶です。ただし、1つの方法でうまくいくかもしれないので、以下にコピーします。
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
logger.info( "onConnectionFailed() *play* : attempting to resolve");
if (mResolvingConnectionFailure) {
logger.info( "onConnectionFailed(): already resolving");
return;
}
if (mSignInClicked || mAutoStartSignInFlow) {
mAutoStartSignInFlow = false;
mSignInClicked = false;
mResolvingConnectionFailure = true;
if (!BaseGameUtils.resolveConnectionFailure(this, mGoogleApiClient, connectionResult,
RC_SIGN_IN, getString(R.string.signin_other_error))) {
mResolvingConnectionFailure = false;
}
}
}
Google BasicSamples BaseGameUtils.Javaから:
public static boolean resolveConnectionFailure(Activity activity,
GoogleApiClient client, ConnectionResult result, int requestCode,
String fallbackErrorMessage) {
if (result.hasResolution()) {
try {
result.startResolutionForResult(activity, requestCode);
return true;
} catch (IntentSender.SendIntentException e) {
// The intent was canceled before it was sent. Return to the default
// state and attempt to connect to get an updated ConnectionResult.
client.connect();
return false;
}
} else {
// not resolvable... so show an error message
int errorCode = result.getErrorCode();
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode,
activity, requestCode);
if (dialog != null) {
dialog.show();
} else {
// no built-in dialog: show the fallback error message
showAlert(activity, fallbackErrorMessage);
}
return false;
}
}
ドライブAPIは、コンソールページから有効にする必要があります。
このエラーは、ユーザーがアプリを認証する必要があることを示しています。これには完全なワークフローがあります。 https://developers.google.com/+/mobile/Android/getting-started のチュートリアルに従って「onConnectionFailed」を探します
デバッグキーを使用していない場合は、アルファ版としてGoogle Playにアプリをプッシュし、テスターとして自分自身を追加し、最も重要です-Aplhaページの「オプトイン」リンクをたどり、テスターであることを確認します。
私は同じ問題を抱えてこのソリューションで解決しましたが、実際には非常に古いバージョンのGoogle Play-Servicesライブラリがあったので、最新のGoogle Play-Serviceライブラリでcompile 'com.google.Android.gms:play-services :11.0.4 '以前のバージョンのライブラリからAndroid SDKをサポートし、gradle:appでcompileSDKVersionとtargetSDKVersionを維持します。マニフェストにGoogleドライブ対応API_KEYを追加して、もう一度試してください。
これと私の経験を共有したいと思います。私の場合は、Google Playゲーム用のGoogle Play Servicesを使用したときでした。また、SIGN_IN_REQUIREDエラーが発生するonConnectionFailedを取得していました。最後に、開発者コンソールでゲーム設定を「公開」していなかったことに気付きました。 apkの「アルファ版」または「ベータ版」の公開と間違われないようにしてください。私が作成し、ゲームのAPKにリンクする実際のGoogle Playゲーム「ゲーム」を意味します。
私の場合、問題は追加された繊細なスコープにあり、検証されていません:
https://console.developers.google.com/apis/credentials 資格情報-> OAuth同意画面-> Google APIのスコープ
未検証のスコープがないことを確認してください。
私の原因のために、開発者コンソールでAPIを生成するためにリリースSHA1キーを誤って使用しました。次に、debug.keystoreでSHA1キーを作成し、API資格情報で更新しました。その作業を開始しました。
keytool -list -v -keystore "C:\Users\<user>n\.Android\debug.keystore" -alias androiddebugkey -storepass andro
id -keypass Android