4

アプリに埋め込まれた webview の mailto: リンクを傍受しようとしています。私が持っているものは正常に機能していますが、ユーザーがリンクを押すと、アプリに戻ったときにリンクがぼやけます。これが私の WebViewClient で行っていることです

    @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(url.startsWith("mailto:")){
        url = url.replaceFirst("mailto:", "");
        url = url.trim();
        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL, new String[]{url});
        context.startActivity(i);
        return true;
    }
    context.findViewById(R.id.loadingBar).setVisibility(View.VISIBLE);
    view.loadUrl(url);
    return true;
}

view.reload() を実行すると問題は解決しますが、帯域幅を浪費せずに問題を解決するより良い方法はありますか? invalidate() を試しましたが、うまくいきませんでした。

これが私が話していることの例です代替テキスト

4

3 に答える 3

6

James Grayの回答のより堅牢なバージョンを次に示します。複数のアドレス (カンマ区切り) と複数の 'cc'/'bcc' パラメータを処理する必要があります。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

  if (url == null) {
    return false;
  }
  if (url.startsWith("market://")) {
    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    return true;
  }
  if (url.startsWith("mailto:")) {

    try {
      List<String> to = new ArrayList<String>();
      List<String> cc = new ArrayList<String>();
      List<String> bcc = new ArrayList<String>();
      String subject = null;
      String body = null;

      url = url.replaceFirst("mailto:", "");

      String[] urlSections = url.split("&");
      if (urlSections.length >= 2) {

        to.addAll(Arrays.asList(urlSections[0].split(",")));

        for (int i = 1; i < urlSections.length; i++) {
          String urlSection = urlSections[i];
          String[] keyValue = urlSection.split("=");

          if (keyValue.length == 2) {
            String key = keyValue[0];
            String value = keyValue[1];

            value = URLDecoder.decode(value, "UTF-8");

            if (key.equals("cc")) {
              cc.addAll(Arrays.asList(url.split(",")));
            }
            else if (key.equals("bcc")) {
              bcc.addAll(Arrays.asList(url.split(",")));
            }
            else if (key.equals("subject")) {
              subject = value;
            }
            else if (key.equals("body")) {
              body = value;
            }
          }
        }
      }
      else {
        to.addAll(Arrays.asList(url.split(",")));
      }

      Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
      emailIntent.setType("message/rfc822");

      String[] dummyStringArray = new String[0]; // For list to array conversion
      emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, to.toArray(dummyStringArray));
      if (cc.size() > 0) {
        emailIntent.putExtra(android.content.Intent.EXTRA_CC, cc.toArray(dummyStringArray));
      }
      if (bcc.size() > 0) {
        emailIntent.putExtra(android.content.Intent.EXTRA_BCC, bcc.toArray(dummyStringArray));
      }
      if (subject != null) {
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
      }
      if (body != null) {
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
      }
      view.getContext().startActivity(emailIntent);

      return true;
    }
    catch (UnsupportedEncodingException e) {
      /* Won't happen*/
    }

  }
  return false;
}
于 2013-11-11T15:55:52.637 に答える
3

これは私が持っているものです:

if (url.startsWith("mailto:")) {
    String[] blah_email = url.split(":");
    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
    Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
    startActivity(emailIntent);
}

「前」と後が見えないので... リンクの太字属性を削除 (または追加) しているようです - CSS (おそらく JavaScript/Jquery) をチェックして、またはa:visitedが含まれているかどうかを確認します属性。font-weight: normal;font-weight: bold

于 2011-03-31T01:48:36.797 に答える
2

