質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3270閲覧

Unityからaarファイル上にあるGooglePlayservicesが呼べない

aiueoao

総合スコア146

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/04/25 12:26

編集2017/04/26 00:09

###前提・実現したいこと
Unityでゲームを作っています。
セキュリティのためにこちらを参考にさせて頂き、GoogleのSafetyNetを利用したいのですが上手くいきません。
Android Studio側で、Android LibraryとしてGoogle Play servicesの処理をするクラスとそのサポートクラスからなるaarファイルを作り、Unity側(C#)から それを呼び出しています

なお、実機でテストしています

###発生している問題・エラーメッセージ
コードをいじって試した結果、
0. GoogleApiAvailabilityや、GoogleApiClient.Builder(getActivity())を呼び出す箇所に入ると「問題が発生したためアプリを終了します」のダイアログが表示され強制終了します。
0. 、GooglePlayservicesへの接続・切断イベントを受け取るコールバックを加えた場合,Android Libraryを呼び出したときに以下のエラーがLogCatで出ます

エラーメッセージ 04-25 19:30:39.401 16799-16799/? I/Unity:AndroidJavaException: java.lang.NoClassDefFoundError: com.unity.unitygame.test_plugin.TestClass$2 java.lang.NoClassDefFoundError: com.unity.unigame.test_plugin.TestClass$2 at com.unity.unigame.test_plugin.TestClass.<init>(TestClass.java:144) at com.unity.unigame.test_plugin.ReqClass.<init>(ReqClass.java:41) at com.unity3d.player.ReflectionHelper.nativeProxyInvoke(Native Method)

このエラー内の
(TestClass.java:144)は private GoogleApiClient.ConnectionCallbacks mGoogleApiCallback=new GoogleApiClient.ConnectionCallbacks()

(ReqClass.java:41)はft.add(new TestClass(), "aiueoao");
を示してます。

いずれもUnity側からの呼び出しは問題なく出来ていると思います。
またAndroid LibraryとしてUnityから呼び出すのではなく、Android StudioだけでSafetyNetの呼び出しをするアプリを作成した場合は正常に呼び出すことができました。

エラーメッセージのNoClassDefFoundErrorについて調べたら、「クラスの定義が見つかりません」とあるのですが、まだ理由についてはわからない状態です。

###該当のソースコード

java

1//Android Studio側 Unityから使用されるヘルパークラス 2package com.unity.unitygame.test_plugin; 3import android.app.Activity; 4import android.app.FragmentManager; 5import android.app.FragmentTransaction; 6 7public class ReqClass { 8 9 //Unity側のこのインタフェースから派生クラスが作成されます 10 public static interface IListener { 11 public void onComplete(boolean status); 12 } 13 14 private Activity mActivity; 15 private IListener mListener; 16 17 public static ReqClass mListner = null; 18 19 public static ReqClass instance() { 20 return mListner; 21 } 22 23 public ReqClass(Activity a, IListener l) { 24 mListner = this; 25 26 mActivity = a; 27 mListener = l; 28 29 //フラグメントを作成し、アクティビティに追加します。 30 FragmentManager fm = mActivity.getFragmentManager(); 31 FragmentTransaction ft = fm.beginTransaction(); 32 //FragmentTransaction.add() 33 ft.add(new TestClass(), "aiueoao"); 34 ft.commit(); 35 } 36 37 // このメソッドが呼び出されるとリスナーに通知する 38 public void onComplete(boolean v) { 39 mListener.onComplete(v); 40 } 41}

java

1//Android Studio側 SafetyNetの処理クラス 2package com.unity.unitygame.test_plugin; 3 4import android.app.Fragment; 5import android.os.Bundle; 6import android.support.annotation.NonNull; 7import android.support.annotation.Nullable; 8import android.util.Log; 9import android.view.LayoutInflater; 10import android.view.View; 11import android.view.ViewGroup; 12import android.util.Base64; 13import com.google.android.gms.common.ConnectionResult; 14import com.google.android.gms.common.GoogleApiAvailability; 15import com.google.android.gms.common.api.GoogleApiClient; 16import com.google.android.gms.common.api.ResultCallback; 17import com.google.android.gms.common.api.Status; 18import com.google.android.gms.safetynet.SafetyNet; 19import com.google.android.gms.safetynet.SafetyNetApi; 20 21import org.json.JSONException; 22import org.json.JSONObject; 23 24import static com.unity3d.player.UnityPlayer.UnitySendMessage; 25 26public class TestClass extends Fragment{ 27 28 public TestClass(){} 29 private GoogleApiClient mGoogleApiClient; //GoogleAPIを使用するためのクライアント 30 31 @Nullable 32 @Override 33 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 34 Log.d("SafetyNet_Log","onCreateView"); 35 checkServiceAvailability(); 36 return super.onCreateView(inflater, container, savedInstanceState); 37 } 38 39 //Google play servicesが利用可能かを確認する 40 private void checkServiceAvailability() { 41 Log.d("SafetyNet_Log", "checkServiceAvailability"); 42 if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { 43 Log.d("SafetyNet_Log", "接続済み"); 44 SafetyStart(); 45 } 46 Log.d("SafetyNet_Log", "未接続"); 47 48 49 //Google play servicesの利用可否をチェックする 50 GoogleApiAvailability checker = GoogleApiAvailability.getInstance(); //getInstance() : GoogleApiAvailabilityのシングルトンインスタンスを返します。 51 int result = checker.isGooglePlayServicesAvailable(getActivity()); 52 53 if (result == ConnectionResult.SUCCESS) { 54 //使用可能 55 Log.d("SafetyNet_Log", "ConnectionResult.SUCCESS"); 56 onGooglePlayServicesAvailable(); 57 } else { 58 //使用不可 59 Log.d("SafetyNet_Log", "使用不可"); 60 } 61 } 62 63 //Google Play開発者サービスが利用可能だった場合 64 private void onGooglePlayServicesAvailable() { 65 try { 66 mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 67 .addApi(SafetyNet.API) 68 // .addConnectionCallbacks(mGoogleApiCallback) //コールバック 69 // .addOnConnectionFailedListener(mConnectionFaildListener) 70 .build(); 71 72 mGoogleApiClient.connect(); 73 Log.d("SafetyNet_Log", "build()"); 74 SafetyStart(); 75 }catch (Exception e){ 76 backUnity(e.toString()); 77 } 78 } 79 80 private void SafetyStart() { 81 Log.d("SafetyNet_Log", "------SafetyStart()--------"); 82 // mGoogleApiClient.connect(); //クライアントをGoogle Playサービスに接続します。 83 byte[] nonce = {1, 2, 3, 4, 5, 6, 7,8,9,10,11,12,13,14,15,16,17,18}; // Should be at least 16 bytes in length. 84 85 SafetyNet.SafetyNetApi.attest(mGoogleApiClient, nonce) 86 .setResultCallback(new ResultCallback<SafetyNetApi.AttestationResult>() { 87 88 @Override 89 public void onResult(SafetyNetApi.AttestationResult result) { 90 String str = ""; 91 92 Status status = result.getStatus(); 93 if (status.isSuccess()) { 94 Log.d("SafetyNet_Log", "ok"); 95 //サービスとの通信が成功したことを示します。 result.getJws Result()を使用して結果データを取得します。 96 String[] jwtParts = result.getJwsResult().split("\\."); 97 String decodedPayload = new String(Base64.decode(jwtParts[1], Base64.DEFAULT)); 98 try { 99 100 JSONObject root = new JSONObject(decodedPayload); 101 Log.d("SafetyNet JWT: ", root.toString()); 102 str = root.toString(); 103 } catch (JSONException e) { 104 e.printStackTrace(); 105 } 106 } else { 107 Log.d("SafetyNet_Log", "No"); 108 //サービスとの通信中にエラーが発生 109 } 110 backUnity(str); 111 } 112 }); 113 } 114 115 /* 116 117 //GooglePlayServicesへの接続・切断イベントを受け取るコールバック 118 private GoogleApiClient.ConnectionCallbacks mGoogleApiCallback=new GoogleApiClient.ConnectionCallbacks(){ 119 @Override 120 public void onConnected(Bundle bundle) { 121 //接続に成功した場合呼ばれる 122 Log.d("SafetyNet_Log","onConnected!!!!"); 123 SafetyStart(); 124 } 125 126 @Override 127 public void onConnectionSuspended(int i) { 128 Log.d("SafetyNet_Log","onConnectionSuspended!!!!"); 129 } 130 }; 131 132 //GooglePlayServicesへの接続失敗イベントを受け取るコールバック 133 private GoogleApiClient.OnConnectionFailedListener mConnectionFaildListener =new GoogleApiClient.OnConnectionFailedListener() 134 { 135 @Override 136 public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 137 Log.d("SafetyNet_Log","onConnectionFailed"); 138 if(connectionResult.hasResolution()){ 139 //何らかの方法で解決可能な場合 140 Log.d("SafetyNet_Log","connectionResult.hasResolution()==true"); 141 }else { 142 Log.d("SafetyNet_Log","connectionResult.hasResolution()==false"); 143 } 144 } 145 }; 146*/ 147 148 private void backUnity(String str) 149 { 150 Log.d("tes","----------------back unity"); 151 UnitySendMessage("CallbackGameObject", "SafetyTest_Callback", str); 152 } 153}

###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio2.1.2
Unity5.5.0(C#)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

GooglePlayServicesの中から、必要なAPIのみを追加するためのUnityライブラリを使うことで解決しました
参考

投稿2017/04/26 11:05

aiueoao

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問