Как скачать pdf-файл в Android?

Я хочу загрузить pdf-файл с URL-адреса. Для просмотра файла pdf я использовал код ниже.

File file = new File("/sdcard/example.pdf"); if (file.exists()) { Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(OpenPdf.this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); } } 

Он работает, но как я могу получить файл pdf с URL- http://.../example.pdf (например, http://.../example.pdf ). Я хочу загрузить pdf-файл с этого URL-адреса. Пожалуйста, помогите мне. Заранее спасибо.

Загрузка PDF работает так же, как и загрузка любого другого двоичного файла.

  1. Открыть HttpUrlConnection
  2. Используйте метод getInputStream() подключения для чтения файла.
  3. Создайте FileOutputStream и напишите FileOutputStream .

Проверьте этот пост, например, исходный код.

Загрузить pdf:

  startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("www.education.gov.yk.ca/pdf/pdf-test.pdf"))); 

Ах, как я только что узнал, это зависит от устройства.

сценарии

  1. Он загрузит PDF в ваш браузер / загруженную / папку

  2. У вас есть учетная запись google docs – она ​​попросит вас войти в систему, а затем просмотреть pdf в браузере

  3. У вас установлен PDF-ридер – зависит от приложения

Во всех сценариях, хотя пользователь имеет доступ к PDF-файлу с одной строкой кода 🙂

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

1. Используйте AsyncTask и покажите ход загрузки в диалоговом окне

Этот метод позволит вам выполнять некоторые фоновые процессы и одновременно обновлять интерфейс (в этом случае мы обновим индикатор выполнения).

Это пример кода:

 // declare the dialog as a member field of your activity ProgressDialog mProgressDialog; // instantiate it within the onCreate method mProgressDialog = new ProgressDialog(YourActivity.this); mProgressDialog.setMessage("A message"); mProgressDialog.setIndeterminate(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); // execute this when the downloader must be fired final DownloadTask downloadTask = new DownloadTask(YourActivity.this); downloadTask.execute("the url to the file you want to download"); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { downloadTask.cancel(true); } }); 

AsyncTask будет выглядеть так:

 // usually, subclasses of AsyncTask are declared inside the activity class. // that way, you can easily modify the UI thread from here private class DownloadTask extends AsyncTask { private Context context; private PowerManager.WakeLock mWakeLock; public DownloadTask(Context context) { this.context = context; } @Override protected String doInBackground(String... sUrl) { InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { URL url = new URL(sUrl[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // expect HTTP 200 OK, so we don't mistakenly save error report // instead of the file if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage(); } // this will be useful to display download percentage // might be -1: server did not report the length int fileLength = connection.getContentLength(); // download the file input = connection.getInputStream(); output = new FileOutputStream("/sdcard/file_name.extension"); byte data[] = new byte[4096]; long total = 0; int count; while ((count = input.read(data)) != -1) { // allow canceling with back button if (isCancelled()) { input.close(); return null; } total += count; // publishing the progress.... if (fileLength > 0) // only if total length is known publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } } catch (Exception e) { return e.toString(); } finally { try { if (output != null) output.close(); if (input != null) input.close(); } catch (IOException ignored) { } if (connection != null) connection.disconnect(); } return null; } 

