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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ES6 数组新增方法

    ES6 数组新增方法目录ES6数组新增方法1、.map2、some和every方法3、filter4、数组新增的reduce方法ES6数组新增方法1、.map.map()给数组中的每一个元素添加特殊处理,返回新的数组实现给定数组添加元letprices=[20,30,40]//20元30元40元letarr=prices.map(item=>item+”元”)给给定数据替换某内容letmovies=[{id:1,name:’逃学…

    2022年5月10日
    39
  • python可变类型有哪些_python可变数据类型有哪些

    python可变类型有哪些_python可变数据类型有哪些将python3的基本数据类型有六种:Number(int,float,bool,complex),String,List,Tuple,Dictionary,Set可变数据类型:list,dic,set不可变数据类型:Number,String,Tuple什么是可变数据类型和不可变数据类型?1、Python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当…

    2022年5月20日
    76
  • java怎么导入项目?java已有项目如何导入eclipse?

    java怎么导入项目?java已有项目如何导入eclipse?java开发的小伙伴肯定有需要将别人的项目导入到自己电脑上的情况,那么应该如何操作呢?这里就以Java开发经常用到的eclipse软件为例,为大家介绍一下导入已有Java项目的方式。方法步骤1.首先我们打开eclipse软件,在里面我们找到左上角的file,点击展开之后选择里面的import选项,如图所示。2.我们在打开的窗口中找到general选项,展开之后找到【ExistingProjectsintoWorkspace】,之后点击next进入到下一步页面。3.之后会看到一个新的窗口,在

    2022年7月8日
    20
  • C3P0连接池详解及配置「建议收藏」

    C3P0连接池详解及配置「建议收藏」C3P0连接池详解及配置数据库连接是一个耗费大量资源且相当慢的操作,所以为了提高性能和连接速度,诞生了连接池这样的概念。在多用户并发操作过程中,连接池尤为重要。它是将那些已连接的数据库连接存放在一个容器里(连接池),这样以后别人要连接数据库的时候,将不会重新建立数据库连接(这样蜗牛的慢动作谁都受不了的),他会直接从连接池里取出可用的连接,用户使用完毕后,连接又重新回到连接池

    2022年5月9日
    45
  • Idea激活码最新教程2024.3.1.1版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2024.3.1.1版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2024 3 1 1 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2024 3 1 1 成功激活

    2025年5月31日
    12
  • java–集合

    java–集合

    2021年10月2日
    54

发表回复

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

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