最近在学习android,领导想做一个测试利用局域网进行电视apk的自动升级程序,最新代码是放在本地局域网电脑上面的,在此写下代码调试过程中遇到的问题及解决方法;一开始用想用FTPClient和HttpURLConnection来读取本地文件(并且电脑有登录密码)没能成功(本人小菜),后来在网上看到看到利用基于SMB协议共享文件也可以对局域网文件进行读写,所以尝试利用此方法;不多说了,上代码先;

public class FtpClientUtil {

/* 下载中 */

private static final int DOWNLOAD = 1;

/* 下载结束 */

private static final int DOWNLOAD_FINISH = 2;

private static final int DOWNLOAD_DLG = 3;

// 保存解析的XML信息

private Context mContext;

static HashMap mHashMap;

/* 下载保存路径 */

private String mSavePath;

/* 记录进度条数量 */

private int progress;

/* 是否取消更新 */

private boolean cancelUpdate = false;

/* 更新进度条 */

private ProgressBar mProgress;

private Dialog mDownloadDialog;

public static final String vurl = "smb://liuyun:123456@192.168.1.8/testfile/version.xml";

public static final String appurl = "smb://liuyun:123456@192.168.1.8/testfile/SocketClient.apk";

public FtpClientUtil(Context context)

{

this.mContext = context;

}

private Handler mHandler = new Handler()

{

public void handleMessage(Message msg)

{

switch (msg.what)

{

// 正在下载

case DOWNLOAD:

// 设置进度条位置

mProgress.setProgress(progress);

break;

case DOWNLOAD_FINISH:

// 安装文件

installApk();

break;

case DOWNLOAD_DLG:

//显示版本更新及下载提示

Log.d("mHandler","---downloadApk");

showNoticeDialog();

break;

default:

break;

}

};

};

public void CheckUpdate(){

MutliThread m = new MutliThread();

Thread t1 = new Thread(m);

t1.start();

}

private class MutliThread implements Runnable{

public void run(){

if(isUpdate()){

mHandler.sendEmptyMessage(DOWNLOAD_DLG);

}

else

{

Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show();

}

}

}

private boolean isUpdate() {

try {

//建立连接

SmbFile smbFile = new SmbFile(vurl);

// 建立smb文件输入流

InputStream in = new BufferedInputStream(new SmbFileInputStream(smbFile));

return parserUpdateVesion(in);//检测是否有新的版本

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

private boolean parserUpdateVesion(InputStream is)

{

// 获取当前软件版本

int versionCode = getVersionCode(mContext);

// InputStream inStream = ParseXmlService.class.getClassLoader().getResourceAsStream("version.xml");

// 解析XML文件,使用DOM方式进行解析

ParseXmlService service = new ParseXmlService();

try

{

mHashMap = service.parseXml(is);

} catch (Exception e)

{

e.printStackTrace();

}

if (null != mHashMap)

{

int serviceCode = Integer.valueOf(mHashMap.get("version"));

// 版本判断

Log.d("parserUpdateVesion","versionCode="+String.valueOf(serviceCode));

if (serviceCode > versionCode)

{

//showNoticeDialog();

try

{

is.close();

}

catch (IOException e)

{

e.printStackTrace();

}

return true;

}

}

return false;

}

private int getVersionCode(Context context)

{

int versionCode = 0;

try

{

// 获取软件版本号,对应AndroidManifest.xml下android:versionCode

versionCode = context.getPackageManager().getPackageInfo("com.example.update", 0).versionCode;

} catch (NameNotFoundException e)

{

e.printStackTrace();

}

return versionCode;

}

/**

* 显示软件更新对话框

*/

private void showNoticeDialog()

{

// 构造对话框

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle(R.string.soft_update_title);

builder.setMessage(R.string.soft_update_info);

// 更新

builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

dialog.dismiss();

// 显示下载对话框

showDownloadDialog();

}

});

// 稍后更新

builder.setNegativeButton(R.string.soft_update_later, new OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

dialog.dismiss();

}

});

Dialog noticeDialog = builder.create();

noticeDialog.show();

}

/**

* 显示软件下载对话框

*/

private void showDownloadDialog()

{

// 构造软件下载对话框

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle(R.string.soft_updating);

// 给下载对话框增加进度条

final LayoutInflater inflater = LayoutInflater.from(mContext);

View v = inflater.inflate(R.layout.softupdate_progress, null);

mProgress = (ProgressBar) v.findViewById(R.id.update_progress);

builder.setView(v);

// 取消更新

builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

dialog.dismiss();

// 设置取消状态

cancelUpdate = true;

}

});

mDownloadDialog = builder.create();

mDownloadDialog.show();

// 下载文件

downloadApk();

}

/**

* 下载apk文件

*/

private void downloadApk()

{

// 启动新线程下载软件

new downloadApkThread().start();

}

/**

* 下载文件线程

*/

private class downloadApkThread extends Thread

