Android 下载并打开PDF,Doc,Dwg文档实例

 更新时间:2017年04月14日 08:33:55   作者:Zhou灬hao  
本篇文章主要介绍了Android 下载并打开PDF,Doc,Dwg文档实例,具有一定的参考价值,有兴趣的可以了解一下。

今天项目中遇到这样一个需求 ,根据后台接口里pdf,doc,dwg文档的地址 是一个URL ,需要根据文档的url 下载到本地(内部存储或内存卡)并用手机中能打开该文档的软件弹出来并打开,(这里需要做一个缓存,第一次查看这个文档是在服务器上下载并打开,以后打开不需要下载直接打开本地的文档)在网上找了些资料 写了以下代码,下面分享给大家;

效果图:

代码:

这是一个单独的类 首先接收intent传过来的url我是用url的后14位作为存储本地的文件名(这里根据自己服务器的文件命名规则而定) 拿到文件路径之后 判断本地是否有此文件 有则打开没有则从服务器上下载并打开 ;

  Intent intent = act.getIntent();
  final String Strname = intent.getStringExtra("docurl");
  //截取最后14位 作为文件名
  String s = Strname.substring(Strname.length()-14);
  //文件存储
  file1 = new File(Environment.getExternalStorageDirectory(), getFileName(s));
  new Thread() {
   public void run() {
    File file = new File( file1.getAbsolutePath());
    //判断是否有此文件
    if (file.exists()) {
     //有缓存文件,拿到路径 直接打开
     Message msg = Message.obtain();
     msg.obj = haha;
     msg.what = DOWNLOAD_SUCCESS;
     handler.sendMessage(msg);
     mProgressDialog.dismiss();
     return;
    }
//    本地没有此文件 则从网上下载打开
    File downloadfile = downLoad(Strname, file1.getAbsolutePath(), mProgressDialog);
//    Log.i("Log",file1.getAbsolutePath());
    Message msg = Message.obtain();
    if (downloadfile != null) {
     // 下载成功,安装....
     msg.obj = downloadfile;
     msg.what = DOWNLOAD_SUCCESS;
    } else {
     // 提示用户下载失败.
     msg.what = DOWNLOAD_ERROR;
    }
    handler.sendMessage(msg);
    mProgressDialog.dismiss();
   };
  }.start();

下载文档代码;

传入需要下载的文档的url 和存入内存的路径和dialog

 public static File downLoad(String serverpath, String savedfilepath, ProgressDialog pd) {
  try {
   URL url = new URL(serverpath);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setConnectTimeout(5000);
   if (conn.getResponseCode() == 200) {
    int max = conn.getContentLength();
    pd.setMax(max);
    InputStream is = conn.getInputStream();
    File file = new File(savedfilepath);
    FileOutputStream fos = new FileOutputStream(file);
    int len = 0;
    byte[] buffer = new byte[1024];
    int total = 0;
    while ((len = is.read(buffer)) != -1) {
     fos.write(buffer, 0, len);
     total += len;
     pd.setProgress(total);
    }
    fos.flush();
    fos.close();
    is.close();
    return file;
   } else {
    return null;
   }
  } catch (Exception e) {
   e.printStackTrace();

  }

 }

打开文件选择器

Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   switch (msg.what) {
   case DOWNLOAD_SUCCESS:
    File file = (File) msg.obj;
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setDataAndType (Uri.fromFile(file), "application/pdf");
//    startActivity(intent);
    startActivity(Intent.createChooser(intent, "标题"));
    /**
     * 弹出选择框之后 把本activity销毁
     */
    finish();
    break;
   case DOWNLOAD_ERROR:
    Util.showToast(act,"文件加载失败");
    break;
   }
  }
 };

整体代码

public class list_item_doc extends BaseActivity {

 private ProgressDialog mProgressDialog;

 // 下载失败
 public static final int DOWNLOAD_ERROR = 2;
 // 下载成功
 public static final int DOWNLOAD_SUCCESS = 1;
 private File file1;
 @Override
 protected void onCreate(Bundle arg0) {
  // TODO Auto-generated method stub
  super.onCreate(arg0);

  initView();
 }

