简体   繁体   English

通过android意图打开在线pdf文件?

[英]Open online pdf file through android intent?

Currently I have a pdf url , and I would like to simply using the intent to open it, however, it does not work if I put the url in intent目前我有一个 pdf url ,我想简单地使用意图打开它,但是,如果我把url放在intent中,它就不起作用

My code is like this, it always throw ActivityNotFoundException error我的代码是这样的,它总是抛出ActivityNotFoundException错误

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(law.url), "application/pdf");

try {
    startActivity(intent);
} catch (ActivityNotFoundException e){
    Utility.showErrorDialog(
        ctx,ctx.getResources().getString(R.string.sys_in, 
        ctx.getResources().getString(R.string.err_no_pdf_reader), 
        ctx.getResources().getString(R.string.close));
}

Also I tried the goolge doc approach but my client reject this, so I am not using this method我也尝试了 goolge doc 方法,但我的客户拒绝了,所以我没有使用这种方法

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.parse("http://docs.google.com/viewer?url=" 
+ publish.get(Integer.parseInt((String) view.getTag())).pdfURL), "text/html");  
ctx.startActivity(intent);

Thanks for help感谢帮助

Log cat error Update记录猫错误更新

04-23 18:18:50.487: E/AndroidRuntime(17161): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://oshc.zizsoft.com/oshc_testing.pdf typ=application/pdf }
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1568)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1439)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.app.Activity.startActivityForResult(Activity.java:3356)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.app.Activity.startActivityForResult(Activity.java:3317)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:848)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.support.v4.app.Fragment.startActivity(Fragment.java:878)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at com.example.oshpedia.Fragment.Shelf$4.onItemClick(Shelf.java:142)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at it.sephiroth.android.library.widget.AdapterView.performItemClick(AdapterView.java:299)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at it.sephiroth.android.library.widget.AbsHListView.performItemClick(AbsHListView.java:972)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at it.sephiroth.android.library.widget.AbsHListView$PerformClick.run(AbsHListView.java:2511)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at it.sephiroth.android.library.widget.AbsHListView$1.run(AbsHListView.java:3200)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.os.Handler.handleCallback(Handler.java:615)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.os.Looper.loop(Looper.java:137)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at android.app.ActivityThread.main(ActivityThread.java:4882)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at java.lang.reflect.Method.invokeNative(Native Method)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at java.lang.reflect.Method.invoke(Method.java:511)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
04-23 18:18:50.487: E/AndroidRuntime(17161):    at dalvik.system.NativeStart.main(Native Method)

You can view or download the pdf by either of the two ways ie by opening it in device in-built browser or in the webview by embedding it in your app.您可以通过两种方式之一查看或下载 pdf,即通过在设备内置浏览器中打开它或通过将其嵌入您的应用程序在 webview 中打开它。

To open the pdf in browser,要在浏览器中打开 pdf,

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(pdf_url));
startActivity(browserIntent);

Instead to open in webview,而不是在 webview 中打开,

 WebView webView = (WebView) findViewById(R.id.webView1);
 webView.getSettings().setJavaScriptEnabled(true);
 webView.loadUrl(pdf_url);

Best practice is wrapping your Intent to Chooser before starting.最佳实践是在开始之前将您的Intent包装到选择Chooser It provides users with built-in application selection dialog and lets avoid ActivityNotFoundException它为用户提供了内置的应用程序选择对话框,并让我们避免ActivityNotFoundException

Here a little example:这里有一个小例子:

Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setDataAndType(Uri.parse(msg.getData()), Constants.MIME_PDF);

Intent chooser = Intent.createChooser(browserIntent, getString(R.string.chooser_title));
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // optional

startActivity(chooser);

Where Constants.MIME_PDF is defined as String value "application/pdf".其中Constants.MIME_PDF被定义为字符串值“application/pdf”。


It is possible to ask PackageManager is this Intent has appropriate handling Activity or not.可以询问PackageManager这个Intent是否有适当的处理Activity

public static boolean isActivityForIntentAvailable(Context context, Intent intent) {
    final PackageManager packageManager = context.getPackageManager();
    List list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

you can view PDF in web view like this您可以像这样在网络视图中查看 PDF

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.parse( "http://docs.google.com/viewer?url=" + pdfLink), "text/html");

startActivity(intent);

you can view pdf in webview like this您可以像这样在 webview 中查看 pdf

WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginsEnabled(true);
webView.loadUrl("https://docs.google.com/viewer?"+pdf_url);

I see that you are trying this method defining the data type:我看到您正在尝试使用此方法定义数据类型:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

but it will cause:但它会导致:

ActivityNotFoundException: No Activity found to handle Intent ActivityNotFoundException:没有找到处理意图的活动

Use method without the type definition and it will work perfectly:使用没有类型定义的方法,它将完美地工作:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);

Download source code from here ( Open Pdf from url in Android Programmatically )从这里下载源代码( 从 Android 中的 url 以编程方式打开 Pdf

MainActivity.java主活动.java

package com.deepshikha.openpdf;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {
    WebView webview;
    ProgressBar progressbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webview = (WebView)findViewById(R.id.webview);
        progressbar = (ProgressBar) findViewById(R.id.progressbar);
        webview.getSettings().setJavaScriptEnabled(true);
        String filename ="http://www3.nd.edu/~cpoellab/teaching/cse40816/android_tutorial.pdf";
        webview.loadUrl("http://docs.google.com/gview?embedded=true&url=" + filename);

        webview.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String url){
                // do your stuff here
                progressbar.setVisibility(View.GONE);
            }
        });

    }
}