{

@Override

public void run()

{

try

{

// 判断SD卡是否存在,并且是否具有读写权限

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

{

// 获得存储卡的路径

String sdpath = Environment.getExternalStorageDirectory() + "/";

mSavePath = sdpath + "download";

Log.d("installApk",mSavePath);

//创建连接

SmbFile smbFile = new SmbFile(appurl);

int length = smbFile.getContentLength();// 得到文件的大小

InputStream in = new BufferedInputStream(new SmbFileInputStream(smbFile));

File file = new File(mSavePath);

// 判断文件目录是否存在

if (!file.exists())

{

file.mkdir();

}

File apkFile = new File(mSavePath, "SocketClient");

FileOutputStream fos = new FileOutputStream(apkFile);

int count = 0;

// 缓存

byte buf[] = new byte[1024];

// 写入到文件中

do

{

int numread = in.read(buf);

count += numread;

// 计算进度条位置

progress = (int) (((float) count / length) * 100);

// 更新进度

mHandler.sendEmptyMessage(DOWNLOAD);

if (numread <= 0)

{

// 下载完成

mHandler.sendEmptyMessage(DOWNLOAD_FINISH);

break;

}

// 写入文件

fos.write(buf, 0, numread);

} while (!cancelUpdate);// 点击取消就停止下载.

fos.close();

in.close();

}

} catch (MalformedURLException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

}

// 取消下载对话框显示

mDownloadDialog.dismiss();

}

};

/**

* 安装APK文件

*/

private void installApk()

{

File apkfile = new File(mSavePath, mHashMap.get("name"));

if (!apkfile.exists())

{

return;

}

Log.d("installApk","---start");

// 通过Intent安装APK文件

Intent i = new Intent(Intent.ACTION_VIEW);

i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");

mContext.startActivity(i);

}

}代码注释也挺详细,在此不再多说;

说说在此过程中遇到的一个问题,本来是想在

这个地方直接调用showNoticeDialog();但是运行时却有个异常,导致dialog没有显示出来:java.lang.RuntimeException:Can't create handler inside thread that has not called Looper.prepare();

后来查资料才得知在android子线程中不能直接控制UI组件;可以通过mHandler.sendMessage来实现;

经过调试成从本地局域网电脑获取共享的文件,并且升级成功;

java smb下载文件代码_java利用SMB共享文件进行局域网文件的下载及apk升级相关推荐

  1. c语言创建excel文件6,怎么利用c语言创建excel文件

    怎么利用c语言创建excel文件 想要利用c语言创建excel文件再把它导入excel其实很简单,如果数据简单的话,可以使用CSV(逗号分隔值)格式的文件.CSV格式的文件可以用OfficeExcel ...

  2. java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...

  3. php远程文件包含攻击,利用SMB共享来绕过php远程文件包含的限制

    在这篇博文中,我将为大家演示如何利用PHP应用中的远程文件包含漏洞的技术.我们将绕过php远程文件包含的限制,并执行RFI的利用,即使PHP环境被配置为不包含来自远程HTTP/FTP URL的文件. ...

  4. java结束全部操作代码_Java创建与结束线程代码示例

    这篇文章主要介绍了Java创建与结束线程代码示例,小编觉得挺不错的,这里分享给大家,供需要的朋友参考. 本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程 ...

  5. java命令 jar文件夹_java中jar命令打包一个文件夹下的所有文件

    (1)首先,必须保证java的所有路径都设置好,在dos提示符下输入jar -help 出现C:\Documents and Settings\dly>jar -help 非法选项:h 用法:j ...

  6. gdal java shp_【GDAL/OGR】利用GDAL/OGR读取shp文件并转换为json文件(Java版)

    前言: 对于GIS开发者来说,GDAL/OGR是最熟悉不过的开源GIS库了,GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间 ...

  7. java中excel上传_java对excel表格的上传和下载处理

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...

  8. java 按行读取大文件文件内容_Java实现按行读取大文件

    Java实现按行读取大文件 String file = "F:" + File.separator + "a.txt"; FileInputStream fis ...

  9. java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解

    java 使用IO流实现大文件的分割与合并 文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时 ...

最新文章

  1. 桌面上的计算机打开速度慢,电脑开机进入桌面特别慢
  2. css中小型大写,css3 – OpenType小型大写的CSS回退
  3. 2015年蓝汛面试题
  4. 操作数据库(对战小游戏)
  5. subline3插件html,Sublime Text3与html的插件
  6. android 简单json,Android JSON数据简单处理
  7. java的代理Proxy.newProxyInstance
  8. Python学习笔记 之 变量进阶
  9. python古诗词生成_唐诗生成器
  10. 博应用教你使用华为nova3添加桌面小工具
  11. Pandas的crosstab函数
  12. Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version)
  13. 若依(RuoYi)配置教程
  14. 用illustrator、AI将边框线转换为填充形状
  15. Rust 最受喜爱却少有人用,Python 仅排第六,2021 全球开发者调查报告出炉
  16. error: Microsoft Visual C++ 9.0 is required (Unabl
  17. Deep Nets Sublinear Memory Cost 笔记
  18. Java实现 蓝桥杯 算法训练 未名湖边的烦恼
  19. 清理电脑,使其加速!
  20. python chicken(6)

热门文章

  1. 电商竞逐景区大数据 前景值得期待
  2. 以太坊智能合约代码查看
  3. 对话亚马逊CTO沃纳·威格尔,让我想到了王菲的三首歌……
  4. 2018天猫双11全球狂欢节全天交易额2135亿元
  5. Windows Vista减肥完全攻略
  6. 怎样才能看到很多个网站的神马权重是多少 站长工具综合查询
  7. DEM转换为gltf
  8. 润乾报表日志文件的配置方法
  9. OSChina 愚人节乱弹 ——愚人节新技能!快来点满整蛊技能树!
  10. 指针,引用,与按值传递