Скачать и просмотреть PDF во внутреннем хранилище с помощью Async Task в Android - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь программно загрузить и прочитать pdf с сервера, используя AsyncTask, но не получаю ответа. У меня также есть seekBar, который показывает прогресс загрузки.

Где я ошибаюсь?

private void initSeekBar() {
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
               int val = (progress * (seekBar.getWidth() - 3
               * seekBar.getThumbOffset())) / seekBar.getMax();
               mProgressText.setText("" + progress);
               mProgressText.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

для загрузки файла

private void downloadFile(final String fileName){
    new AsyncTask<Void, Integer, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... params) {
            return downloadFile();
        }
        @Nullable
        private Boolean downloadFile(){
            try {
                File file = getFileStreamPath(fileName);
                if (file.exists()) {
                    downloadButton.setText("Start Reading");
                    return true;
                }
                try {
                    seekBar.setVisibility(View.VISIBLE);
                    mProgressText.setVisibility(View.VISIBLE);
                    FileOutputStream fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
                    URL url = new URL(document);
                    URLConnection urlConnection = url.openConnection();
                    int contentLength = urlConnection.getContentLength();
                    InputStream inputStream = new BufferedInputStream(url.openStream());
                    byte data[] = new byte[contentLength];
                    long total = 0;
                    int count;
                    while ((count = inputStream.read(data)) != -1) {
                        total += count;
                        publishProgress((int) ((total * 100) / contentLength));
                        fileOutputStream.write(data, 0, count);

                    }
                    fileOutputStream.flush();
                    fileOutputStream.close();
                    inputStream.close();
                    return true;
                } catch (final Exception e) {
                    e.printStackTrace();
                    return false; //swallow a 404
                }
            }catch (Exception e){
                  e.printStackTrace();
                }
                return false;

            }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            seekBar.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if(aBoolean){
                downloadButton.setText("Start Reading");
            } else {
                Toast.makeText(BookDetailsActivity.this, "Download error", Toast.LENGTH_SHORT).show();
                downloadButton.setText("Download");
            }
            seekBar.setVisibility(View.GONE);
            mProgressText.setVisibility(View.GONE);
        }
    };

}

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Наконец-то я получил решение своей проблемы. Я должен был позвонить по этой линии,

asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Это полный код:

 private void initSeekBar() {
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
               int val = (progress * (seekBar.getWidth() - 3
               * seekBar.getThumbOffset())) / seekBar.getMax();
               mProgressText.setText("" + progress);
               mProgressText.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

для загрузки файла

 private void downloadFile(final String fileName){
        AsyncTask<Void, Integer, Boolean> asyncTask = new AsyncTask<Void, Integer, Boolean>() {
            @Override
            protected Boolean doInBackground(Void... params) {
                seekBar.setVisibility(View.VISIBLE);
                mProgressText.setVisibility(View.VISIBLE);
                return downloadFile();
            }
            @Nullable
            private Boolean downloadFile(){
                try {
                    File file = getFileStreamPath(fileName);
                    if (file.exists()) {
                        downloadButton.setText("Start Reading");
                        return true;
                    }
                    try {
                        FileOutputStream fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
                        URL url = new URL(document);
                        URLConnection urlConnection = url.openConnection();
                        int contentLength = urlConnection.getContentLength();
                        InputStream inputStream = new BufferedInputStream(url.openStream());
                        byte data[] = new byte[contentLength];
                        long total = 0;
                        int count;
                        while ((count = inputStream.read(data)) != -1) {
                            total += count;
                            publishProgress((int) ((total * 100) / contentLength));
                            fileOutputStream.write(data, 0, count);

                        }
                        fileOutputStream.flush();
                        fileOutputStream.close();
                        inputStream.close();
                        return true;
                    } catch (final Exception e) {
                        e.printStackTrace();
                        Toast.makeText(BookDetailsActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
                        Toast.makeText(BookDetailsActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
                        return false; //swallow a 404
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    Toast.makeText(BookDetailsActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
                }
                return false;

            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                seekBar.setProgress(values[0]);
            }

            @Override
            protected void onPostExecute(Boolean aBoolean) {
                super.onPostExecute(aBoolean);
                if(aBoolean){
                    downloadButton.setText("Start Reading");
                } else {
                    Toast.makeText(BookDetailsActivity.this, "Download error", Toast.LENGTH_SHORT).show();
                    downloadButton.setText("Download");
                }
                seekBar.setVisibility(View.GONE);
                mProgressText.setVisibility(View.GONE);
            }
        };
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
0 голосов
/ 10 мая 2019

Использование этого кода может вам помочь.Я создаю событие нажатия одной кнопки, которое загружает файл pdf с сервера.

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class DownloadActivity extends Activity {

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


    public void download(View v)
    {
        new DownloadFile().execute("your url", "save file name .pdf extenstion"); 
    }

    public void view(View v)
    {
        File pdfFile = new File(Environment.getExternalStorageDirectory() + "/test/" + "demo.pdf");  // -> filename = demo.pdf
        Uri path = Uri.fromFile(pdfFile);
        Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
        pdfIntent.setDataAndType(path, "application/pdf");
        pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

    private class DownloadFile extends AsyncTask<String, Void, Void>{

        @Override
        protected Void doInBackground(String... strings) {
            String fileUrl = strings[0];   
            String fileName = strings[1];
            String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            File folder = new File(extStorageDirectory, "test");
            folder.mkdir();

            File pdfFile = new File(folder, fileName);

            try{
                pdfFile.createNewFile();
            }catch (IOException e){
                e.printStackTrace();
            }
            FileDownloader.downloadFile(fileUrl, pdfFile);
            return null;
        }
    }


}

Класс FileDownloader для загрузки файла pdf

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

В конце добавьте это разрешение в файл манифеста.

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

Спасибо ... Happy Coding ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...