2012-05-10 15 views
0

このように、webviewでユーザーがクリックしたリンクが必要です。この場合は、.pdfファイルを含むリンクです。私はPDFリーダーを起動するコードを持っていますが、リンクを取得しないので、PDFファイルをクリックしてPDFリーダーを読み込むだけです。このリンクを傍受してPDFリーダの意図にどのようにフィードするのですか?Android - Intercept Link from Webview

コード:

public class atcFaa extends Activity { 
WebView webview; 
private String url; 
ProgressBar pd = null; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.atccti); 

    pd = (ProgressBar) findViewById(R.id.web_view_progress_bar); 

    webview = (WebView) findViewById(R.id.ctiWebView); 
    webview.getSettings().setJavaScriptEnabled(true); 

    Button openPdfBtn = new Button(this); 
    webview.addJavascriptInterface(openPdfBtn, "openPdfBtn"); 
    openPdfBtn.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      openPdf(); 
     } 
    }); 

    webview.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 
      if (progress < 100 && pd.getVisibility() == ProgressBar.GONE) { 
       pd.setVisibility(ProgressBar.VISIBLE); 
      } 
      pd.setProgress(progress); 
      if (progress == 100) { 
       pd.setVisibility(ProgressBar.GONE); 
      } 
     } 
    }); 

    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      webview.getSettings().setJavaScriptEnabled(true); 
      // do your handling codes here, which url is the requested url 
      // probably you need to open that url rather than redirect: 
      if (url.startsWith("tel:")) { 
       startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); 
      } else 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 }); 
       startActivity(i); 

      } else if (url.startsWith("geo:")) { 
       try { 
       } catch (Exception e) { 
        System.out.println(e); 
       } 

      } else if (url.endsWith("pdf")) { 
       try { 

       } 

       catch (ActivityNotFoundException e) { 
        Toast.makeText(atcFaa.this, "No PDF Viewer Installed", 
          Toast.LENGTH_LONG).show(); 
       } 
      } 

      else { 
       view.loadUrl(url); 
      } 
      return true; 
      // then it is not handled by default action 
     } 

    }); 

    webview.loadUrl("http://www.faa.gov/air_traffic/publications/"); 
} 

protected void openPdf() { 
    // TODO Auto-generated method stub 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_VIEW); 
    Uri uri = Uri.parse(url); 
    intent.setDataAndType(uri, "application/pdf"); 
    startActivity(intent); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu2, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.atcAbout2: 
     Toast.makeText(this, "You pressed the icon!", Toast.LENGTH_LONG) 
       .show(); 
     break; 
    case R.id.atcContact2: 
     emailme(); 
     break; 

    } 
    return true; 
} 

private void emailme() { 
    // TODO Auto-generated method stub 
    String domsEmail = "[email protected]"; 
    String message = "Insert Message Here"; 
    String myemail[] = { domsEmail }; 
    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, myemail); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
      "ATC Assistant"); 
    emailIntent.setType("plain/text"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, message); 
    startActivity(emailIntent); 
} 

/* 
* @Override public void onBackPressed() { if (webview.canGoBack()) 
* webview.goBack(); else super.onBackPressed(); } 
*/ 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getUrl() { 
    return url; 
} 
} 
+0

- あなただけのあなたのopenPdfをコールする必要があります( )関数を "endswith(pdf)"の場合に使用します。 – theelfismike

答えて

1

私はあなたのhtmlコードの構造を知らないが、私はあなたがボタンを持っているふりをします。

<button onclick='openPdfBtn.performClick();'>Open pdf</button> 

をして、あなたのWebViewのにjsのインターフェイスを追加します:ここでは、コードをHTMLに持っているあなたは、すでにリンクの負荷をオーバーライドしている

Button openPdfBtn = new Button(this); //this is not gonna be visible 
yourWebView.addJavascriptInterface(openPdfBtn, "openPdfBtn"); //here you bind the js with the native button 
openPdfBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     openPdf(); 
    } 
}); 
+0

私はボタンがない、それは純粋なwebviewです。私は、PDFファイルへのリンクがクリックされ、それを表示する方法を起動するか、またはそれを表示するためにGoogleドキュメントに読み込むことをアプリケーションが認識するようにします。 – user1363871

+0

純粋なwebviewとはどういう意味ですか?あなたはhtmlのコントロールがありませんか?あなたは一般的なhtmlページを開きますか? – gwa

+0

私はリンクyesを指定しますが、ページのビューに過ぎません。このページには、私が見たいと思っているPDFファイルのリンクがあります。完全なコードで元の投稿を編集します。 – user1363871