Notice
Recent Posts
Recent Comments
Link
투케이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();
}
===========================================================
반응형
'Android' 카테고리의 다른 글
Comments