これは、MailTo クラスを使用しない、より複雑なバージョンです (これは、何らかの理由で完全な mailto リンクを正しく解析しません。メール、cc、bcc、件名、および本文が存在する限り、連続して取得します。そうでない場合「存在しない場合はそれらをスキップして次へ進みます。ただし、これにはリンクの作成者がすべてを順番に配置する必要があります。順序が正しくない場合は機能しません。後で別のものを作成する可能性がありますが、どの順序であるかは気にしません。入っています。

気にする人のために、これにより、マーケット アプリへの直接リンクも同様に機能します。

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url == null) { return false; }
    if (url.startsWith("market://")) {
        view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    }
    if (url.startsWith("mailto:")) {
        url = url.replaceFirst("mailto:", "");
        //
        String theEmail = "",
            theEmailCC = "",
            theEmailBCC = "",
            theSubject = "",
            theBody = "";
        Boolean hasEmail = true,
            hasEmailCC = url.contains("&cc="),
            hasEmailBCC = url.contains("&bcc="),
            hasSubject = url.contains("&subject="),
            hasBody = url.contains("&body=");
        int posEmail = 0,
            posEmailCC = hasEmailCC ? url.indexOf("&cc=") : 0,
            posEmailBCC = hasEmailBCC ? url.indexOf("&bcc=") : 0,
            posSubject = hasSubject ? url.indexOf("&subject=") : 0,
            posBody = hasBody ? url.indexOf("&body=") : 0;
        //
        if        (hasEmail    && hasEmailCC ) { theEmail    = url.substring(posEmail, posEmailCC - posEmail);
        } else if (hasEmail    && hasEmailBCC) { theEmail    = url.substring(posEmail, posEmailBCC - posEmail);
        } else if (hasEmail    && hasSubject ) { theEmail    = url.substring(posEmail, posSubject - posEmail);
        } else if (hasEmail    && hasBody    ) { theEmail    = url.substring(posEmail, posBody - posEmail);
        } else if (hasEmail                  ) { theEmail    = url;
        } else {                               /*theEmail    = url;*/ }

        if        (hasEmailCC  && hasEmailBCC) { theEmailCC  = url.substring(posEmailCC, posEmailBCC - posEmailCC);
        } else if (hasEmailCC  && hasSubject ) { theEmailCC  = url.substring(posEmailCC, posSubject - posEmailCC);
        } else if (hasEmailCC  && hasBody    ) { theEmailCC  = url.substring(posEmailCC, posBody - posEmailCC);
        } else if (hasEmailCC                ) { theEmailCC  = url.substring(posEmailCC);
        } else {                               /*theEmailCC  = url.substring(posEmailCC);*/ }
        theEmailCC = theEmailCC.replace("&cc=", "");

        if        (hasEmailBCC && hasSubject ) { theEmailBCC = url.substring(posEmailBCC, posSubject - posEmailBCC);
        } else if (hasEmailBCC && hasBody    ) { theEmailBCC = url.substring(posEmailBCC, posBody - posEmailBCC);
        } else if (hasEmailBCC               ) { theEmailBCC = url.substring(posEmailBCC);
        } else {                               /*theEmailBCC = url.substring(posEmailBCC);*/ }
        theEmailBCC = theEmailBCC.replace("&bcc=", "");

        if        (hasSubject  && hasBody    ) { theSubject  = url.substring(posSubject, posBody - posSubject);
        } else if (hasSubject                ) { theSubject  = url.substring(posSubject);
        } else {                               /*theSubject  = url.substring(posSubject);*/ }
        theSubject = theSubject.replace("&subject=", "");

        if        (hasBody                   ) { theBody     = url.substring(posBody);
        } else {                               /*theBody     = url.substring(posBody);*/ }
        theBody = theBody.replace("&body=", "");

        theSubject = theSubject.replace("%20", " ");
        theBody = theBody.replace("%20", " ").replace("%0A", "\n");
        //
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.setType("message/rfc822");
        //
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { theEmail, });
        if (hasEmailCC) { emailIntent.putExtra(android.content.Intent.EXTRA_CC, theEmailCC); }
        if (hasEmailBCC) { emailIntent.putExtra(android.content.Intent.EXTRA_BCC, theEmailBCC); }
        if (hasSubject) { emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, theSubject); }
        if (hasBody) { emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, theBody); }
        //
        view.getContext().startActivity(emailIntent);
        //
        return true;
    }
    return false;
}
于 2013-01-14T20:55:48.750 に答える