Отладка Android-приложения при его открытии по электронной почте / намерению с устройства в Android Studio - PullRequest
0 голосов
/ 10 сентября 2018

Как видно из заголовка, я пытаюсь отладить приложение Android, работающее на устройстве, через USB, в отладчик Android Studio.

По сути, код ведет себя очень по-разному, когда открывается через намерение из электронной почты, и естьэлементы, передаваемые в приложение, которое необходимо проанализировать, а затем действовать, поэтому это не просто обычный сеанс отладки.

Я безуспешно пробовал следующие решения:

приложение отладкипри запуске с помощью фильтра намерений

и

Отладка Android-приложения при запуске на устройстве

В принципе я не могу подключить отладчик, не запустив егоот Android Studio, которая побеждает цель.Возможно, я неправильно понял пункты выше или в Android Studio есть шаг, который позволит вам подключиться к удаленному сеансу на устройстве, о котором я не знаю.

Что нужно сделать:

  1. Щелкните ссылку в электронном письме на устройстве Android
  2. Это приведет к запуску приложения
  3. Отладчик Android Studio откроется для моей точки останова в том месте, где он анализируетвход, на моем блоке разработки, подключенном через USB
  4. Я могу отлаживать оттуда.

Я могу предоставить примеры ссылок по электронной почте, пример намерения, если необходимо.У меня включена отладка по USB, и я могу без проблем отлаживать на устройстве обычные запуски (инициированные Android Studio).

спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Спасибо Гейбу Сечану, который поставил меня на правильный путь.

Во-первых, я никогда не мог напрямую запустить приложение на устройстве и подключиться к нему через отладчик.Скорее мне пришлось запустить приложение на устройстве через Android Studio, а затем щелкнуть ссылку на электронном письме, которое затем подключилось к отладчику.

Ссылка в электронном письме выглядела примерно так (она имеет встроенныйв перенаправлении на наши серверы):

https://ourcompany.net/redirect?url=myapp%3A%2F%2FDoStuff/123456

Это могло произойти из-за способа настройки Intent.Пожалуйста, не судите, это было здесь, где я был, и я знаю, что это не рекомендуемый способ сделать Intents, но из-за существующей клиентской базы я не могу переформулировать, чтобы лучше подходить, в AndroidManifest.xml:

 <activity
    android:name="com.mycompany.StartActivity"
    android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation"
    android:label="StartActivity"
    android:launchMode="singleTask"
    android:windowSoftInputMode="stateHidden" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" />
    </intent-filter>
</activity>

Как вы можете видеть, он предназначен для работы как одиночный, поэтому, когда Intent активирован, вместо вызова onCreate () с приложением, запущенным из отладчика, он вызывает onNewIntent ().Мне нужно было добавить код и к этому перегруженному методу:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    processIntentLaunch(); // Code to test or run when Intent is triggered...
}

Код processIntentLaunch:

private void processIntentLaunch() {
    // test if this is from an email
    try {
        Intent intent = getIntent();
        if (intent.getAction() != null) {

            if (Intent.ACTION_VIEW.equals(intent.getAction())) {
                // SAMPLE: myapp://DoStuff/123456
                Uri uri = intent.getData();
                String host = uri.getHost();
                String uriStr =  uri.toString();

                // An anonymous dispatch
                if (host.equalsIgnoreCase("DoStuff")) {
                    String token = uriStr.substring(uriStr.indexOf("DoStuff") + "DoStuff".length()+1, uriStr.length());
                    // Now do stuff with the data. Note query string URI probably better, but again bit by previous design
                }
            }
        }
    }
    catch (Exception ex) {
        // Handle error
    }
}

Вероятно, это было к лучшему, так как кроме кода вOnCreate (если приложение еще не запущено), если приложение работает, оно все равно будет работать (и я могу отладить код).

Надеюсь, что когда-нибудь это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...