最近开发一个需求是使用wps打开本地的文档,所以记录一下方便以后查阅
对于Android 7.0 以后文件的读写 请参照一下链接
https://www.jianshu.com/p/5ebfa842e6c1
如何跳过 7.0对文件访问的权限目前我知道的有以下两点
1、将build.gradle下的targetSdkVersion改成23以下(这个也会跳过6.0的权限,但很多应用平台以后要对这个进行检测,如果不知道6.0权限检测,可能影响APP上架)
2、在Application的onCreate中加入
//解决FileUriExposedException。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
参考:https://blog.csdn.net/mashang123456789/article/details/78468847
代码:
判断手机是否安装了 wps
private boolean isInstall(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager();
// 获取所有已安装程序的包信息
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
for (int i = 0; i < pinfo.size(); i++) {
if (pinfo.get(i).packageName.equalsIgnoreCase(packageName))
return true;
}
return false;
}
获取文档类型
private static String getMIMEType(File f) {
String type = "";
String fName = f.getName();
/* 取得扩展名 */
String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();
/* 依扩展名的类型决定MimeType */
if (end.equals("pdf")) {
type = "application/pdf";
} else if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") ||
end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
type = "audio/*";
} else if (end.equals("3gp") || end.equals("mp4")) {
type = "video/*";
} else if (end.equals("jpg") || end.equals("gif") || end.equals("png") ||
end.equals("jpeg") || end.equals("bmp")) {
type = "image/*";
} else if (end.equals("apk")) {
type = "application/vnd.android.package-archive";
} else if (end.equals("pptx") || end.equals("ppt")) {
type = "application/vnd.ms-powerpoint";
} else if (end.equals("docx") || end.equals("doc")) {
type = "application/vnd.ms-word";
} else if (end.equals("xlsx") || end.equals("xls")) {
type = "application/vnd.ms-excel";
}else if(end.equals("txt")){
type = "text/plain";
}else if(end.equals("html") || end.equals("htm")){
type = "text/html";
} else {
//如果无法直接打开,就跳出软件列表给用户选择
type = "*/*";
}
return type;
}
打开文档
private Intent getWordFileIntent(String Path) {
File file = new File(Path);
Intent intent = new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
String type = getMIMEType(file);
if(type.contains("pdf") || type.contains("vnd.ms-powerpoint") || type.contains("vnd.ms-word") || type.contains("vnd.ms-excel") || type.contains("text/plain")|| type.contains("text/html")){
if (isInstall(this, "cn.wps.moffice_eng")) {
intent.setClassName("cn.wps.moffice_eng",
"cn.wps.moffice.documentmanager.PreStartActivity2");
intent.setData(uri);
} else {
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(uri, type);
}
}else{
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(uri, type);
}
return intent;
}
应用:
Intent intent = getWordFileIntent("文件路径");
startActivity(intent);
经测试华为手机如果没有可应用的打开方式,程序会报错。解决办法如下:
1、判断文件是否为PDF文件
推荐使用 Android PdfViewer
[链接地址:https://github.com/barteksc/AndroidPdfViewer(https://github.com/barteksc/AndroidPdfViewer)
2、如果不是PDF文件
Intent intent = getWordFileIntent(BASE_PATH + list.get(clickPosition).get("fileName"));
try{
startActivity(intent);
}catch (Exception e){
showToast("无可用打开方式,建议下载wps后重试");
}
给用户一个友好提示。
OK,大功告成。
网友评论