Метод выше ( doInBackground ) работает всегда в фоновом streamе. Вы не должны выполнять какие-либо задачи пользовательского интерфейса. С другой стороны, onProgressUpdate и onPreExecute работают в streamе пользовательского интерфейса, поэтому вы можете изменить индикатор выполнения:

  @Override protected void onPreExecute() { super.onPreExecute(); // take CPU lock to prevent CPU from going off if the user // presses the power button during download PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); mWakeLock.acquire(); mProgressDialog.show(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); // if we get here, length is known, now set indeterminate to false mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgress(progress[0]); } @Override protected void onPostExecute(String result) { mWakeLock.release(); mProgressDialog.dismiss(); if (result != null) Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show(); else Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); } 

Для этого вам нужно разрешение WAKE_LOCK.

  

2. Загрузить с сервисов

Большой вопрос: как мне обновить свою деятельность от службы? , В следующем примере мы собираемся использовать два classа, о которых вы, возможно, не знаете: ResultReceiver и IntentService . ResultReceiver – это тот, который позволит нам обновить наш stream из службы; IntentService – это подclass Service который генерирует stream для выполнения фоновой работы (вы должны знать, что Service работает на самом деле в том же streamе вашего приложения, когда вы расширяете Service , вы должны вручную создавать новые streamи для выполнения операций блокировки ЦП) ,

Сервис загрузки может выглядеть следующим образом:

 public class DownloadService extends IntentService { public static final int UPDATE_PROGRESS = 8344; public DownloadService() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { String urlToDownload = intent.getStringExtra("url"); ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); try { URL url = new URL(urlToDownload); URLConnection connection = url.openConnection(); connection.connect(); // this will be useful so that you can show a typical 0-100% progress bar int fileLength = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(connection.getInputStream()); OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress" ,(int) (total * 100 / fileLength)); receiver.send(UPDATE_PROGRESS, resultData); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (IOException e) { e.printStackTrace(); } Bundle resultData = new Bundle(); resultData.putInt("progress" ,100); receiver.send(UPDATE_PROGRESS, resultData); } } Сервис public class DownloadService extends IntentService { public static final int UPDATE_PROGRESS = 8344; public DownloadService() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { String urlToDownload = intent.getStringExtra("url"); ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); try { URL url = new URL(urlToDownload); URLConnection connection = url.openConnection(); connection.connect(); // this will be useful so that you can show a typical 0-100% progress bar int fileLength = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(connection.getInputStream()); OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress" ,(int) (total * 100 / fileLength)); receiver.send(UPDATE_PROGRESS, resultData); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (IOException e) { e.printStackTrace(); } Bundle resultData = new Bundle(); resultData.putInt("progress" ,100); receiver.send(UPDATE_PROGRESS, resultData); } } 

Добавьте службу в свой манифест:

  

И действие будет выглядеть так:

 // initialize the progress dialog like in the first example // this is how you fire the downloader mProgressDialog.show(); Intent intent = new Intent(this, DownloadService.class); intent.putExtra("url", "url of the file to download"); intent.putExtra("receiver", new DownloadReceiver(new Handler())); startService(intent); 

Вот как ResultReceiver :

 private class DownloadReceiver extends ResultReceiver{ public DownloadReceiver(Handler handler) { super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultCode == DownloadService.UPDATE_PROGRESS) { int progress = resultData.getInt("progress"); mProgressDialog.setProgress(progress); if (progress == 100) { mProgressDialog.dismiss(); } } } } 

2.1 Использование Groundy library

Groundy – это библиотека, которая в основном помогает вам запускать fragmentы кода в фоновом режиме и основана на концепции ResultReceiver показанной выше. В настоящий момент эта библиотека устарела . Так будет выглядеть весь код:

Активность, в которой вы показываете диалог …

 public class MainActivity extends Activity { private ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.btn_download).setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String url = ((EditText) findViewById(R.id.edit_url)).getText().toString().trim(); Bundle extras = new Bundler().add(DownloadTask.PARAM_URL, url).build(); Groundy.create(DownloadExample.this, DownloadTask.class) .receiver(mReceiver) .params(extras) .queue(); mProgressDialog = new ProgressDialog(MainActivity.this); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(false); mProgressDialog.show(); } }); } private ResultReceiver mReceiver = new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); switch (resultCode) { case Groundy.STATUS_PROGRESS: mProgressDialog.setProgress(resultData.getInt(Groundy.KEY_PROGRESS)); break; case Groundy.STATUS_FINISHED: Toast.makeText(DownloadExample.this, R.string.file_downloaded, Toast.LENGTH_LONG); mProgressDialog.dismiss(); break; case Groundy.STATUS_ERROR: Toast.makeText(DownloadExample.this, resultData.getString(Groundy.KEY_ERROR), Toast.LENGTH_LONG).show(); mProgressDialog.dismiss(); break; } } }; } 

Реализация GroundyTask используемая Groundy для загрузки файла и отображения прогресса:

 public class DownloadTask extends GroundyTask { public static final String PARAM_URL = "com.groundy.sample.param.url"; @Override protected boolean doInBackground() { try { String url = getParameters().getString(PARAM_URL); File dest = new File(getContext().getFilesDir(), new File(url).getName()); DownloadUtils.downloadFile(getContext(), url, dest, DownloadUtils.getDownloadListenerForTask(this)); return true; } catch (Exception pokemon) { return false; } } } 

