android - Android 无法使用 AssetManager 显示 PDF
问题描述
我想从我的活动按钮操作的资产文件夹中打开一个 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" />
请指导我。
解决方案
如果想要
你可以简单地显示pdf文件WebView
在你的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();
}
}
});
}
}
推荐阅读
- javascript - 如何在断点处重新排序 div/更改标记
- python - 如何编写代码来读取输出文件以找出它在抓取网站中的距离,然后从它停止的地方开始
- flutter - 当用户在颤动中转到下一个文本文件时,我如何获得文本字段的值
- javascript - 用两个动作提交相同的表格?
- python - 在 Raspberry Pi Stretch 上安装 opencv 3.3.0 时 cv2 文件中出现无效转换错误
- excel - Excel 将执行相同操作的公式或 vba 函数的下拉列表
- elasticsearch - 如何在弹性搜索的突出显示部分应用布尔值(必须,应该)?
- react-native - get-stream 是否也适用于不基于博览会的常规 react-native 项目?
- outlook - EWS订阅在什么情况下会失效?
- javascript - 如何使 CodeMirror 从一定数量的行开始,并根据用户类型展开尽可能多的行?