Android浏览器直接打开网页上的文档

Android浏览器直接打开网页上的文档在做移动办公软件时,需要移动终端在线打开网页上的文档,在iPad上能直接打开文档在线显示,但是在android系统上却不能,它只是把这个文档下载下来,然后只能自己找到文档的位置点击打开,很不方便。没办法,只能自己写个客户端,拦截请求,自动下载和打开。

大家好,又见面了,我是你们的朋友全栈君。

       在做移动办公软件时,需要移动终端在线打开网页上的文档,在iPad上能直接打开文档在线显示,但是在android系统上却不能,它只是把这个文档下载下来,然后只能自己找到文档的位置点击打开,很不方便。没办法,只能自己写个客户端,拦截请求,自动下载和打开。

一:实现思路

Android浏览器直接打开网页上的文档

二:核心实现

1)主要配置文件

Android浏览器直接打开网页上的文档

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.net/146616.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]

    如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]如何遍历ArrayList集合,并安全删除其中的元素?1、遍历ArrayList集合有三种方式(1)for循环(2)增强for循环,也就是foreach(3)迭代器iterator2、普通for循环遍历删除元素,list集合的大小会变小,而索引也会发生改变,所以利用ffor循环遍历删除元素会漏调某些元素。例如我for循环遍历删除第一个元素,接着按照…

    2022年7月22日
  • Vue 插槽之 作用域插槽「建议收藏」

    现在我有如下需求,子组件<user/>中此时有一条用户的信息(userInfo);我要在父组件通过插槽展示这个用户的姓名(userInfo.name);注意:这里的父组件并没有这个用户的信息,子组件中有,如果直接在父组件{{userInfo.name}}获取这条信息是获取不到的;因为,只有<user/>组件可以访问到userInfo,而我们提供的内容是在父…

    2022年4月13日
  • 计算机网络 | 思科网络 | ACL通配符掩码「建议收藏」

    计算机网络 | 思科网络 | ACL通配符掩码「建议收藏」目录一.什么是通配符掩码二.使用通配符掩码三.通配符掩码示例1.使用通配符掩码匹配IPv4子网2.使用通配符掩码匹配网络范围四.计算通配符掩码1.通配符掩码计算:示例12.通配符掩码计算:示例23.通配符掩码计算:示例3五.通配符掩码关键字1.示例1:匹配单个IPv4地址的通配符掩码过程2.示例2:匹配所有IPv4地址的通配符掩码过程一.什么是通配符掩码通配符掩码是由32个二进制数字组成的字符串,路由器使用它来确定检查地址的

    2022年7月24日
  • Java的反射机制原理[通俗易懂]

    Java的反射机制原理[通俗易懂]一、什么是反射:(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。二.反射机制的概念指在运行状态中..

    2022年7月8日
  • pytest指定用例_文件夹排列顺序自定义

    pytest指定用例_文件夹排列顺序自定义前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

    2022年7月30日
  • 彻底了解DVD:从入门到精通(三)[转]「建议收藏」

    彻底了解DVD:从入门到精通(三)[转]「建议收藏」第七章 正版与盗版    这一章有两大问题的预备知识需要交待。  第一大问题是最最敏感的问题,也是本文无法在正规刊物上发表的致命原因,对于DVD,我们应该收藏正版还是D版?  第二个问题是,如果要收藏D版,要注意哪些问题。  谈到收藏,先要解释几个常用名词(第九章会有更详细的解释):  D版:盗版,成为这个敏感词的代称。  D商:有两个意思,一是指盗版商,也叫DS,二是泛指碟商。大…

    2022年7月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号