The actual error实际错误

android.content.ActivityNotFoundException: No Activity found to 
handle Intent 
{
 act=android.intent.action.VIEW 
 dat=http://oshc.zizsoft.com/oshc_testing.pdf typ=application/pdf 
}

This says that:这说:

  1. You " broadcast " and Intent to let the system try to open a PDF file您“ broadcast ”并意图让系统尝试打开PDF文件
  2. The system does not find any application registered to be able to handle this type of file ( PDF )系统未找到任何已注册的应用程序可以处理此类文件 ( PDF )

You just need a PDF viewer of some kind.您只需要某种PDF viewer

Solution解决方案

Get a PDF reader app or use @Mahendra's solution.获取PDF reader应用程序或使用 @Mahendra 的解决方案。

you can try this.你可以试试这个。 it works for both .pdf and .docx它适用于.pdf.docx

 String pdfUrl = "abc.pdf"; //
 String url = "http://docs.google.com/gview?embedded=true&url=" + pdfUrl;

 WebView webView = findViewById(R.id.webview_cv_viewer);
 webView.getSettings().setSupportZoom(true);
 webView.getSettings().setJavaScriptEnabled(true);
 webView.loadUrl(url);

View document using below method by default application in device.默认情况下,设备中的应用程序使用以下方法查看文档。 Here url is the docuement url.这里 url 是文档 url。

val browserIntent = Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse(url)
            )
            (view.context as AppActivity).startActivity(browserIntent)

You can follow this你可以按照这个

 Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(URL_HERE));
            startActivity(intent);

With kotlin using anko , simply call使用 kotlin 使用anko ,只需调用

 context.browse(PDF_URL)

to open any doc file, your browser will redirect you to the doc viewer app.要打开任何文档文件,您的浏览器会将您重定向到文档查看器应用程序。

If you want to use Google Docs , then append your pdf url as,如果您想使用Google Docs ,请将您的 pdf 网址附加为,

"http://docs.google.com/viewer?url=$PDF_URL"

If you use Intent you will be directed to browser all the Time So ,如果您使用 Intent,您将一直被定向到浏览器,所以,
Use PDFView Android Widget to View Pdf With in an Android application Assuming that you already have PDF Url or You can Pass the URL to this activity using Intent使用 PDFView Android Widget 在 Android 应用程序中查看 Pdf假设您已经有 PDF Url或者您可以使用 Intent 将 URL 传递给此活动

Step 1 : Add Dependencies第 1 步:添加依赖项

implementation 'com.github.barteksc:android-pdf-viewer:3.1.0-beta.1'
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

Sync the Gradle同步 Gradle

Step 2 : Create a Layout [Text View is Optional]第 2 步:创建布局 [文本视图是可选的]

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewPdf">




    <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/ViewPdf"
        android:layout_height="match_parent"
        android:layout_width="match_parent"

        />

    <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        />
</RelativeLayout>

Step 3 : Here is the Activity.java files code , Add URL to pdfUrl variable in middle of the code第 3 步:这是 Activity.java 文件代码,将 URL 添加到代码中间的pdfUrl变量

package com.example.firebase;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.Image;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;

import com.github.barteksc.pdfviewer.PDFView;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ViewPdf extends AppCompatActivity {

    private TextView txt; // You can remove if you don't want this
    private PDFView pdf;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pdf);
        pdf = findViewById(R.id.ViewPdf);
        txt = findViewById(R.id.txt);

        //Intent inten = getIntent();
        String pdfUrl = "Add PDF url"
        //Toast.makeText(this, pdfUrl, Toast.LENGTH_SHORT).show();


        try{
            new RetrievePdfStream().execute(pdfUrl);
        }
        catch (Exception e){
            Toast.makeText(this, "Failed to load Url :" + e.toString(), Toast.LENGTH_SHORT).show();
        }
    }


class RetrievePdfStream extends AsyncTask<String, Void, InputStream>{
    @Override
    protected InputStream doInBackground(String... strings) {
        InputStream inputStream = null;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            if (urlConnection.getResponseCode() == 200) {
                inputStream = new BufferedInputStream(urlConnection.getInputStream());

            }
        } catch (IOException e) {
            return null;

        }
        return inputStream;
    }
        @Override
        protected void onPostExecute(InputStream inputStream) {
            pdf.fromStream(inputStream).load();
        }
    }
}

STEP 4 : Don't Forget to change / Give the pdf url in above code to make it work第 4 步:不要忘记更改/在上面的代码中提供 pdf url 以使其工作

you can use the SkewPdfView library for loading pdf from remote urls.您可以使用 SkewPdfView 库从远程 url 加载 pdf。

First of all, Add following in your root build.gradle:首先,在您的根 build.gradle 中添加以下内容:

allprojects {
repositories {
    ...
    maven { url 'https://jitpack.io' }
}

} }

and add the SkewPdfView Library as:并将 SkewPdfView 库添加为:

dependencies {
    implementation 'com.github.naya-aastra:SkewPdfView:1.1'
}

Now Include SkewPdfView in your layout:现在在您的布局中包含 SkewPdfView:

<com.nayaastra.skewpdfview.SkewPdfView
    android:id="@+id/skewPdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Load a PDF file programmatically as:以编程方式加载 PDF 文件,如下所示:

SkewPdfView skewPdfView;
skewPdfView = findViewById(R.id.skewPdfView);
skewPdfView.loadPdf(pdfLink);

PS link of SkewPdfView library SkewPdfView 库的 PS 链接

SkewPdfView Github Page SkewPdfView Github 页面

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM