【问题标题】:Android Failed to Show PDF using AssetManagerAndroid 无法使用 AssetManager 显示 PDF
【发布时间】:2021-08-29 03:47:17
【问题描述】:

我想通过我的活动按钮操作从资产文件夹中打开一个 PDF,我使用了以下代码,但没有任何反应。

 public class AssetsProvider extends ContentProvider {
    @Override
    public AssetFileDescriptor openAssetFile(Uri uri, String mode ) throws FileNotFoundException
    {
    AssetManager am = getContext( ).getAssets( );
    String file_name = uri.getPath().substring(1, uri.getPath().length());
    if( file_name == null )
            throw new FileNotFoundException( );

    AssetFileDescriptor afd = null;
    try
    {
        afd = am.openFd( file_name );
    }
    catch(IOException e)
    {
        e.printStackTrace( );
    }
   return afd;
}
@Override
    public String getType( Uri p1 )
    {
        return null;
    }
 @Override
    public int delete( Uri p1, String p2, String[] p3 )
    {
        return 0;
    }
 @Override
    public Cursor query( Uri p1, String[] p2, String p3, String[] p4, String p5 )
    {
        return null;
    }
@Override
    public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
    {
        return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
    }
    @Override
    public Uri insert( Uri p1, ContentValues p2 )
    {
        return null;
    }
  @Override
    public boolean onCreate( )
    {
        return false;
    }
 @Override
    public int update( Uri p1, ContentValues p2, String p3, String[] p4 )
    {
        return 0;
    }
}

它是由一个活动按钮动作触发的,如下所示,pdf文件路径url从这里传递:

btn_help.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
    try {
                               new  AssetsProvider().openAssetFile(Uri.parse("file:///android_asset/Guide.pdf"),null);
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            }
                        }
                    });

在 Manifest 上声明提供程序类,如下所示:

 <provider
            android:name="com.star.form.helper.AssetsProvider"
            android:authorities="om.star.form.eform.helper"
            android:grantUriPermissions="true"
            android:exported="true" />

请指导我。

【问题讨论】:

  • 如果AssetsProviderContentProvider,正如您的清单条目所示,那么您可能不应该自己创建它的实例。如果您的目标是在 onClick() 中查看 PDF,请使用 startActivity()ACTION_VIEW Intent,其中 UriIntent 中指向您的提供商和您的资产想为它服务。有关基础知识,请参阅 stackoverflow.com/q/29477209/115145,尽管它使用 ACTION_SEND,其工作方式略有不同。
  • FWIW,你可以下载this older edition of one of my books。我有几章关于ContentProvider,包括查看ContentProvider 提供的PDF 的示例。
  • 试过这样 String theUri ="file:///android_asset/Guide.pdf";文件 file5 = 新文件(theUri); Uri path = FileProvider.getUriForFile(getApplicationContext(),getApplicationContext().getPackageName()+".helper.AssetsProvider", file5);Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(路径,“应用程序/pdf”);开始活动(意图);但没有希望
  • 那是为了使用FileProviderFileProvider 不支持从资产提供服务,并且您问题中的代码未使用 FileProvider。它使用您编写的AssetsProvider 实现。您需要提供指向您的AssetsProviderUri。通过眼球,这似乎是content://om.star.form.eform.helper/Guide.pdf
  • 没有希望。像这样尝试过 Uri theUri = Uri.parse("content://com.star.form.form.helper/file:///android_asset/Guide.pdf"); Intent 意图 = new Intent(Intent.ACTION_VIEW); intent.setType("应用程序/pdf"); intent.putExtra(Intent.EXTRA_STREAM,theUri);

标签: android android-assets androidpdfviewer android-pdf-api android-assetmanager


【解决方案1】:

如果需要

您可以在WebView中简单地显示pdf文件

在你的 java 类中

btn_help.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
           Intent myIntent = new Intent(yourActivity.this, WebviewActivity.class);
        startActivity(intent);
                        }
                    });

创建 webview.xml

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   xmlns:app = "http://schemas.android.com/apk/res-auto"
   xmlns:tools = "http://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:gravity = "center"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity"
   android:orientation = "vertical">
   <WebView
      android:id = "@+id/web_view"
      android:layout_width = "match_parent"
      android:layout_height = "match_parent" />
</LinearLayout>

并创建 WebviewActivity.java

import android.app.ProgressDialog;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
public class WebviewActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.webview);
      final ProgressDialog progressDialog = new ProgressDialog(this);
      progressDialog.setMessage("Loading Data...");
      progressDialog.setCancelable(false);
      WebView web_view = findViewById(R.id.web_view);
      web_view.requestFocus();
      web_view.getSettings().setJavaScriptEnabled(true);
      String myPdfUrl = "YOURASSETPATH";
      String url = "https://docs.google.com/viewer?embedded = true&url = "+myPdfUrl;
      web_view.loadUrl(url);
      web_view.setWebViewClient(new WebViewClient() {
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
         }
      });
      web_view.setWebChromeClient(new WebChromeClient() {
         public void onProgressChanged(WebView view, int progress) {
            if (progress < 100) {
               progressDialog.show();
            }
            if (progress = = 100) {
               progressDialog.dismiss();
            }
         }
      });
   }
}

【讨论】:

  • 用我的资产路径作为 String myPdfUrl = "file:///android_asset/Guide.pdf";它显示错误 400
  • 或尝试将 url 粘贴到(云)驱动器中,然后使用 WebView 加载这种简单的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2017-10-25
  • 2016-03-07
  • 1970-01-01
  • 2021-09-29
  • 2021-02-17
相关资源
最近更新 更多