Android로 assets 디렉터리에 설정된 pdf 파일을 여는 방법

13842 단어 Android

개요

assets 디렉터리에 설정된 pdf 파일을 여는 방법을 조사했다.

샘플 프로그램


k-yamada/AssetsFileProviderSample

설치 단계

  • 1. Assets 폴더를 만들려면 다음 절차를 따르십시오.
  • 안드로이드 스튜디오의 메뉴 표시줄의 File>New>Folder Assets Folder
  • 2. assets/pdf/sample.pdf에 알맞은 pdf 파일을 설정합니다
  • 3. util 디렉터리에 생성 AssetsFileProvider.kt.
  • AssetsFileProvider.kt
    // AssetsFileProvider.kt
    
    package kyamada.assetsfileprovidersample.util
    
    import android.content.ContentProvider
    import android.content.ContentValues
    import android.content.res.AssetFileDescriptor
    import android.database.Cursor
    import android.net.Uri
    import java.io.FileNotFoundException
    import java.io.IOException
    
    
    class AssetsFileProvider : ContentProvider() {
    
        @Throws(FileNotFoundException::class)
        override fun openAssetFile(uri: Uri, mode: String): AssetFileDescriptor {
            try {
                return context!!.assets.openFd(uri.pathSegments.joinToString("/"))
            } catch (e: IOException) {
                e.printStackTrace()
                throw FileNotFoundException(e.message)
            }
        }
    
        override fun delete(uri: Uri, selection: String, selectionArgs: Array<String>): Int {
            throw UnsupportedOperationException("Not yet implemented")
        }
    
        override fun getType(uri: Uri): String {
            throw UnsupportedOperationException("Not yet implemented")
        }
    
        override fun insert(uri: Uri, values: ContentValues): Uri {
            throw UnsupportedOperationException("Not yet implemented")
        }
    
        override fun onCreate(): Boolean {
            return false
        }
    
        override fun query(uri: Uri, projection: Array<String>, selection: String,
                           selectionArgs: Array<String>, sortOrder: String): Cursor {
            throw UnsupportedOperationException("Not yet implemented")
        }
    
        override fun update(uri: Uri, values: ContentValues, selection: String,
                            selectionArgs: Array<String>): Int {
            throw UnsupportedOperationException("Not yet implemented")
        }
    
        companion object {
            private const val AUTHORITY = "kyamada.assetsfileprovidersample.assets"
            val CONTENT_URI = Uri.parse("content://$AUTHORITY")!!
        }
    }
    
  • 4. AndroidManifest.xml에 <provider> 탭을 추가합니다.
  • // AndroidManifest.xml:
    
        <application
            ...
    
            <provider
                    android:name="kyamada.assetsfileprovidersample.util.AssetsFileProvider"
                    android:authorities="kyamada.assetsfileprovidersample.assets"
                    android:exported="false"
                    android:grantUriPermissions="true">
                <meta-data
                        android:name="android.support.FILE_PROVIDER_PATHS"
                        android:resource="@xml/filepaths" />
            </provider>
        </application>
    
  • 5. res/xml/filepaths.xml.
  • // res/xml/filepaths.xml:
    
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <asset
                name="pdf"
                path="pdf" />
    </paths>
    
  • 6. app/build.gradle에서 압축되지 않는 pdf의 설정을 기술합니다.
  • app/build.gradle
    // app/build.gradle:
    
    android {
        ...
    
        aaptOptions {
            noCompress "pdf"
        }
    }
    
  • 7. MainActivity.kt에서 pdf 열기 처리를 기술합니다.
  • MainActivity.kt
    // MainActivity.kt
    
    package kyamada.assetsfileprovidersample
    
    import android.content.Intent
    import android.net.Uri
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import kyamada.assetsfileprovidersample.util.AssetsFileProvider
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            openAssetPdf()
        }
    
        private fun openAssetPdf() {
            val intent = Intent(Intent.ACTION_VIEW)
            val uri: Uri = AssetsFileProvider.CONTENT_URI.buildUpon()
                .appendPath("pdf")
                .appendPath("sample.pdf")
                .build()
            intent.setDataAndType(uri, "application/pdf")
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            startActivity(intent)
        }
    }
    
  • 8. 응용 프로그램을 시작하면 PDF가 표시됩니다.

  • 주의 사항


    사전 설치된 드라이버 PDF 뷰어에서는 열 수 없습니다. Adobe Acrobat에서 엽니다.

    좋은 웹페이지 즐겨찾기