2016-08-13 125 views
1

我正在開發一個應用程序,我需要它有一個登錄活動。我一直在關注這個(developers.google.com/identity/sign-in/android/sign-in)和this,出於某種原因,一切正常,沒有崩潰,沒有錯誤消息,但沒有登錄。安卓 - 谷歌登錄不工作(沒有崩潰或例外)

但是,每次我開始練習時我在 「運行」 選項卡中獲取這些:

W/System: ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/m/00000008/n/armeabi-v7a 
W/System: ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/m/00000008/n/armeabi 

和:

W/DynamiteModule: Local module descriptor class for com.google.android.gms.crash not found. 

和:

W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 

,並在logcat我得到:

GoogleService failed to initialize, status: 10, Missing an expected resource: 'R.string.google_app_id' for initializing Google services. Possible causes are missing google-services.json or com.google.gms.google-services gradle plugin. 

但奇怪的是我有我的app目錄中的google-services.json

我的項目gradle這個是:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
repositories { 
    jcenter() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:2.2.0-alpha7' 
    classpath 'com.google.gms:google-services:2.0.0-alpha6' 
    classpath 'com.google.gms:google-services:3.0.0' 
    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 
}allprojects { 
repositories { 
    jcenter() 
}} 

我的模塊:應用gradle這個是:

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 24 
buildToolsVersion "21.1.2" 
defaultConfig { 
    applicationId "(My app ID)" 
    minSdkVersion 16 
    targetSdkVersion 24 
    versionCode 4 
    versionName "1.3" 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

productFlavors { 
}} 
dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
compile 'com.android.support:appcompat-v7:24.1.1' 
compile 'com.google.android.gms:play-services:9.4.0' 
compile 'com.android.support:design:24.1.1' 
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha5' 
} 
apply plugin: 'com.google.gms.google-services' 

現在,這裏是我的代碼(基於谷歌的 「整合谷歌登入到你的Android應用程序」教程):

public class Multiplayer extends AppCompatActivity implements 
GoogleApiClient.OnConnectionFailedListener, 
View.OnClickListener { 

private static final String TAG = "SignInActivity"; 
private static final int RC_SIGN_IN = 9001; 

private GoogleApiClient mGoogleApiClient; 
private TextView mStatusTextView; 
private ProgressDialog mProgressDialog;@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.content_multiplayer); 

    // Views 
    mStatusTextView = (TextView) findViewById(R.id.status); 

    // Button listeners 
    findViewById(R.id.sign_in_button).setOnClickListener(this); 
    findViewById(R.id.sign_out_button).setOnClickListener(this); 
    findViewById(R.id.disconnect_button).setOnClickListener(this); 

    // [START configure_signin] 
    // Configure sign-in to request the user's ID, email address, and basic 
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .build(); 

    // [END configure_signin] 

    // [START build_client] 
    // Build a GoogleApiClient with access to the Google Sign-In API and the 
    // options specified by gso. 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

    // [END build_client] 

    // [START customize_button] 
    // Customize sign-in button. The sign-in button can be displayed in 
    // multiple sizes and color schemes. It can also be contextually 
    // rendered based on the requested scopes. For example. a red button may 
    // be displayed when Google+ scopes are requested, but a white button 
    // may be displayed when only basic profile is requested. Try adding the 
    // Scopes.PLUS_LOGIN scope to the GoogleSignInOptions to see the 
    // difference. 
    SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); 
    signInButton.setSize(SignInButton.SIZE_STANDARD); 
    signInButton.setScopes(gso.getScopeArray()); 
    // [END customize_button] 
} @Override 
public void onStart() { 
    super.onStart(); 

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); 
    if (opr.isDone()) { 
     // If the user's cached credentials are valid, the OptionalPendingResult will be "done" 
     // and the GoogleSignInResult will be available instantly. 
     Log.d(TAG, "Got cached sign-in"); 
     GoogleSignInResult result = opr.get(); 
     handleSignInResult(result); 
    } else { 
     // If the user has not previously signed in on this device or the sign-in has expired, 
     // this asynchronous branch will attempt to sign in the user silently. Cross-device 
     // single sign-on will occur in this branch. 
     showProgressDialog(); 
     opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       hideProgressDialog(); 
       handleSignInResult(googleSignInResult); 
      } 
     }); 
    } 
} 

// [START onActivityResult] 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     handleSignInResult(result); 
    } 
} 
// [END onActivityResult] 

