Android не удалось показать PDF с помощью AssetManager

Я хочу открыть 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;
    }
}

И это запускается действием кнопки активности следующим образом, и URL-адрес пути к файлу PDF передается отсюда:

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();
                            }
                        }
                    });

Объявлен класс провайдера в манифесте, как показано ниже:

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

Пожалуйста, помогите мне в этом.


person Malhotra    schedule 12.06.2021    source источник
comment
Если AssetsProvider является ContentProvider, как указано в вашей записи манифеста, то, вероятно, вам не следует создавать его экземпляр самостоятельно. Если ваша цель состоит в том, что в onClick() вы хотите просмотреть PDF-файл, используйте startActivity() с ACTION_VIEW Intent, где Uri в этом Intent указывает на вашего поставщика и актив, который вы хотите, чтобы он обслуживал. Основы см. на stackoverflow.com/q/29477209/115145, хотя он использует ACTION_SEND, который работает немного по-другому.   -  person CommonsWare    schedule 12.06.2021
comment
FWIW, вы можете загрузить старое издание одной из моих книг. У меня есть пара глав по ContentProvider, в том числе примеры просмотра PDF-файла, предоставленного ContentProvider.   -  person CommonsWare    schedule 12.06.2021
comment
Пробовал так String theUri =file:///android_asset/Guide.pdf; Файл файл5 = новый файл (URI); Путь Uri = FileProvider.getUriForFile(getApplicationContext(),getApplicationContext().getPackageName()+.helper.AssetsProvider, file5);Намерение намерения = новое намерение(Intent.ACTION_VIEW); намерение.setDataAndType (путь, приложение/pdf); startActivity(намерение); Но нет надежды   -  person Malhotra    schedule 12.06.2021
comment
Это для использования FileProvider. FileProvider не поддерживает показ из ресурсов, и ваш код в вашем вопросе не использует FileProvider. Он использует реализацию AssetsProvider, которую вы написали. Вам нужно указать Uri, указывающий на ваш AssetsProvider. На глаз это будет content://om.star.form.eform.helper/Guide.pdf.   -  person CommonsWare    schedule 12.06.2021
comment
Без надежды. Пробовал так Uri theUri = Uri.parse(content://com.star.form.form.helper/file:///android_asset/Guide.pdf); Намерение намерение = новое намерение (Intent.ACTION_VIEW); намерение.setType(приложение/pdf); намерение.putExtra (намерение. EXTRA_STREAM, theUri);   -  person Malhotra    schedule 13.06.2021
comment
Пробовал вот так Uri theUri = Uri.parse(content://com.star.form.form.helper/file:///android_asset/Guide.pdf); -- это не то, что я предложил вам попробовать.   -  person CommonsWare    schedule 13.06.2021


Ответы (1)


если хотите

вы можете просто показать файл 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();
            }
         }
      });
   }
}
person Ajithkumar Muthukumaran    schedule 12.06.2021
comment
Пробовал это с моим путем к активу как String myPdfUrl = file:///android_asset/Guide.pdf; и выдает ошибку 400 - person Malhotra; 12.06.2021
comment
или попробуйте вставить URL-адрес в (облачный) диск, и вы используете WebView для загрузки этим простым способом - person Ajithkumar Muthukumaran; 12.06.2021