Android浏览器直接打开网页上的文档
大家好,又见面了,我是你们的朋友全栈君。
在做移动办公软件时,需要移动终端在线打开网页上的文档,在iPad上能直接打开文档在线显示,但是在android系统上却不能,它只是把这个文档下载下来,然后只能自己找到文档的位置点击打开,很不方便。没办法,只能自己写个客户端,拦截请求,自动下载和打开。
一:实现思路
二:核心实现
1)主要配置文件
2)核心代码
public class FileOpenTestActivity extends Activity {
private WebView webView;
private Context mContext = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.mContext = this;
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断是否是文件下载链接,如果不是则返回,直接访问
String fileName = url.substring(url.lastIndexOf(“/”));
if(null == getFileType(fileName) || getFileType(fileName).equals(“”)){
return false;
}
//如果是文件下载链接,先下载,再调用系统安装的阅读器打开
try {
//下载文件到SD卡
File file = downloadFile(url);
//调用适合的阅读器显示文件
startActivity(getFileIntent(file));
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
return true;
}
});
webView.loadUrl(“http://localhost:8888/OpenFile/fileList.html“);
}
/**
* 下载文件
* @param fileUrl
* @return
*/
public File downloadFile(String fileUrl) {
File apkFile = null;
String fileName = fileUrl.substring(fileUrl.lastIndexOf(“/”));
try {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory() + “/”;
String mSavePath = sdpath + “download”;
URL url = new URL(fileUrl);
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.connect();
// 获取文件大小
//int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
File file = new File(mSavePath);
// 判断文件目录是否存在
if (!file.exists()) {
file.mkdir();
}
apkFile = new File(mSavePath, fileName);
if(apkFile.exists()){
return apkFile;
}
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
int numread = 0;
byte buf[] = new byte[1024];
while ((numread = is.read(buf)) != -1) {
fos.write(buf, 0, numread);
}
fos.flush();
fos.close();
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return apkFile;
}
/**
* 获取用于文件打开的intent
* @param file
* @return
*/
public Intent getFileIntent(File file)
{
Intent intent = new Intent(“android.intent.action.VIEW”);
intent.addCategory(“android.intent.category.DEFAULT”);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
String fileType = getFileType(file.getName());
intent.setDataAndType(uri, fileType);
return intent;
}
/**
* 从配置文件获取要下载的文件后缀和对应的MIME类型
* @param fileName
* @return
*/
public String getFileType(String fileName){
String [] names = this.mContext.getResources().getStringArray(R.array.file_name_array);
String [] types = this.mContext.getResources().getStringArray(R.array.file_type_array);
for(int i=0;i<names.length;i++){
if(fileName.toLowerCase().indexOf(names[i])>=0){
return types[i];
}
}
return “”;
}
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146616.html原文链接:https://javaforall.cn
相关文章
- android中的加密算法,Android中加密算法[通俗易懂]
- 74款android开机动画,修改Android系统开机动画
- android 混淆不起作用,Android代码混淆的写法总结
- android中适配器的作用,适配器模式 在Android中的简单理解「建议收藏」
- Android微信支付订单支付失败的问题
- android deeplink流程,Android Deeplink探究[通俗易懂]
- Android SDK安装及配置模拟器[通俗易懂]
- Android FFmpeg系列08--seek和精准seek
- android toast显示时间,Android Toast自定义显示时间「建议收藏」
- android登录注册跳转的代码_Android开发代码
- Android 编译_android线程
- android调用相册并显示图片_Android获取相册列表
- android studio与eclipse_androidstudio源码网
- android 横向滑动分类效果实现
- 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 )
- 【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )
- 【Android 组件化】路由组件 ( 构造路由表中的路由信息 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑤ ( 执行 init-android-libyuv.sh | 执行 init-android-soundtouch.sh )
- 【错误记录】Android 应用安全检测漏洞修复 ( StrandHogg 漏洞 | 设置 Activity 组件 android:taskAffinity=““ )
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- 因收集Android 位置数据,Google被罚六千万美元
- [android] 多媒体播放api简介详解手机开发
- [android] 采用pull解析xml文件详解手机开发
- android基础教程之夜间模式实现示例