2016-03-26 4 views
1

Ich arbeite an einer Android-Anwendung, die die Kommunikation mit den Amazon S3-Servern umfasst. Die App wird in Unity entwickelt und ich möchte ein System hinzufügen, damit sich die Benutzer mit ihren Google-Konten authentifizieren und diese Anmeldeinformationen dann verwenden können, um über Cognito auf den S3-Server zuzugreifen. Dazu muss ich ein Google Authenticator-System in Unity implementieren, und es fällt mir schwer, herauszufinden, wie das geht. Mein aktueller Ansatz besteht darin, ein Plug-In mit Android Studio für den Zugriff auf die Google Sign-In-API zu erstellen. Jedes Mal, wenn ich das Programm ausführe, wird jedoch eine NoClassDefFoundError-Ausnahme ausgelöst. Hier ist meine logcat:Google-Authentifizierung in Android Unity Plugin

03-25 20:45:34.968 25581-25610/? D/MainActivity: Authenticating... 
03-25 20:45:35.086 25581-25610/? I/Unity: AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/auth/api/signin/GoogleSignInOptions$Builder; 
              java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/auth/api/signin/GoogleSignInOptions$Builder; 
               at com.unityplugin.MainActivity.authenticate(MainActivity.java:55) 
               at com.unity3d.player.UnityPlayer.nativeRender(Native Method) 
               at com.unity3d.player.UnityPlayer.a(Unknown Source) 
               at com.unity3d.player.UnityPlayer$b.run(Unknown Source) 
              Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.auth.api.signin.GoogleSignInOptions$Builder" on path: DexPathList[[zip file "/data/app/com.unityplugin-2/base.apk"],nativeLibraryDirectories=[/data/app/com.unityplugin-2/lib/arm, /data/app/com.unityplugin-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]] 
               at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
               at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
              at java.lang.ClassLoader.loadCla 

Hier ist der relevante Teil meines Android-Code (UnityPlayer Aktivität):

public void authenticate() { 

    Log.d(TAG, "Authenticating..."); 
    // Configure sign-in to request the user's ID, email address, and basic 
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
    //HERE IS THE ERROR (LINE 55) 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(Constants.GOOGLE_CLIENT_ID) 
      .requestEmail() 
      .build(); 

    // Build a GoogleApiClient with access to the Google Sign-In API and the 
    // options specified by gso. 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .addConnectionCallbacks(new ConnCallBack()) 
      .addOnConnectionFailedListener(new FailedListener()) 
      .build(); 

    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 

} 

Der Code funktioniert, wenn ich es in einer nativen APK in einer Compact Aktivität ausführen, aber Wenn ich es zu einem Plugin mache und es mit Unity laufe, erhalte ich den Fehler. In der Einheit, nenne ich die authenticate() -Methode mit diesem Code:

//Get Activity 
    AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
    AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"); 

    //Call function authenticate 
    currentActivity.Call("authenticate"); 

Ich habe versucht, einschließlich der classes.jar Datei im com.google.android.gms.play-Dienste-auth-8.4.0 Außen Bibliothek, die ich in Android Studio habe, aber es hat nicht funktioniert. Ich habe darüber nachgedacht, die Authentifizierung direkt in Unity zu implementieren, anstatt ein Plug-in zu erstellen. Aber alle Informationen, die ich über Google Play Games gesehen habe, sind nicht daran interessiert, die Google Play Games-API in meine Anwendung aufzunehmen. Ich möchte die Nutzer nur mit ihrem Google-Konto anmelden, damit sie auf den S3-Server zugreifen können. Wenn jemand eine ähnliche Funktion bei Unity implementiert hat und einen besseren Weg dafür kennt, bin ich ganz Ohr. Ich bin offen für eine andere Möglichkeit, die Google-Authentifizierung in meiner App zu aktivieren, die einzige Voraussetzung ist, dass sie in Unity ausgeführt werden muss.

Vielen Dank im Voraus!

Antwort

0

ich mein Problem mit diesem Code gelöst die Benutzer zu authentifizieren:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); 
AccountManager am = AccountManager.get(this); 
Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); 
String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name, 
     "audience:server:client_id:YOUR_GOOGLE_CLIENT_ID"); 
Map<String, String> logins = new HashMap<String, String>(); 
logins.put("accounts.google.com", token); 
credentialsProvider.setLogins(logins); 

Auch hatte ich die folgenden Bibliotheken in Form von JAR-Dateien hinzufügen:

  • android-support-v4
  • google-Play-Dienste
+1

können Sie mir zeigen, wo genau Sie diesen Code platziert? Ich habe genau das gleiche Problem: Ich möchte, dass der Nutzer sich mit seinem Google-Konto bei Amazon S3 anmeldet. Wie hast du das zur Arbeit gebracht? Ich würde eine helfende Hand sehr schätzen! –

Verwandte Themen