Открытие pdf файла Ошибка: к этому файлу невозможно получить доступ. Проверьте местоположение или сеть и повторите попытку. Android Oreo (Rx Java) - PullRequest
0 голосов
/ 18 марта 2020

Это похоже на похожий вопрос. Пожалуйста, не помечайте его как дубликат, поскольку я попробовал все решения из стека, но не решил мою проблему.

AndroidManifest. xml:

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

под тегом приложения:

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

путь_поставщика. xml:

<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

FileDownloaded.class:

import android.support.v4.content.FileProvider;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class FileDownloader extends FileProvider {
    private static final int  MEGABYTE = 1024 * 1024;

    public static void downloadFile(String fileUrl, File directory){
        try {

            URL url = new URL(fileUrl);
            HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
            //urlConnection.setRequestMethod("GET");
            //urlConnection.setDoOutput(true);
            urlConnection.connect();

            InputStream inputStream = urlConnection.getInputStream();
            FileOutputStream fileOutputStream = new FileOutputStream(directory);
            int totalSize = urlConnection.getContentLength();

            byte[] buffer = new byte[MEGABYTE];
            int bufferLength = 0;
            while((bufferLength = inputStream.read(buffer))>0 ){
                fileOutputStream.write(buffer, 0, bufferLength);
            }
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

кнопка onclick ():

    @Override
    public void onClick(View view) {

        Observable<String> observable = Observable.just
                ("http://enos.itcollege.ee/~jpoial/allalaadimised/reading/Android-Programming-Cookbook.pdf");

        DisposableObserver<String> observer = new DisposableObserver<String>() {
            @Override
            public void onNext(String s) {
                String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
                File folder = new File(extStorageDirectory, "test_the_pdf");
                folder.mkdir();

                File pdfFile = new File(folder, "Android-Programming-Cookbook.pdf");

                try {
                    pdfFile.createNewFile();
                } catch (IOException io) {
                    io.printStackTrace();
                }

                  FileDownloader.downloadFile(s, pdfFile);



            }

            @Override
            public void onError(Throwable e) {
                Toast.makeText(HomeActivity.this, "Error", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onComplete() {

                File pdfFile_1 = new File(Environment.getExternalStorageDirectory() + "/test_the_pdf/" + "Android-Programming-Cookbook.pdf");  // -> filename = maven.pdf
                //Uri path = Uri.fromFile(pdfFile);
                Uri path = FileProvider.getUriForFile
                        (context, context.getApplicationContext().getPackageName()
                                + ".provider", pdfFile_1);

                if (pdfFile_1.exists())
                {

                    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                    pdfIntent.setDataAndType(path, "application/pdf");
                   /* pdfIntent.setFlags
                            (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);*/
                    pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    pdfIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    pdfIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                   // pdfIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);


                    try {
                        startActivity(pdfIntent);
                    } catch (ActivityNotFoundException e) {
                        Toast.makeText(HomeActivity.this, "No Application available to view PDF", Toast.LENGTH_SHORT).show();
                    }
                }
                else
                {
                    Toast.makeText(context, "Hello Workd", Toast.LENGTH_SHORT).show();
                }
            }
        };

        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);


    }

Я использовал Rx Java для обработки фонового процесса.

Все сделал правильно.

Примечание: Stil получает ту же проблему на Acbrobat Reader. Google pdf reader- открывает и закрывает снова.

...