在我的Android应用程序中调用Adobe Reader

7
我正在开发一款用于在设备上显示PDF文件的Android应用程序。我需要使用当前版本号(35498)的Adobe Reader来显示这些PDF文档。我已经编写了一些代码,可以在屏幕上显示文件列表。现在,我需要在单击每个文档时调用Adobe Reader(而不是设备上安装的其他PDF阅读器)。我不确定如何编写代码来实现这一点,因为我是一个Android新手。任何帮助将不胜感激。 谢谢! Navin

3
需要Adobe Reader的原因是什么?Android意图系统的整个目的就是使用用户选择(并可用的)PDF的应用程序。 - EboMike
@EboMike - 之所以选择Adobe Reader作为Android PDF阅读器中最好的,是因为它在外观和感觉方面远远超过其他我见过的PDF阅读器。另一个重要原因是,在其当前版本中,它不允许任何复制/粘贴/打印功能,我们不希望用户复制文档内容。有没有其他方法可以保护文档安全?正如我所说,我是Android的新手,我的话可能不正确。 - NavinC
1
无所谓。由用户决定什么是最适合他们需求的“最佳”阅读器。此外,如果用户没有安装特定的阅读器,您的方法将失败。 - EboMike
如果您想保证这种安全性,您应该编写自己的PDF解码器。将其限制在仅适用于Adobe Reader甚至更特定的版本并不是Android的构建方式,因此您需要进行一些黑客操作才能使其正常工作。 - jakebasile
4个回答

9

我看到你想要打开Adobe软件,但是你可能想考虑采用更像Android的方式来打开一个普通意图,并允许用户选择如何打开。参考以下代码:

private void openFile(File f, String mimeType)
{
    Intent viewIntent = new Intent();
    viewIntent.setAction(Intent.ACTION_VIEW);
    viewIntent.setDataAndType(Uri.fromFile(file), mimeType);
    // using the packagemanager to query is faster than trying startActivity
    // and catching the activity not found exception, which causes a stack unwind.
    List<ResolveInfo> resolved = getPackageManager().queryIntentActivities(viewIntent, 0);
    if(resolved != null && resolved.size() > 0)
    {
        startActivity(viewIntent);
    }
    else
    {
        // notify the user they can't open it.
    }
}

如果你确实需要同时使用特定版本的Adobe Reader,你需要使用PackageManager.getPackageInfo(String, int)进行查询。


8

尝试以下代码

private void loadDocInReader(String doc)
     throws ActivityNotFoundException, Exception {

    try {
                Intent intent = new Intent();

                intent.setPackage("com.adobe.reader");
                intent.setDataAndType(Uri.parse(doc), "application/pdf");

                startActivity(intent);

    } catch (ActivityNotFoundException activityNotFoundException) {
                activityNotFoundException.printStackTrace();

                throw activityNotFoundException;
    } catch (Exception otherException) {
                otherException.printStackTrace();

                throw otherException;
    }
}

1
显然,在现实生活中,您会想要用一个对话框替换catch()块,显示“您没有安装阅读器”。除此之外,很好。+1。 - EboMike

6
如果您处于“在线模式”,这里有一个使用Google文档的有趣替代方案。
String myPDFURL = "http://{link of your pdf file}";

String link;
try {
    link = "http://docs.google.com/viewer?url="
    + URLEncoder.encode(myPDFURL, "UTF-8")
    + "&embedded=true";
} catch (Exception e) {
    e.printStackTrace();
}

Uri uri = Uri.parse(link);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

2

这是可行的,但如果通过URL使用setDataAndType方法似乎无法正确识别PDF类型。

private static Intent newPDFLinkIntent(String url) {
    Uri pdfURL = Uri.parse(url);
    Intent pdfDownloadIntent = new Intent(Intent.ACTION_VIEW, pdfURL);
    pdfDownloadIntent.setType("application/pdf");
    pdfDownloadIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    return pdfDownloadIntent ;
}

很遗憾,我正在使用的PDF应用程序无法预测下载和缓存在线内容(有些会出现内存泄漏错误,有些会拒绝链接下载),因此您最终将调用一个意图首先下载PDF,然后通过通知链接打开已下载的内容。我最终使用了以下解决方案:

private static Intent newPDFLinkIntent(String url) {
    Intent pdfDownloadIntent = null;
    try {
        pdfDownloadIntent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
        pdfDownloadIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    } catch (URISyntaxException e) {
        Log.e("PDF Link Tag", e.getMessage());
    }
    return pdfDownloadIntent;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接