Blog スタッフブログ

Android システム開発

[Android][Kotlin]PDFをダウンロードし、表示する方法

システム開発担当のTFです。

※Android10対応(他バージョンの場合、細かい部分等が異なる事があります)

やり方

  • DownloadManagerを用い、PDFをダウンロードする
  • その際、必要に応じて、Basic認証や、ログインのcookieをセットする
  • ダウンロード完了後、Intentにて、ファイルを開く

参考

  DownloadManager
  AndroidでWebViewからPDFを表示させたい【Kotlin,Java】
  Is it possible to submit cookies in an Android DownloadManager
  DownloadManagerのちょっとマニアックな使い方

サンプル

<!-- 権限の追加 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
// Basic認証
buildConfigField("String", "AUTH_ID", "\"id\"")
buildConfigField("String", "AUTH_PASS", "\"pass\"")
try {
	val url = "https://test.test/sample.pdf"
	// ファイル名の取得
	val fileName = url.substring(url.lastIndexOf("/") + 1)

	// DownloadManagerの設定
	val manager = context?.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
	val request = DownloadManager.Request(Uri.parse(url))
	request.setTitle(fileName)
	request.setDescription("Downloading")
	request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
	request.setDestinationInExternalPublicDir(DIRECTORY_DOWNLOADS, fileName)

	request.setAllowedOverMetered(true)
	request.setMimeType("application/pdf")

	//Basic認証用のヘッダーを付与する
	val auth = BuildConfig.AUTH_ID + ":" + BuildConfig.AUTH_PASS
	val base64: String = Base64.encodeToString(auth.toByteArray(), Base64.NO_WRAP)
	request.addRequestHeader("Authorization", "Basic " + base64)

	// ヘッダーのセット
	request.addRequestHeader("Content-Type", "application/x-www-form-urlencoded")
	request.addRequestHeader("X-Requested-With", "XMLHttpRequest")

	// cookieのセット
	request.addRequestHeader("Cookie", "contents")

	// ダウンロード
	val downloadId = manager.enqueue(request)

	val receiver = object : BroadcastReceiver() {
		//ダウンロード完了後の処理
		override fun onReceive(context: Context, intent: Intent) {
			val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
			if (id == downloadId) {
				//intentによりファイルを開く
				val openFileIntent = Intent(Intent.ACTION_VIEW)
				val uri = manager.getUriForDownloadedFile(id)
				openFileIntent.setDataAndType(uri, context.contentResolver.getType(uri))
				openFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
				startActivity(openFileIntent)
			}
		}
	}
	context?.registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))

} catch (e: Exception) {
	Log.e("pdf", "Cancel", e)
}