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 “”;
 }
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146616.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 微商分销系统哪家好,要怎么做?

    微商分销系统哪家好,要怎么做?分销模式的本质是分享经济,wemall微商分销系统将传统商品高昂的推广费用让利给消费者,并抽取一定金额作为分销商的佣金。分销模式使消费者直接与商家沟通,增加用户粘性,促成品牌的口碑转化为流量,相比与零售,分销有着无可比拟的优势,这也使越来越多的微商分销系统涌现出来。微信封杀分…

  • PostgreSQL的postgres_fdw跨库使用

    PostgreSQL的postgres_fdw跨库使用

  • MyBatis学习4—使用MyBatis_Generator生成Dto、Dao、Mapping

    MyBatis学习4—使用MyBatis_Generator生成Dto、Dao、Mapping由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。一、建立表结构CREATETABLE`user`(`id`varchar(50)NOTNULL,`username`varchar(18)CHAR

    2022年10月20日
  • java 动态库卸载_java 卸载动态链接库

    java 动态库卸载_java 卸载动态链接库importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.Iterator;importjava.util.Vector;publicclassFreeDynamicDll{static{//首先确保这些dll文件存在System.load(“c:/test/Decode.dll”);…

  • VSCode配置python调试环境

    VSCode配置python调试环境VSCode配置python调试环境

  • matlab plot函数详解_matlab floor函数用法

    matlab plot函数详解_matlab floor函数用法plot是绘制二维图形的最基本函数,它是针对向量或矩阵的列来绘制曲线的。也就是说,使用plot函数之前,必须首先定义好曲线上每一点的x及y坐标。1.plot(x)当x为一向量时,以x元素的值为纵坐标,x的序号为横坐标值绘制曲线。当x为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲线。2.plot(x,y)以x元素为横坐标值,y元素为纵坐标值绘制曲线3….

发表回复

您的电子邮箱地址不会被公开。

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