Как использовать неосновную деятельность для захвата пользовательского URL в игре единства?

Когда кто-то нажимает ссылку на веб-странице формы "com.foo.bar://testtest", я хочу, чтобы она открыла мою игру единства и для меня, чтобы получить тестовые данные.

Я опытный программист, но когда дело доходит до андроида, я как бы искал Google, а не понимал что-то. Это важно.:)

Я могу реагировать на ссылки на андроид, используя фильтры намерения. Однако все ресурсы, которые я нашел, предположили, что вы можете расширить свою основную деятельность, чтобы зафиксировать новое намерение. Это можно сделать с единством, но по разным причинам я предпочел бы этого не делать. Я попытался создать новое действие, экспортировав его в банку и добавив это в свой манифест в теге приложения:

<activity android:name="com.foo.ProtocolCatcher"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>
        <data android:scheme="com.foo.bar" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

Нажатие на ссылку успешно запускает мою игру, но на черный экран.

Изменить: я также пробовал этот формат без изменений:

<activity android:name="com.foo.ProtocolCatcher"
          android:label="@string/app_name">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="com.foo.bar" />
  </intent-filter>
</activity>

Каковы магические заклинания, чтобы сделать загрузку всей игры вместе с моей пользовательской деятельностью и позволить моей пользовательской активности читать входящий URL-адрес, не касаясь основного действия?

Ответ 1

Я полагаю, что вы не указали часть последовательности загрузки; требуемые шаги:

  • Определите ProtocolCatcher Activity с соответствующей схемой (ОК)
  • Определите MainActivty, который представляет вашу главную игру Unity3D Activity (OK)
  • Запустите MainActivity при запуске ProtocolCatcher Activity (MISSING)

Реализация третьего шага очень проста; просто отредактируйте метод ProtocolCatcher Activity onCreate():

//ProtocolCatcher
//...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

    Intent gameIntent = new Intent(this, MainActivity.class);
    /*
        //Pass the extra data to the game if needed
        Intent sourceIntent = getIntent();
        Uri data = sourceIntent.getData();
        gameIntent.putExtra("uriData", data != null ? data.toString(): null); 
    */
    startActivity(gameIntent); //start the real game
    finish(); //close the ProtocolCatcher activity

}

Учитывая тот факт, что вы "впрыскиваете" ProtocolCatcher Activity вручную, если у вас есть проблема со ссылкой MainActivity из ProtocolCatcher onCreate(), вы можете искать относительный класс с использованием отражения.