Я вижу «android.content».ActivityNotFoundException»при попытке открыть веб-браузер из моего приложения

#java #android #android-activity

#java #Android #android-активность

Вопрос:

Следующий код выдает мне android.content.ActivityNotFoundException время от времени.

Я использую идентичный код в нескольких своих действиях, чтобы направить пользователя к дополнительной информации на веб-сайте, и, похоже, большую часть времени он работает без проблем.

 private void openWebPage(String url_to_view) {
    Intent open_web_page_intent = new Intent();

    if (url_to_view != null amp;amp; !url_to_view.equals("")) {
        open_web_page_intent.setAction(Intent.ACTION_VIEW);
        try {
            open_web_page_intent.setData(Uri.parse(url_to_view));
            startActivity(open_web_page_intent);
        } catch (ParseException e) {
            Log.e(LOGTAG, "URI Parse Exception in Open Web Page");
        }
    }
}
 

Есть ли способ защититься от этой ошибки?

Я не могу понять из трассировки стека, связана ли проблема с активностью вызова или с новым действием, которое я начинаю? (Полная трассировка стека ниже)

Если проблема связана с новым действием, будет ли a try/catch вокруг StartActivity утверждения хорошей гарантией? (Сбой происходит нечасто, и я не могу воспроизвести его на своих тестовых устройствах или AVD).

Обратите также внимание, что трассировка стека ссылается на StartActivityForResult то, что я не делаю в данном случае, я просто начинаю новое действие в обычном режиме.

 android.content.ActivityNotFoundException: 
  at android.app.Instrumentation.checkStartActivityResult (Instrumentation.java:2071)
  at android.app.Instrumentation.execStartActivity (Instrumentation.java:1717)
  at android.app.Activity.startActivityForResult (Activity.java:5252)
  at androidx.fragment.app.FragmentActivity.startActivityForResult (FragmentActivity.java:6)
  at android.app.Activity.startActivityForResult (Activity.java:5203)
  at androidx.fragment.app.FragmentActivity.startActivityForResult (FragmentActivity.java:6)
  at android.app.Activity.startActivity (Activity.java:5581)
  at android.app.Activity.startActivity (Activity.java:5549)
  at com.nooriginalthought.amalfi.FirstRun.openWebPage (FirstRun.java:27)
  at com.nooriginalthought.amalfi.FirstRun.lambda$initialize$4 (FirstRun.java:1)
  at com.nooriginalthought.amalfi.FirstRun.lambda$initialize$4$FirstRun (FirstRun.java:1)
  at com.nooriginalthought.amalfi.-$Lambda$FirstRun$iHROIfEVj1qDNupIO6vj8JGEmlM.onClick (-.java:1)
  at android.view.View.performClick (View.java:7869)
  at android.widget.TextView.performClick (TextView.java:14958)
  at android.view.View.performClickInternal (View.java:7838)
  at android.view.View.access$3600 (View.java:886)
  at android.view.View$PerformClick.run (View.java:29362)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:8107)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100)
 

Комментарии:

1. Содержит ли ваш url_to_view http?

2. @SarahKhan Да, хорошо https. Это фиксированные пункты назначения, извлеченные из strings.xml ресурсов, в зависимости от того, на какую страницу должен быть направлен пользователь.

Ответ №1:

Есть ли способ защититься от этой ошибки?

Оберните любой startActivity() startActivityForResult() вызов or, который использует неявный Intent в try / catch block, где вы перехватываете ActivityNotFoundException . Имейте в виду, что пользователю вашего приложения не требуется иметь доступ к веб-браузеру (например, дочернему устройству с ограниченной учетной записью).

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

Это из com.nooriginalthought.amalfi.FirstRun.openWebPage (FirstRun.java:27) . У нас нет вашего полного файла, и мы не можем сообщить вам, какая это строка.

Обратите также внимание, что трассировка стека ссылается на startActivityForResult, чего я не делаю в данном случае, я просто запускаю новое действие в обычном режиме.

Ваш код вызывает startActivity() , как вы можете видеть в at android.app.Activity.startActivity (Activity.java:5549) строке трассировки стека. В конце концов, это вызывает startActivityForResult() внутренний вызов.