【发布时间】: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" />
请指导我。
【问题讨论】:
-
如果
AssetsProvider是ContentProvider,正如您的清单条目所示,那么您可能不应该自己创建它的实例。如果您的目标是在onClick()中查看 PDF,请使用startActivity()和ACTION_VIEWIntent,其中Uri在Intent中指向您的提供商和您的资产想为它服务。有关基础知识,请参阅 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”);开始活动(意图);但没有希望
-
那是为了使用
FileProvider。FileProvider不支持从资产提供服务,并且您问题中的代码未使用FileProvider。它使用您编写的AssetsProvider实现。您需要提供指向您的AssetsProvider的Uri。通过眼球,这似乎是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