2014-09-11 4 views
2

Я работаю над проектом Android, и я наткнулся на небольшую проблему. Я сделал игру с мячом на странице обучения единства, и теперь я хочу отправить элементы управления из приложения Android. Это очень важно, я не хочу, чтобы игра перехватывала элементы управления. Я использовал этот учебник:ANDROID sendBroadcast для UNITY BroadcastReceiver не работает

http://jeanmeyblum.weebly.com/scripts--tutorials/communication-between-an-android-app-and-unity

Я сделал службу в приложении для Android, который я думаю, это вполне нормально. Я тестировал его, если он работает в отладчике, и это так. Затем я сделал приемник в соответствии с инструкцией, то же самое с частью плагина. Когда я запускаю игру (которая находится в действии в приложении Android), приемник работает ALMOST, он получает значение «text», которое я устанавливал в статической переменной, но только значение, которое было в объявлении в начале (так что я думаю, что часть плагина работает правильно). Проблема в том, что метод onReceive() не вызывается, поэтому значение «текст» не изменяется на «-1», которое перемещает шар в противоположном направлении (шар всегда перемещается в направлении +1).

Вот код:

public class MyReceiver extends BroadcastReceiver { 

    private static MyReceiver instance; 
    // text that will be read by Unity 
    public static String text = "1"; 
    // Triggered when an Intent is catched 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // We get the data the Intent has 
     String sentIntent = intent.getStringExtra(Intent.EXTRA_TEXT); 
     //if (sentIntent != null) { 
      text = "-1"; 
     //} 
    } 
    public static void createInstance() 
    { 
     if(instance == null) 
     { 
      instance = new MyReceiver(); 
     } 
    } 
} 

И Услуги:

public class MyService extends Service { 

    private final Handler handler = new Handler(); 
    private int numIntent = 0; 

    // It's the code we want our Handler to execute to send data 
    private Runnable sendData = new Runnable() { 
     // the specific method which will be executed by the handler 
     public void run() { 
      numIntent++; 

      // sendIntent is the object that will be broadcast outside our app 
      Intent sendIntent = new Intent(); 

      // We add flags for example to work from background   
      sendIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION|Intent.FLAG_FROM_BACKGROUND|Intent.FLAG_INCLUDE_STOPPED_PACKAGES ); 

      // SetAction uses a string which is an important name as it identifies the sender of the intent and that we will give to the receiver to know what to listen. 
      // By convention, it's suggested to use the current package name 
      sendIntent.setAction("com.example.package"); 

      // Here we fill the Intent with our data, here just a string with an incremented number in it. 
      sendIntent.putExtra(Intent.EXTRA_TEXT, "1000"); 
      // And here it goes ! our message is send to any other app that want to listen to it. 
      sendBroadcast(sendIntent); 

      // In our case we run this method each second with postDelayed 
      handler.removeCallbacks(this); 
      handler.postDelayed(this, 1000); 
     } 
    }; 

    // When service is started 
    public void onStart(Intent intent, int startid) { 
     // We first start the Handler 
     handler.removeCallbacks(sendData); 
     handler.postDelayed(sendData, 1000); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Я также редактировал манифестах:

<service 
     android:name="com.example.MyService" 
     android:enabled="true" > 
     </service> 

и приемник:

<receiver android:name="com.example.receiver.MyReceiver"> 
      <intent-filter> 
       <action android:name="com.example.package"> 
       </action> 
      </intent-filter> 
     </receiver> 

Я могу видеть MyService в настройках телефонов, и игра получает объявленное значение «текст». Проблема заключается в методе onReceive i thin, который никогда не называется. Кто-нибудь может мне с этим помочь?

ответ

3

Я оставил этот проект на некоторое время и вернулся к нему вчера. И Я СДЕЛАЛ ЭТО. Проблема заключалась в том, что приемник UNITY также должен был быть зарегистрирован в манифесте ANDROID, на самом деле я думаю, что он должен быть зарегистрирован в обоих манифестах. Надеюсь, это кому-нибудь поможет: D

+0

Я попытался зарегистрировать приемник в обоих файлах манифеста, т.е. в Unity и JAR. Но все равно не получилось вызвать onReceive(). :( Можете ли вы посоветовать мне более подробную информацию? – Nick

+1

+1 для ответа и вопроса тоже .. hey thanx alot .. Это тоже работало для меня. Дело в том, что вам нужно зарегистрировать приемник, как с полным именем пакета в оба файла манифеста. <ресивер андроида: name = "com.test.app.PluginBroadcastReceiver"> Нравится это. – Nick