2017-04-27 5 views
0

の外部アプリケーションでローカルPDFを開く現在、WebView HTMLアプリケーションを作成しており、ローカルPDFファイルへのリンク(パスは相対的です)が機能していません。私はそれを外部アプリケーション(WebView内ではない)で開くだけです。私は成功していないこのサイトから複数のPDFの意図を試してみました。AndroidスタジオHTMLドキュメント

私はもともとpublic Boolean launchPDF上記Overrideを持っていたが、私はそれらの多くを持っているとして、私は、これはすべてのPDFファイルのための毛布文にする必要があり

:method does not override or implement method from a supertype 

を取得保管。

のAndroidManifest.xml:

import android.content.ActivityNotFoundException; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 

public class MainActivity extends AppCompatActivity { 

    private WebView myWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myWebView = (WebView) findViewById(R.id.webView); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setDomStorageEnabled(true); 
     myWebView.loadUrl("file:///android_asset/index.html"); 
    } 

    public boolean launchPDF(WebView view, String url) { 
     if (urlIsPDF(url)) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse(url), "application/pdf"); 
      try { 
       view.getContext().startActivity(intent); 
      } catch (ActivityNotFoundException e) { 
       //User does not have pdf viewer installed 
      } 
     } else { 
      myWebView.loadUrl(url); 
     } 
     return true; 
    } 

    public boolean urlIsPDF(String url) { 
     return url.endsWith(".pdf"); 
    } 
}; 
+0

「ローカルPDFファイルへの私のリンク」 - これはどういう意味ですか?あなたのHTMLは 'assets /'から来ています。あなたのPDFファイルが 'assets /'にもある場合、あなたはそれらをあなたがしようとしている方法で見ることができません。 – CommonsWare

+0

私は資産フォルダ(私のWebサーバーを複製)のPDFファイルのヒープのフォルダ構造を持っています。これは主にアウトオブサービスにアクセスするため、オフラインにする必要があります。どのように私はそれらをローカルで動作させることができますか? –

+0

私は同じファイルを使用して、サーバー上のフォルダ内のこれらのファイルにアクセスしているためです。私は手動でデバイス上のフォルダにそれらを置くことができますし、フォルダにpdf(* .pdf)のリンクをどのようにリダイレクトするか(例:ダウンロードまたはAppPdfs) –

答えて

0

1つのオプションは、assets/から直接、あなたのアプリケーションからPDFファイルを提供できるようにするmy StreamProviderを使用することです。これは設定が難しくなく、実行時にデータをコピーする必要はありません。 ACTION_VIEWIntentにはStreamProvider -supplied Uriを使用します。ただし、バグを修正するまでは、すべてのPDFビューア(特にGoogleドライブアプリに含まれていないもの)では動作しません。

互換性を高めるには、アセットをローカルファイルシステムのファイルにコピーしてください(例:getCacheDir())。その後、AndroidサポートライブラリのFileProviderを使用してください。コピーをしなければならない以外は、StreamProviderと同じ基本的な効果があります。 In-APKアセットから直接ではなく、ファイルから処理することで、PDFビューアとの互換性が向上しますが、contentUriの値を処理するバグのためにヒザップアップが発生することがあります。

さらに別の方法として、アプリに何らかの種類のPDF閲覧機能を組み込むことができます。 this blog postでは、私は3つのオプションの概要を説明します。互換性とサイズの面でトレードオフがあり、スタンドアローンのPDFビューアとして完全に機能するものはありません。

また、PDFをHTML/CSS /画像に変換してアプリにパッケージ化し、その内容をWebViewに表示するツールもあります。

+0

StreamProviderを挿入しますか?それは私にとって最善の選択肢のようです。これらのファイルは、ユーザーが削除することを望まないので、アプリケーションのどこかに保存するのが一番良いでしょう。 –

+0

@MitchellDay: "私は嫌ですユーザーは削除することができます」 - Android SDKが[内部ストレージ](https://commonsware.com/blog/2014/04/07/)と呼んでいるアプリの部分から削除することはできませんStreamProviderに関しては、CWAC-Providerリポジトリのデモプロジェクトに加えて、「StreamProvider」に関しては、私はいくつかの私の本の例では、[この1つ](https://github.com/commonsguy/cw-omnibus/tree/v8.5/DragDrop/SplitScreen/app/src/main/assets)。 – CommonsWare

+0

これでデータはどのように保存されますか?資産フォルダに残しておきますか?また、PDFを開くための包括的な声明を出すIntentを作成する方法もありますか?私はそれらがすべて一般的なpdfファイルではなくpdfのために定義されているように見えることに気付きました。もう一度申し訳ありませんが、これは非常に新しいです、私は主にウェブ開発です。 –

関連する問題