WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
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)
}