26929


いつもお世話になっております。

UnityでAndroidJavaObject経由でonActivityResultの結果取得方法についての質問となります。

やりたいことは以下となります。

  1. Unity(C#)から以下のコードでAndroidJavaコードをコールする

[code]

    using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                using (AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity")) {
                    using (AndroidJavaClass cls = new AndroidJavaClass ("hoge.QRCodeReader")) {
                        cls.CallStatic ("readQRCode", activity);
                    }
                }
            }
    
[/code]

  2. 以下のJavaが呼び出される

[code]

    package hoge;
    
    
    import android.app.Activity;
    import android.content.ActivityNotFoundException;
    import android.content.Intent;
    import android.net.Uri;
    import android.util.Log;
    
    public class QRCodeReader extends Activity {
    
        public String result = "";
    
        public static void readQRCode(Activity activity) {
            Intent intent = new Intent("com.google.zxing.client.android.SCAN");
            // バーコード："ONE_D_MODE"、QRコード："QR_CODE_MODE"、両方："MODE"
            intent.putExtra("SCAN_MODE", "ONE_D_MODE");
            try {
                activity.startActivityForResult(intent, 42);
            } catch (ActivityNotFoundException ex) {
                Uri url = Uri.parse("market://details?id=com.google.zxing.client.android");
                Intent intent2 = new Intent(Intent.ACTION_VIEW, url);
                activity.startActivity(intent2);
            }
        }
    
        public String getResultCOde() {
            return result;
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if( requestCode == 42 && resultCode == Activity.RESULT_OK){
                result = data.getStringExtra("SCAN_RESULT");
                Log.e("hogehoge", "@@@@@@@: " + result);
            }
        }
    }
    
[/code]

ここまでをAndroidの実機で実行すると、確かに、QRコードreaderアプリが呼び出されます。  
しかし、次にやりたいことは

  3. startActivityForResultで呼び出されたバーコードアプリで読み込んだバーコードテキストをonActivityResultで受け取る

  4. 3で受け取ったバーコードテキストをUnity側に返す

です。  
しかし、Unity側にonActivityResultで取得されたバーコードテキストを返す方法がどうしてもわかりません。

お手数ですが、お知恵を拝借できればと存じます。

何卒、宜しくお願いいたします。


CC BY-SA 3.0
2016-06-21T14:18:19.710
26921
2017-07-27T03:54:17.263
15136
question
unity3d
UnityでandroidのonActivityResultで取得した結果を取得する方法について


AndroidJavaProxyを用いて、onActivityResultのタイミングでJava側からコールバックを呼び出すようにしてはいかがでしょうか。

参考SDK Doc：  
<http://docs.unity3d.com/ja/current/ScriptReference/AndroidJavaProxy.html>


CC BY-SA 3.0
2016-06-22T02:13:39.723
26929
2016-06-22T02:13:39.723
15454
26921
answer


アドバイスありがとうございます！

早速使ってみました。

[code]

    public class QRCodeReader extends UnityPlayerActivity {
    
        private QRCodeListener listener;
    
    
        public void setListener(QRCodeListener listener)
        {
            this.listener = listener;
        }
    
        public void readQRCode(Activity activity) {
            Intent intent = new Intent("com.google.zxing.client.android.SCAN");
            // バーコード："ONE_D_MODE"、QRコード："QR_CODE_MODE"、両方："MODE"
            intent.putExtra("SCAN_MODE", "ONE_D_MODE");
            try {
                activity.startActivityForResult(intent, 42);
            } catch (ActivityNotFoundException ex) {
                Uri url = Uri.parse("market://details?id=com.google.zxing.client.android");
                Intent intent2 = new Intent(Intent.ACTION_VIEW, url);
                activity.startActivity(intent2);
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            String result = data.getStringExtra("SCAN_RESULT");
            data.putExtra("barcode", result);
            if(listener != null) {
                listener.onActivityResult(requestCode, resultCode, data);
            }
        }
    }
    
[/code]

リスナーは以下です。

[code]

    public interface QRCodeListener {
        public void onRestart();
    
        public void onStart();
    
        public void onResume();
    
        public void onPause();
    
        public void onStop();
    
        public void onActivityResult(int requestCode, int resultCode, Intent data);
    }
    
[/code]

C#は以下です！

[code]

    public class UnityAdd : MonoBehaviour {
    
        public void ShowAd() {
            using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                using (AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
                    using (AndroidJavaClass cls = new AndroidJavaClass ("hoge.QRCodeReader")) {
                        cls.Call("setListener", new ActivityListener());
                        Debug.Log ("hoge");
                        cls.CallStatic ("readQRCode", activity);
                    }
                }
            }
        }
    
        public class ActivityListener : AndroidJavaProxy
        {
            public ActivityListener()
                : base("hoge.QRCodeListener")
            {
            }
    
            public void onRestart()
            {
            }
    
            public void onStart()
            {
            }
    
            public void onResume()
            {
            }
    
            public void onPause()
            {
            }
    
            public void onStop()
            {
            }
    
            public void onActivityResult(int requestCode, int resultCode, AndroidJavaObject data)
            {
                Debug.Log (data.Call<AndroidJavaObject> ("getStringExtra", "barcode", "なし"));
            }
        }
    }
    
[/code]

やってみたのですが、登録したcallbackが呼ばれない状態でハマっております。  
実機でしか確認ができず、実機debugしながら動きの確認をしておりますが、Unity(C#)で登録した方のonActivityResultが呼ばれない状況となります。

何か勘違い、書き間違いなどございますでしょうか？？

お手数ですが、もしアドバイス等、ご助力いただけますと幸いです。


CC BY-SA 3.0
2016-06-25T11:46:14.623
27065
2017-07-27T03:54:17.263
2017-07-27T03:54:17.263
21092
15136
26921
answer


何ができていないかわかりました。

まず、上記コードの問題は  
・QRCodeReaderはインスタンス生成して呼ぶものではない(Activityなので)。  
・callStaticでなく、callで呼ぶべき

[code]

    using (AndroidJavaClass cls = new AndroidJavaClass ("hoge.QRCodeReader")) {
                cls.Call("setListener", new ActivityListener());
                Debug.Log ("hoge");
                cls.CallStatic ("readQRCode", activity);
            }
    
[/code]

・CurrentActivityにはAndroidManifestに記載してある「UnityPlayerActivity」が呼ばれる。

なので、やらなくてはならないことは

・AndroidManifestのmain Activityを「QRCodeReader」に書き換える  
・CurrentActivityが上記QRCodeReaderになるので、

[code]

    using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
        using (AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
            activity.Call("setListener", new ActivityListener());
            activity.CallStatic ("readQRCode", activity);
        }
    }
    
[/code]

とすべきということ。

ですが、/Temp/StagingArea/AndroidMnifest.xmlの書き換えがうまくいきません。  
Assets/Plugins/Android下にAndroidManifestを追加してbuild時にmergeさせるのですが、  
その時にmergeに失敗します。  
しかも、他のlibの「unityAds」の「UnityAdsFullscreenActivity」の記載箇所でエラーが出ます。。


CC BY-SA 3.0
2016-06-25T14:48:13.750
27075
2016-06-25T14:48:13.750
15136
26921
answer