2016-03-26 20 views
1

私はAmazon S3サーバとの通信を含むAndroidアプリケーションで作業しています。このアプリはUnityで開発されているので、ユーザが自分のGoogleアカウントで認証し、その認証情報を使ってCognitoを通じてS3サーバにアクセスできるようにするシステムを導入したいと考えています。そのためには、UnityでGoogle認証システムを実装する必要があります。これを行う方法を理解するのは苦労しています。私の現在のアプローチは、Android StudioでGoogle Sign In APIにアクセスするためのプラグインを作成することですが、プログラムを実行するたびにNoClassDefFoundError例外がスローされます。ここに私のlogcatは、次のとおりです。ここでAndroid UnityプラグインのGoogle認証

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 

は私のAndroidのコード(UnityPlayer活動)の関連する部分である:

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); 

} 

コードは、私はコンパクト活動内部ネイティブAPKでそれを実行した場合に動作しますが、私はそれをプラグインにしてUnityで動かすと、エラーが出ます。私はcom.google.android.gms.play-サービス-AUTH-8.4.0外部でclasses.jarファイルなど、試してみました

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

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

:ユニティでは、私はこのコードで認証()メソッドを呼び出します私がAndroid Studioで持っていたライブラリが動作しませんでした。また、プラグインを作成するのではなく、Unityで直接認証を実装することも検討しましたが、そのようなことについて私が見た情報はすべてGoogle Playゲームに関連しています。アプリケーションにGoogle PlayゲームAPIを追加することには興味がありません。私は、ユーザーが自分のGoogleアカウントでS3サーバーにアクセスできるようにログインさせるだけです。誰かがUnityと同様の機能を実装し、これを行うためのより良い方法を知っているなら、私はすべて耳にします。私はアプリでGoogle認証を有効にするために別の方法を使用していますが、唯一の必要条件はUnityで行う必要があることです。

ありがとうございます!

答えて

0

私は、ユーザーを認証するために、このコードを使用して私の問題を解決しました:

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); 

はまた、私は、JARファイルの形で以下のライブラリを追加する必要がありました:

  • アンドロイド-サポート-V4を
  • google-play-services
+1

このコードを正確に配置した場所を教えてください。私はまったく同じ問題を抱えています:ユーザーに自分のGoogleアカウントでAmazon S3にサインインしようとしています。どのようにこれを働かせるのですか?私は大いに助けの手に感謝します! –