투케이2K

501. (Android/Java) [android 12 / target 31] Asset 폴더에 저장된 PDF 파일 열기 (open) 수행 (Intent.ACTION_VIEW) 본문

Android

501. (Android/Java) [android 12 / target 31] Asset 폴더에 저장된 PDF 파일 열기 (open) 수행 (Intent.ACTION_VIEW)

투케이2K 2023. 2. 23. 22:01

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

 


===========================================================

[1]. values 폴더 >> strings.xml 파일에 코드 추가

<resources>

    <!-- 리소스 관리 : 앱 명칭 -->
    <string name="app_name">javaproject</string>

</resources>

===========================================================

[2]. AndroidManifest.xml 파일에서 application 내에 provider 코드 추가

    <!-- 애플리케이션 설정 -->
    <application
        android:name=".S_Application">


        <!-- PDF 열기 -->
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="@string/app_name"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider_paths" />
        </provider>


    </application>


===========================================================

[3]. xml 폴더 생성 >> file_provider_paths.xml 코드 추가

<?xml version="1.0" encoding="utf-8"?>
<paths>

    <!-- PDF 열기 : 내부 저장소 -->
    <!-- Context.getFilesDir() -->
    <files-path name="internal_files" path="."/>

</paths>

===========================================================

[4]. assets 폴더 >> pdf 파일 추가 실시

===========================================================

[5]. PDF 파일 열기 코드 작성 실시

        // -------------------------------------
        // [로직 처리 실시]
        // -------------------------------------
        try {

            // [Uri 선언 실시]
            Uri uri = null;

            
            // [File 선언 실시]
            File file = new File(getFilesDir(), "test.pdf"); // [inner]

            
            if (file.exists() == false){ // [저장된 파일이 없는 경우]

                // [파일 저장 객체 FileOutputStream 선언]
                FileOutputStream fos = new FileOutputStream(file);

                // [AssetManager 객체 생성]
                AssetManager assetManager = getResources().getAssets();

                // [InputStream 으로 파일 읽음]
                InputStream inputStream = assetManager.open("test.pdf", AssetManager.ACCESS_BUFFER);

                // [InputStream to Byte]
                byte returnData [] = null;
                int length = 0;
                if (inputStream != null && inputStream.available() > 0){

                    // [길이 저장]
                    length = inputStream.available();

                    // [바이트 배열 선언]
                    returnData = new byte[length];

                    // [바이트 배열에 값 저장]
                    inputStream.read(returnData);
                }

                // [파일 저장]
                fos.write(returnData);

                // [스트림 닫기]
                inputStream.close();
                fos.close();
                
                // [url 지정 실시]
                File save = new File(getFilesDir(), "test.pdf"); // [inner]
                uri = FileProvider.getUriForFile(this, getString(R.string.app_name), save); // [build gradle : applicationId]

            }
            else { // [저장된 파일이 있는 경우]
                uri = FileProvider.getUriForFile(this, getString(R.string.app_name), file); // [build gradle : applicationId]
            }

            
            // [pdf 열기 intent 이동]
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            intent.setDataAndType(uri, "application/pdf");
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);


            // [사전 권한 부여 실시]
            List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            for(ResolveInfo resolveInfo : resolveInfoList){

                String packgeName = resolveInfo.activityInfo.packageName;
                getApplicationContext().grantUriPermission(packgeName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

                Log.i("---","---");
                Log.d("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FLAG_GRANT_READ_URI_PERMISSION]");
                Log.i("","\n"+"[packgeName :: "+String.valueOf(packgeName)+"]");
                Log.d("//===========//","================================================");
                Log.i("---","---");
            }


            // [startActivity]
            try {
                startActivity(intent);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

===========================================================

 


 

반응형
Comments