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

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

ただいまの
回答率

87.78%

【Unity】バックグラウンド時にandroidプラグインからUnityの関数を呼び出す【モバイル】

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,175

score 83

いつもお世話になっております。
毎度恐縮ですが質問させていただきます。

前提・実現したいこと

タイトルの通りバックグラウンド時にプラグインからUnityの関数を呼び出したいです。
バックグラウンドというのはアプリを立ち上げてはいるがフォーカスされていない状態(ホーム画面にいる等)

該当のソースコード

// Unity連携部分
public class NativeDialog {
    private static AudioAttributes audioAttributes;
    private static SoundPool soundPool;
    private static int soundOne;

    static public void init(Context i_context, Class i_class) {
         audioAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();

        soundPool = new SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .setMaxStreams(1)
                .build();

        soundOne = soundPool.load(i_context, R.raw.one, 1);
    }

    static  public void startService() {
        Log.i("Unity", "START Service");
        Activity activity = UnityPlayer.currentActivity;
        Context context = activity.getApplicationContext();
        activity.startService(new Intent(context, testService.class));
    }

    static public void stopService() {
        Log.i("Unity", "STOP Servise");
        testService.shouldContinue = false;
    }

    static public void callUnity() {
        Log.i("Unity", "callUnity");
        // 音を鳴らしてみる
        soundPool.play(soundOne, 1.0f, 1.0f, 0, 0, 1);
        UnityPlayer.UnitySendMessage("Main Camera", "sendNotification", "");
    }

    static public void sendNotification(){
        Log.i("Unity", "START sendNotification");

        // Intent の作成
        Activity activity = UnityPlayer.currentActivity;
        Intent intent = new Intent(activity.getApplicationContext(), _class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Notification n = new Notification.Builder(context)
                .setContentTitle("title")
                .setContentText("msg")
                .setSmallIcon(R.drawable.test)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)
                .build();

        NotificationManager mNotifyMgr =
                (NotificationManager) activity.getSystemService(NOTIFICATION_SERVICE);

        int mNotificationId = 001;
        // Builds the notification and issues it.
        mNotifyMgr.notify(mNotificationId, n);

        Log.i("Unity", "END sendNotification");
    }
}
// Service
public class testService extends IntentService {
    public static volatile boolean shouldContinue = true;

    public testService (String name) {
        super(name);
    }

    public testService () {
        super("testService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        shouldContinue = true;

        Log.d("NotifyIntentService","onHandleIntent Start");

        long endTime = System.currentTimeMillis() + 6*1000;
        while (System.currentTimeMillis() < endTime) {
            synchronized (this) {
                try {
                    wait(endTime - System.currentTimeMillis());
                    if (!shouldContinue) {
                        stopSelf();
                        return;
                    }

                    NativeDialog.callUnity();
                } catch (Exception e) {
                }
            }
        }
    }
}
// Unity部分
public class StartScript : MonoBehaviour
{
    static AndroidJavaClass _plugin = null;

    // Use this for initialization
    void Start ()
    {
        Init();
#if UNITY_ANDROID && !UNITY_EDITOR
        _plugin = new AndroidJavaClass("com.example.dialog_plugin.NativeDialog");
#endif
    }

    void Init()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        AndroidJavaClass nativeDialog = new AndroidJavaClass("com.example.dialog_plugin.NativeDialog");

        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        context.Call("runOnUiThread", new AndroidJavaRunnable(() => {
            nativeDialog.CallStatic(
                "init",
                context,
                unityPlayer
            );
        }));
#endif
    }

    void sendNotification()
    {
        Debug.Log("unity sendNotification");
#if UNITY_ANDROID && !UNITY_EDITOR
            _plugin.CallStatic ("sendNotification");
#endif
    }

    void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            _plugin.CallStatic ("startService");
#endif
        }
        else
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            _plugin.CallStatic("stopService");
#endif
        }
    }
}

試したこと

UnityからAndroidプラグインのserviceを立ち上げ一定時間後にローカル通知を行う関数を呼び出す処理を記載。
現在はバックグラウンド時に音声再生とログは確認できているが肝心の処理は行われず、フォアグラウンドになったときにはじめて処理が行われているのを確認。

補足情報(言語/FW/ツール等のバージョンなど)

AndroidStudio2.2.3
Unity5.5.0f3

質問したいこと

呼び出しの方法は回りくどいですが実現したいのはタイトルと最初に書いたとおりのことです。
質問したいことはMonoBehaviourはバックグラウンド時に処理が止まってしまうのかタイトルのようなことは実現可能かということです。

何卒宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

Unityの仕組み的にできないと思います。

Application.runInBackgroundというオプションがありますが、Andoidでは使えません。

https://forum.unity3d.com/threads/application-runinbackground-is-not-working-on-android.117723/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/30 11:18

    回答ありがとうございます。

    やはりそうでしたか。。
    Application.runInBackgroundはPCのみなのでおそらくiOSも同じですよね。

    キャンセル

0

音声ファイルなどは、APKのassetsに格納されるようなので
AssetManagerからファイルを直接参照できるかもしれないです。

参照出来たら、サービス上でSoundPoolやらMediaPlayerやらで再生してしまうのはどうでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/30 12:04

    ん?そもそもUnityが寝てるから意味ないってことか

    キャンセル

  • 2017/03/30 12:12

    がっつり修正

    キャンセル

  • 2017/03/31 19:20

    回答ありがとうございます。
    Unityが起こせるかという質問でした。
    うまく伝えきれず申し訳ないです。

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る