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

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

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

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

Unity3D

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

Android Studio

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

Q&A

解決済

1回答

3432閲覧

パーミッション管理をするAndroidプラグインがUnity上で動作しません

aiueoao

総合スコア146

Java

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

Unity3D

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

Android Studio

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

0グッド

0クリップ

投稿2016/08/24 05:51

編集2016/08/24 05:57

###前提・実現したいこと
Android Studio2.1で、Android 6.0 (APIレベル23)の新しいパーミッション処理に対応したパーミッション管理クラスをAndroid Libraryに作り、それをaar形式でUnityにいれて呼び出したいのですが、呼び出しができません。

新パーミッション対応するためにcheckSelfPermission()メソッドや、requestPermissions()メソッドを使いますが、色々試した結果これらは Activityや AppCompatActivityの継承が必要らしく、この継承をさせるとライブラリ(?)としてうまくいきません。

Activityを使用せずにこれらのメソッドは使えるのでしょうか?Activityが必要な場合どう連携させるかわかりません。
また、Unityとの連携させる場合のAS側の実機でのエラー確認方法もよくわからないのですがどのような方法がありますでしょうか?
Unity側スクリプトで呼び出す箇所はエラーを出さないのでどうすればよいか困っています。

Android Studioは初めてさわるので質問が変かもしれません
###該当のソースコード

java

1//Android Studio 2package jp.co.test.dialog_plugin; 3import android.Manifest; 4import android.annotation.TargetApi; 5import android.content.pm.PackageManager; 6import android.os.Build; 7import android.support.v7.app.AppCompatActivity; 8import android.telephony.TelephonyManager; 9import android.widget.Toast; 10import android.app.AlertDialog; 11import android.content.Context; 12 13public class NativeDialog extends AppCompatActivity{ 14 private static int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 1; 15 16 //Unityから呼ばれる 17 static public void unityCall(Context context) 18 { 19 // Android 6, API 23以上でパーミッシンの確認 20 if(Build.VERSION.SDK_INT >= 23){ 21 NativeDialog n=new NativeDialog(); 22 n.Api23(); 23 } 24 else{ //Android 6未満 25 NativeDialog n= new NativeDialog(); 26 n.showLineNumber(); 27 } 28 } 29 30 //Android 6以上 31 @TargetApi(Build.VERSION_CODES.M) 32 protected void Api23() { 33 //Permissionをチェック 34 if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { 35 // 権限がない場合はリクエスト 36 requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); 37 } else { 38 showLineNumber(); 39 } 40 } 41 42 @TargetApi(Build.VERSION_CODES.M) 43 //requestPermissionsの結果がコールバックされます 44 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 45 if (MY_PERMISSIONS_REQUEST_READ_PHONE_STATE == requestCode) { 46 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 47 // 許可された 48 showLineNumber(); 49 } else { 50 // 拒否された 51 Toast.makeText(this, "拒否された", Toast.LENGTH_SHORT).show(); 52 } 53 } 54 } 55 56 private void showLineNumber() { 57 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 58 Toast.makeText(this, telephonyManager.getLine1Number(), Toast.LENGTH_SHORT).show(); 59 } 60}

C#

1//Unity 2using UnityEngine; 3using System.Collections; 4using UnityEngine.UI; 5 6public class AndroidDialogTest : MonoBehaviour 7{ 8 public Text text; 9 10 void Start() 11 { 12 text.text = "Start"; 13 ShowDialog(); 14 } 15 16 void ShowDialog() 17 { 18#if UNITY_ANDROID 19 try 20 { 21 // Javaのオブジェクトを作成 22 AndroidJavaClass nativeDialog = new AndroidJavaClass("jp.co.test.dialog_plugin.NativeDialog"); 23 24 // Context(Activity)オブジェクトを取得する 25 AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 26 AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); 27 28 // AndroidのUIスレッドで動かす 29 context.Call("runOnUiThread", new AndroidJavaRunnable(() => 30 { 31 32 // Android studioのメソッドを呼び出す 33 nativeDialog.CallStatic( 34 "unityCall", 35 context 36 ); 37 })); 38#endif 39 }catch(UnityException e) 40 { 41 text.text = e.ToString(); 42 } 43 } 44}

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

参考にさせていただいたサイト
Unity用のAndroidプラグインを作ってみる
Android MのPermissionを試してみた

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

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

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

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

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

guest

回答1

0

ベストアンサー

unityCallを実行する際に渡しているcontext、実体はActivityなので、
unityCallの引数ではActivityとして受け取るようにします。

api23にもActivityを渡してやって、そのActivityからそれぞれ実行してください。

NativeDialogがActivityを継承する必要はありません。

多分これで動くと思います。

Java

1static public void unityCall(Activity activity) { 2 if(Build.VERSION.SDK_INT >= 23){ 3 Api23(activity); 4 } 5} 6 7static void Api23(Activity activity) { 8 if (activity.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) { 9 activity.requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); 10 } 11}

エラー確認方法については・・・
Unity触ったことないのでわかんないです・・・
とりあえず「Logcat」というものが見れるようになれば、
Java側の処理で落ちたときのエラーを確認できると思います。

投稿2016/08/24 06:34

編集2016/08/24 07:02
abs123

総合スコア1280

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

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

abs123

2016/08/24 07:12

onRequestPermissionsResult受け取るのってどうするんだろう・・・ 知識不足で、中途半端な回答になってしまい申し訳ないです。 誰かほかの人が正しい回答をしてくださるでしょう(丸投げ)
aiueoao

2016/08/24 08:24

詳細な回答ありがとうございます。 ようやくライブラリを呼ぶことができました。 アクティビティはContextクラスを継承しているんですね。 本当に助かりました! 肝心のAndroid6をまだ持ってないのでコールバックメソッドのテストが出来ませんが感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問