一:添加依赖
implementation 'com.itextpdf:itext7-core:7.1.13'
二:清单文件AndroidManifest.xml
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
在<application>中添加
android:requestLegacyExternalStorage="true"
添加provider
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.demo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
在res目录下新建xml目录,并创建provider_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>
三:文件工具类FileUtils
package com.example.demo;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.widget.Toast;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class FileUtils {
/**
* 获取包含文件的应用程序路径
*
* @return String 根目录路径
*/
public static String getAppPath() {
File dir = new File(android.os.Environment.getExternalStorageDirectory()
+ File.separator
+ "PDF"
+ File.separator);
if (!dir.exists()) {
dir.mkdirs();
}
return dir.getPath() + File.separator;
}
/**
* 打开PDF文件
* @param context
* @param url
* @throws ActivityNotFoundException
* @throws IOException
*/
public static void openFile(Context context, File url) throws ActivityNotFoundException {
if (url.exists()) {
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", url);
String urlString = url.toString().toLowerCase();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
/**
* Security
*/
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
// 通过比较url和扩展名,检查您要打开的文件类型。
// 当if条件匹配时,插件设置正确的意图(mime)类型
// 所以Android知道用什么程序打开文件
if (urlString.toLowerCase().contains(".doc")
|| urlString.toLowerCase().contains(".docx")) {
// Word document
intent.setDataAndType(uri, "application/msword");
} else if (urlString.toLowerCase().contains(".pdf")) {
// PDF file
intent.setDataAndType(uri, "application/pdf");
} else if (urlString.toLowerCase().contains(".ppt")
|| urlString.toLowerCase().contains(".pptx")) {
// Powerpoint file
intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
} else if (urlString.toLowerCase().contains(".xls")
|| urlString.toLowerCase().contains(".xlsx")) {
// Excel file
intent.setDataAndType(uri, "application/vnd.ms-excel");
} else if (urlString.toLowerCase().contains(".zip")
|| urlString.toLowerCase().contains(".rar")) {
// ZIP file
intent.setDataAndType(uri, "application/trap");
} else if (urlString.toLowerCase().contains(".rtf")) {
// RTF file
intent.setDataAndType(uri, "application/rtf");
} else if (urlString.toLowerCase().contains(".wav")
|| urlString.toLowerCase().contains(".mp3")) {
// WAV/MP3 audio file
intent.setDataAndType(uri, "audio/*");