И просто добавьте это в манифест:

  

Думаю, это было бы нелегче. Просто возьмите последнюю банку из Github, и вы готовы к работе. Имейте в виду, что основная цель Groundy – совершать вызовы на внешний REST apis в фоновом режиме и легко отправлять результаты в пользовательский интерфейс. Если вы делаете что-то подобное в своем приложении, это может быть действительно полезно.

2.2 Используйте https://github.com/koush/ion

3. Используйте class DownloadManager (только GingerBread и новее)

GingerBread принес новую функцию DownloadManager , которая позволяет легко загружать файлы и делегировать тяжелую работу по обработке streamов, streamов и т. Д. В систему.

Сначала рассмотрим утилиту:

 /** * @param context used to check the device version and DownloadManager information * @return true if the download manager is available */ public static boolean isDownloadManagerAvailable(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { return true; } return false; } 

Имя метода объясняет все это. Как только вы убедитесь, что DownloadManager доступен, вы можете сделать что-то вроде этого:

 String url = "url you want to download"; DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setDescription("Some descrition"); request.setTitle("Some title"); // in order for this if to run, you must use the android 3.2 to compile your app if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); 

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

Последние мысли

Первый и второй методы – только верхушка айсберга. Есть много вещей, которые вы должны иметь в виду, если хотите, чтобы ваше приложение было надежным. Вот краткий список:

  • Вы должны проверить, есть ли у пользователя доступ к Интернету
  • Убедитесь, что у вас есть права ( INTERNET и WRITE_EXTERNAL_STORAGE ); также ACCESS_NETWORK_STATE если вы хотите проверить доступность Интернета.
  • Убедитесь, что в каталоге вы собираетесь загружать файлы и имеете разрешения на запись.
  • Если загрузка слишком велика, вы можете захотеть реализовать способ возобновить загрузку, если предыдущие попытки не удались.
  • Пользователи будут благодарны, если вы разрешите им прервать загрузку.

Если вам не нужен подробный контроль процесса загрузки, рассмотрите возможность использования DownloadManager (3), поскольку он уже обрабатывает большинство элементов, перечисленных выше.

Но также подумайте, что ваши потребности могут измениться. Например, DownloadManager не выполняет кэширование ответов . Он будет слепо загружать один и тот же большой файл несколько раз. Нет простого способа исправить это после факта. Где, если вы начинаете с базового HttpURLConnection (1, 2), тогда вам нужно только добавить HttpResponseCache . Таким образом, первоначальные усилия по изучению базовых стандартных инструментов могут быть хорошей инвестицией.

Нет необходимости вводить длинный код для открытия и загрузки pdf в андроид, вы можете просто использовать ниже код для открытия и загрузки pdf

 String URL ="http://worldhappiness.report/wp-content/uploads/sites/2/2016/03/HR-V1_web.pdf" startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(URL))); 
 public static class Downloader { public static void DownloadFile(String fileURL, File directory) { try { FileOutputStream file = new FileOutputStream(directory); URL url = new URL(fileURL); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection .setRequestMethod("GET"); connection .setDoOutput(true); connection .connect(); InputStream input = connection .getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = input .read(buffer)) > 0) { file .write(buffer, 0, len ); } file .close(); } catch (Exception e) { e.printStackTrace(); } } 

Для получения дополнительной информации нажмите здесь http://androiddhina.blogspot.in/2015/09/how-to-download-pdf-from-url-in-android.html

  • Загрузка изображений с помощью node.js
  • Реализация паузы / возобновления загрузки файла
  • как возобновить прерванную загрузку - часть 2
  • Android написать в папку sd card
  • Резюме загрузки http-файла в java
  • Как загрузить видеофайл на SD-карту?
  • Принудительная загрузка файла на веб-сервере - ASP.NET C #
  • Мне нужен Content-Type: application / octet-stream для загрузки файла?
  • Веб-просмотр Android: загрузка файлов, таких как браузеры
  • Файлы и подпапки файлов PowerShell FTP
  • Возврат файла для просмотра / загрузки в ASP.NET MVC
  • Давайте будем гением компьютера.