AndroidRuntimeException при нажатии гиперссылки в диалоговом окне, показанном при первом запуске - PullRequest
0 голосов
/ 26 июня 2011

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

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
        at android.app.ContextImpl.startActivity(ContextImpl.java:651)
        at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
        at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:235)
        at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:330)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:143)
        at android.app.ActivityThread.main(ActivityThread.java:4717)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
        at dalvik.system.NativeStart.main(Native Method)

Действие, вызывающее исключение, устанавливается в файле манифеста следующим образом:

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

Это код, который создает диалог:

private Dialog createFirstRunDialog() {
    LayoutInflater inflator = (LayoutInflater)getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflator.inflate(R.layout.tutorial, (ViewGroup)findViewById(R.id.tutorialMain));

    WebView webView = (WebView)layout.findViewById(R.id.tutorialBody);
    webView.loadUrl(TUTORIAL_HTML_FILE);

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    dialogBuilder.setView(layout)
        .setCancelable(true)
        .setIcon(R.drawable.icon)
        .setTitle(R.string.tutorial_title)
        .setNegativeButton(R.string.tutorial_doneButton, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dismissDialog(TUTORIAL_DIALOG_ID);
            }
        });
    return dialogBuilder.create();
}

Ссылка в html (внутри ресурса) является типичной ссылкой mailto:

    <a href="mailto:support@myapp.com?subject=MyApp feature request">Tell us</a>

Поскольку диалог построен с помощью AlertDialog.Builder, а не явного намерения (фактически не вызывающего startActivity явно), я не могу (насколько мне известно) добавить флаг в качестве состояния сообщения об исключении. Я нашел здесь несколько постов с похожим исключением, но ни одно из них не было одинаковым или исправления, которые решили мою проблему. Заранее спасибо за помощь.

1 Ответ

1 голос
/ 26 июня 2011

Вы должны перехватить ссылку и обработать ее самостоятельно.

WebView webView = (WebView)layout.findViewById(R.id.tutorialBody);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:")) {
            MailTo mt = MailTo.parse(url);
            Intent intent = new Intent();
            intent.setType("text/html");
            intent.putExtra(Intent.EXTRA_EMAIL, new String[] {mt.getTo()});
            intent.putExtra(Intent.EXTRA_SUBJECT, mt.getSubject());
            startActivity(Intent.createChooser(intent, "Email ..."));
            return true;
        }
        return false;
    }
});
webView.loadUrl(TUTORIAL_HTML_FILE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...