// [START handleSignInResult] 
private void handleSignInResult(GoogleSignInResult result) { 
    Log.d(TAG, "handleSignInResult:" + result.isSuccess()); 
    if (result.isSuccess()) { 
     // Signed in successfully, show authenticated UI. 
     GoogleSignInAccount acct = result.getSignInAccount(); 
     mStatusTextView.setText(acct.getDisplayName()); 
     updateUI(true); 
    } else { 
     // Signed out, show unauthenticated UI. 
     updateUI(false); 
    } 
} 
// [END handleSignInResult] 

// [START signIn] 
private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 
// [END signIn] 

// [START signOut] 
private void signOut() { 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        // [START_EXCLUDE] 
        updateUI(false); 
        // [END_EXCLUDE] 
       } 
      }); 
} 
// [END signOut] 

// [START revokeAccess] 
private void revokeAccess() { 
    Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        // [START_EXCLUDE] 
        updateUI(false); 
        // [END_EXCLUDE] 
       } 
      }); 
} 
// [END revokeAccess] 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not 
    // be available. 
    Log.d(TAG, "onConnectionFailed:" + connectionResult); 
} 

private void showProgressDialog() { 
    if (mProgressDialog == null) { 
     mProgressDialog = new ProgressDialog(this); 
     mProgressDialog.setMessage("LOADING"); 
     mProgressDialog.setIndeterminate(true); 
    } 

    mProgressDialog.show(); 
} 

private void hideProgressDialog() { 
    if (mProgressDialog != null && mProgressDialog.isShowing()) { 
     mProgressDialog.hide(); 
    } 
} 

private void updateUI(boolean signedIn) { 
    if (signedIn) { 
     findViewById(R.id.sign_in_button).setVisibility(View.GONE); 
     // findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE); 
     findViewById(R.id.comments).setVisibility(View.VISIBLE); 
    } else { 
     mStatusTextView.setText("SIGNED OUT"); 
     findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); 
     // findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE); 
     findViewById(R.id.comments).setVisibility(View.GONE); 
    } 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.sign_in_button: 
      signIn(); 
      break; 
     case R.id.sign_out_button: 
      signOut(); 
      break; 
     case R.id.disconnect_button: 
      revokeAccess(); 
      break; 
    } 
} 
} 

Here is my folder structure (I did it as rakesh kashyap suggested)

有人能幫助我嗎?我似乎無法找到問題的根源。

+0

check ** google-services。json **文件在您的項目的應用程序文件夾中如果沒有名爲** google-services.json **的文件打開此鏈接:http://stackoverflow.com/questions/34367870/where-do-i-get-a -google-services-json –

+0

@HarishKamboj在這個問題中,我已經提到我在我的Android應用中有google-services.json文件... – user6181605

+2

您是否啓用了Google + api?從這裏:https://console.developers.google.com/apis/library –

回答

0

您可以通過下載並按照以下步驟複製你的Android應用程序的谷歌,services.json文件解決此問題:

  • 從這個link,然後單擊選擇您的應用程序/項目名稱和Android軟件包名繼續選擇並配置服務。
  • 單擊繼續以生成配置文件。
  • 下載google-services.json並將文件複製到Android項目的應用程序/或mobile/module目錄中。
+0

在這個問題中,我已經提到我的Android應用程序中有google-services.json文件... – user6181605

+0

@ user6181605刪除已存在的文件夾並嘗試上述解決方案.. – PN10

+0

@ PN10當我把應用插件:'com.google.gms.google-services'下面應用插件:'com.android.application'及以上android {}它不會構建項目,並且在同步gradle時出現錯誤。 – user6181605

0

嘗試......

檢查您的構建變量(建設 - >選擇構建變量)。記下變體名稱。應該調試或發佈,或者您已經定義了什麼

選擇項目視圖。導航到應用程序 - > src並創建一個與您的構建變體名稱完全相同的目錄。

將您的JSON文件複製到此目錄。

嘗試構建 - >清理項目。檢查gradle cosole。 (解析json文件:Drive:\ path_to_your_app_dir \ your_app_name \ app \ src \ release_prod \ google-services.json )

+0

已經複製那裏,雖然我的構建變種是調試,我應該改變它釋放? – user6181605

+0

可以發佈您的文件夾結構和json位置的屏幕截圖 –

+0

我已發佈文件夾結構。 – user6181605