android 自动检测版本,更新最新版本

mysql数据字典

数据字典
数据示例

android代码

  //显示正在下载对话框
    protected void showDownloadDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle("更新版本中");
        View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_progress, null);
        mProgressBar = (ProgressBar) view.findViewById(R.id.id_progress);
        builder.setView(view);

//        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
//            @Override
//            public void onClick(DialogInterface dialog, int which) {
//                dialog.dismiss();// 隐藏当前对话框
//                mIsCancel = true;// 设置下载状态为取消
//            }
//        });

        mDownloadDialog = builder.create();
        mDownloadDialog.show();

        // 下载文件
        downloadAPK();
    }
    
  //开启新线程下载apk文件
    private void downloadAPK() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{	//  MEDIA_MOUNTED--SD卡正常挂载 、/mnt/sdcard目录存在 、可读、可写、可在该目录下面创建文件、文件夹
                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                    	//获取扩展存储设备的文件目录---Environment.getExternalStorageDirectory()
                        String sdPath = Environment.getExternalStorageDirectory() + "/";
//                      apk文件保存路径
                        mSavePath = sdPath + "eqptdownload";
                        Log.i(TAG, "设备管理mSavePath--"+mSavePath);
                        //定义一个目录
                        File dir = new File(mSavePath);
                        //如果目录不存在,就创建该目录
                        if (!dir.exists()){
                            dir.mkdir();
                            Log.i(TAG, "创建目录成功");
                        }
                        // 下载文件
                        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                        conn.connect();
                      //用getInputStream()方法获得服务器返回的输入流
                        InputStream is = conn.getInputStream();
                        int length = conn.getContentLength();
                        Log.i(TAG, "创建file对象");
                        //创建一个file对象
                        File apkFile = new File(mSavePath, mVersion_name);
                        Log.i(TAG, "创建file对象成功");
                        
                      //创建FileOutputStream流把数据写到apkFile文件中
                        FileOutputStream fos = new FileOutputStream(apkFile);
                        Log.i(TAG, "创建FileOutputStream流");
                        int count = 0;
                        //流转换为二进制数组,read()是转换方法
                          byte[] buffer = new byte[1024];
                          while (!mIsCancel){
                              int numread = is.read(buffer);
//                              System.out.println("numread--"+numread);
                              count += numread;
//                              System.out.println("count--"+count);
                              // 计算进度条的当前位置
                              mProgress = (int) (((float)count/length) * 100);
                              // 更新进度条
                              mUpdateProgressHandler.sendEmptyMessage(1);

                              // 下载完成
                              if (numread < 0){
                                  mUpdateProgressHandler.sendEmptyMessage(2);
                                  Log.i(TAG, "下载完成");
                                  break;
                              }
                              //一次最多读取的字节数不超过numread
                              fos.write(buffer, 0, numread);
                          }
                          fos.close();
                          is.close();
                      
                    }
                    else {
                    	Log.i(TAG, "找不到路径1");
                    }
                }catch(Exception e){
                	Log.i(TAG, "找不到路径2");
                    e.printStackTrace();
                    Log.i(TAG, "异常信息--"+e.toString());
                }
            }
        }).start();
    }
	
    //接收消息
    private Handler mUpdateProgressHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    // 设置进度条
                    mProgressBar.setProgress(mProgress);
                    break;
                case 2:
                    // 隐藏当前下载对话框
                    mDownloadDialog.dismiss();
                    // 安装 APK 文件
                    installAPK();
            }
        };
    };
	
	//下载到本地后执行安装
    protected void installAPK() {
        File apkFile = new File(mSavePath, mVersion_name);
        if (!apkFile.exists()){
        	Log.i(TAG, "未找到apk文件");
        }
        else {
        	Log.i(TAG, "有找到apk文件");
            
//          下载完之后,使用intent弹出一个安装对话框
          Intent intent = new Intent(Intent.ACTION_VIEW);
//        安装完成后,启动app(源码中少了这句话)
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          Uri uri = Uri.parse("file://" + apkFile.toString());
          //	"application/vnd.android.package-archive"是文件类型,具体对应apk类型。
          intent.setDataAndType(uri, "application/vnd.android.package-archive");
          mContext.startActivity(intent);  //弹出一个安装对话框

        	//自动静默安装apk,无需用户确认
//        	if( slientInstall(apkFile) ) {
        		Log.i(TAG, "安装成功!");
        		//增加设备下载apk记录
                string = "wf_eqpt#insert_eqpt#s#INSERT INTO `install_list`(`install_version`, `install_date`, `ip`, `mac`, `respon`) VALUES('"+versionStr[0][0]+"', NOW(), '"+ip+"', '"+myMac+"', '"+job_edit.getText().toString()+"');";
                //使用socket从服务器获取数据
                get_from_socket(string);
//        	}

        }
        
    }
    
    //android 静默安装并启动
    public static boolean slientInstall(File apk_file) {  // String tempPath

//		File file = new File(tempPath);
    	File file=apk_file;
		boolean result = false;
		Process process = null;
		OutputStream out = null;
		if (file.exists()) {
			System.out.println(file.getPath() + "==");
			try {
				process = Runtime.getRuntime().exec("su");
				out = process.getOutputStream();
				DataOutputStream dataOutputStream = new DataOutputStream(out);
				// 获取文件所有权限
				dataOutputStream.writeBytes("chmod 777 " + file.getPath() + "\n");
				// 进行静默安装命令
				dataOutputStream
						.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r "
								+ file.getPath());
				dataOutputStream.flush();
				// 关闭流操作
				dataOutputStream.close();
				out.close();
				int value = process.waitFor();
				// 代表成功
				if (value == 0) {
					result = true;
					// 失败
				} else if (value == 1) {
					result = false;
					// 未知情况
				} else {
					result = false;
				}
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if (!result) {
				result = true;
			}
		}
		return result;
	}
    
   
	
  //获取当前版本号
    public String getVersion() {
    	try {
    		PackageManager manager = this.getPackageManager();
    		PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
    		String version = info.versionName;
    		return version;
    	} 
    	catch (Exception e) {
    		e.printStackTrace();
    		//找不到版本号
    		return "";
    	}
    }
    ```
    
## 设置权限

```java
<!-- 开启网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
    <!-- 允许访问网络状态的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 允许访问wifi状态的权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 允许修改网络状态的权限 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >
    </uses-permission>
    <!-- 允许修改wifi状态的权限 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 往sdcard中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

运行结果

在这里插入图片描述
在这里插入图片描述


版权声明:本文为weixuan_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。