Как показать файл pdf из хранилища с помощью библиотеки AndroidPdfViewer?

Я хочу загрузить файл pdf из внешнего хранилища (Download / Pdfs / myfile.pdf) с помощью AndroidPdfViewer, но он показывает пустой экран без каких-либо ошибок. Я пробовал много способов, но это не сработало.

public class PdfViewActivity2 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
        PDFView pdfView = findViewById(R.id.pdfView);
        pdfView.fromFile(path).load();

У меня есть файл PDF в моем Download / Pdfs / myfile.pdf, и я использовал приведенный выше код для загрузки файла, но он не работает. Я дал разрешение на хранение вручную в настройках. Может ли кто-нибудь поправить меня, где я делаю ошибку.


person Gopal Meena    schedule 22.12.2020    source источник
comment
На устройстве Android 10?   -  person blackapps    schedule 22.12.2020
comment
Для всех устройств Android 4.0+   -  person Gopal Meena    schedule 29.12.2020
comment
have a pdf file in my "Download/Pdfs/myfile.pdf" Хорошо. Но это не соответствует вашему коду: Environment.getExternalStorageDirectory().getPath() + "/Download/myfile.pdf". Поскольку папка Pdfs отсутствует. Кстати, хорошая награда ;-)   -  person blackapps    schedule 29.12.2020
comment
Хорошо, я только что отредактировал эту папку, но если я добавлю папку Pdfs, она все равно не сработает. В настоящее время я тестирую это приложение на устройстве Android 10.   -  person Gopal Meena    schedule 29.12.2020


Ответы (4)


Я протестировал ваш код, и он отлично работает на устройстве Android 10. Вам не хватает чего-то из следующего:

1. В файле манифеста Android добавьте разрешение READ_EXTERNAL_STORAGE

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

а внутри тега приложения добавьте для requestLegacyExternalStorage значение true, чтобы иметь доступ к внешнему хранилищу на устройстве Android 10 и выше.

<application
        android:requestLegacyExternalStorage="true"

2. Убедитесь, что PDF-файл существует на устройстве по пути /Download/Pdfs/myfile.pdf.

3. Измените свою активность, используя приведенный ниже код, запросив разрешение на внешнее хранилище во время выполнения сначала в методе onCreate:

public class PdfViewActivity2 extends AppCompatActivity {

    private static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //check if Read External Storage permission was granded
        boolean granded = checkPermissionForReadExtertalStorage();
        if(!granded){
            requestPermissionForReadExtertalStorage();
        }
        else {
           readPdf();
        }
    }

    public boolean checkPermissionForReadExtertalStorage() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int result = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        return false;
    }

    public void requestPermissionForReadExtertalStorage() {
        try {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_STORAGE_PERMISSION_REQUEST_CODE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case READ_STORAGE_PERMISSION_REQUEST_CODE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted. Read Pdf from External Storage
                    readPdf();
                } else {
                    // permission denied. Disable the functionality that depends on this permission.
                }
            }
        }
    }

    private void readPdf(){
        File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
        PDFView pdfView = findViewById(R.id.pdfView);
        pdfView.fromFile(path).load();
    }
}
person MariosP    schedule 29.12.2020

Сначала добавьте библиотеку в файл build.gradle

implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

Чтобы открыть файл PDF из хранилища, используйте этот код. Есть комментарии, объясняющие, что он делает.

public class PdfViewActivity2  extends AppCompatActivity {

    // Declare PDFView variable
    private PDFView pdfView;
    private final int PDF_SELECTION_CODE = 99;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize it
        pdfView = findViewById(R.id.pdfView);

        // Select PDF from storage
        // This code can be used in a button
        Toast.makeText(this, "selectPDF", Toast.LENGTH_LONG).show();
        Intent browseStorage = new Intent(Intent.ACTION_GET_CONTENT);
        browseStorage.setType("application/pdf");
        browseStorage.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(Intent.createChooser(browseStorage, "Select PDF"), PDF_SELECTION_CODE);
    }


    // Get the Uniform Resource Identifier (Uri) of your data, and receive it as a result.
    // Then, use URI as the pdf source and pass it as a parameter inside this method fromUri(Uri uri)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PDF_SELECTION_CODE && resultCode == Activity.RESULT_OK && data != null) {
            Uri selectedPdfFromStorage = data.getData();
            pdfView.fromUri(selectedPdfFromStorage).defaultPage(0).load();
        }
    }
}
person Marwa Eltayeb    schedule 25.12.2020
comment
Спасибо за ответ, но, братан, я не хочу выбирать файл pdf, у меня есть указанный путь к файлу, и я хочу загрузить его, когда кто-нибудь откроет мое приложение. - person Gopal Meena; 29.12.2020

На устройстве Android 10 ваше приложение не имеет доступа к внешнему хранилищу.

Если вы не добавите

android:requestLegacyExternalStorage="true"

в теге приложения файла манифеста.

person blackapps    schedule 29.12.2020
comment
Но я видел много приложений, которые могут получить доступ к внешнему хранилищу без этого запроса. - person Gopal Meena; 29.12.2020
comment
На устройстве Android 10? Думаю, другая целевая или компилируемая версия. Назовите несколько приложений. - person blackapps; 29.12.2020
comment
Хорошо, они нацелены на API 29. - person Gopal Meena; 29.12.2020

Вместо использования fromFile () используйте fromSource (). т.е. объявить pathe как DocumentSource вместо File.

public class PdfViewActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DocumentSource path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/myfile.pdf");
    PDFView pdfView = findViewById(R.id.pdfView);
    pdfView.fromSource(path).load();
person Alwin Joseph    schedule 29.12.2020