 private void initView() {
  // TODO Auto-generated method stub
  Intent intent = act.getIntent();
  final String Strname = intent.getStringExtra("url");
  mProgressDialog = new ProgressDialog(act);
  mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  mProgressDialog.setCancelable(false);
  mProgressDialog.show();
  //截取最后14位 作为文件名
  String s = Strname.substring(Strname.length()-14);
  //文件存储
  file1 = new File(Environment.getExternalStorageDirectory(), getFileName(s));
  new Thread() {
   public void run() {

    File haha = new File( file1.getAbsolutePath());
    //判断是否有此文件
    if (haha.exists()) {
     //有缓存文件,拿到路径 直接打开
     Message msg = Message.obtain();
     msg.obj = haha;
     msg.what = DOWNLOAD_SUCCESS;
     handler.sendMessage(msg);
     mProgressDialog.dismiss();
     return;
    }
//    本地没有此文件 则从网上下载打开
    File downloadfile = downLoad(Strname, file1.getAbsolutePath(), mProgressDialog);
//    Log.i("Log",file1.getAbsolutePath());
    Message msg = Message.obtain();
    if (downloadfile != null) {
     // 下载成功,安装....
     msg.obj = downloadfile;
     msg.what = DOWNLOAD_SUCCESS;
    } else {
     // 提示用户下载失败.
     msg.what = DOWNLOAD_ERROR;
    }
    handler.sendMessage(msg);
    mProgressDialog.dismiss();
   };
  }.start();
 }

 /**
  * 下载完成后 直接打开文件
  */
 Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   switch (msg.what) {
   case DOWNLOAD_SUCCESS:
    File file = (File) msg.obj;
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setDataAndType (Uri.fromFile(file), "application/pdf");
//    startActivity(intent);
    startActivity(Intent.createChooser(intent, "标题"));
    /**
     * 弹出选择框 把本activity销毁
     */
    finish();
    break;
   case DOWNLOAD_ERROR:
    Util.showToast(act,"文件加载失败");
    break;
   }
  }
 };
/**
 *
 */


 /**
  * 传入文件 url 文件路径 和 弹出的dialog 进行 下载文档
  */
 public static File downLoad(String serverpath, String savedfilepath, ProgressDialog pd) {
  try {
   URL url = new URL(serverpath);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setConnectTimeout(5000);
   if (conn.getResponseCode() == 200) {
    int max = conn.getContentLength();
    pd.setMax(max);
    InputStream is = conn.getInputStream();
    File file = new File(savedfilepath);  
    FileOutputStream fos = new FileOutputStream(file);
    int len = 0;
    byte[] buffer = new byte[1024];
    int total = 0;
    while ((len = is.read(buffer)) != -1) {
     fos.write(buffer, 0, len);
     total += len;
     pd.setProgress(total);
    }
    fos.flush();
    fos.close();
    is.close();
    return file;
   } else {
    return null;
   }
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }

 }

 public static String getFileName(String serverurl) {
  return serverurl.substring(serverurl.lastIndexOf("/") + 1);
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android EditText长按菜单中分享功能的隐藏方法

    Android EditText长按菜单中分享功能的隐藏方法

    Android EditText控件是经常使用的控件,下面这篇文章主要给大家介绍了关于Android中EditText长按菜单中分享功能的隐藏方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • android studio的安装(史上最详细)

    android studio的安装(史上最详细)

    这篇文章主要介绍了android studio的安装(史上最详细),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Android 中ContentProvider的实例详解

    Android 中ContentProvider的实例详解

    这篇文章主要介绍了Android 中ContentProvider的实例详解的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Android小知识之图片的3种压缩方式小结

    Android小知识之图片的3种压缩方式小结

    这篇文章主要给大家介绍了关于Android小知识之图片的3种压缩方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    本文主要介绍在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序,这里对测试Linux 内核驱动程序做了详细介绍,并附有代码示例,有兴趣的小伙伴可以参考下
    2016-08-08
  • Android之Compose页面切换动画介绍

    Android之Compose页面切换动画介绍

    大家好,本篇文章主要讲的是Android之Compose页面切换动画介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Android传感器SensorEventListener之加速度传感器

    Android传感器SensorEventListener之加速度传感器

    今天小编就为大家分享一篇关于Android传感器SensorEventListener之加速度传感器,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • android播放视频时在立体声与单声道之间切换无变化原因分析及解决

    android播放视频时在立体声与单声道之间切换无变化原因分析及解决

    使用第三方视频播放器,有立体声与单声道之间切换,发现切换后无作用,原因是由于在HAL层默认没有处理上层发的stereo 转mono的命令,具体的解决方法如下
    2013-06-06
  • Flutter替换字符串中的html标签

    Flutter替换字符串中的html标签

    这篇文章主要为大家介绍了Flutter替换字符串中的html标签实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2023-05-05
  • Android调用系统自带的分享功能实例代码

    Android调用系统自带的分享功能实例代码

    本篇文章主要介绍了Android调用系统自带的分享功能实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04

最新评论