哪些年遇到过的Andriod问题(13)Mars的下载文件代码不知道是什么问题,在网上去新COPY了一个就可以下载了。

           不知道是哪里不对,用Mars的代码时有问题:下载中卡死,下载的文件大小不对、下载前取不到文件的大小等问题(没有直接用原代码,只是COPY了Mars的代码。多半是在COPY中出现了问题吧)。后来在网东看看西看看,又去COPY了,就发现,可以了,不过还有一些问题不知道如何解决,复学而易之吧。
           说一点是在找MARS老师的毛病,因为我没有没有资格。
          以下的代码是在网上找来修改了一下。还有太多需要重构了。(上班时间后学的。)

//  private String sOtherURL =
//"http://res.neng.com/res/apk_all/20120603/8761_com.dqvmw.penetratepro_41862300_0.apk";
private String sOtherURL =
"http://img.yingyonghui.com/apk/371226/com.yijia.dazhe.1346917954258.apk";
btOther = (Button)findViewById(R.id.btOther);
       btOther.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
              HttpDownLoad httpDownloader = new HttpDownLoad();
              int result = httpDownloader.downFile(sOtherURL,sSDPath,
                     sSDName, true);
              // (-2:连接超时 -1:下载出错 0:下载成功 1:文件存在)
              String sDownLoadInfo = "下载出错 ";
              switch (result) {
              case -2:
                  sDownLoadInfo = "连接超时 ";
                  break;
              case -1:
                  sDownLoadInfo = "下载出错 ";
                  break;
              case 0:
                  sDownLoadInfo = "下载成功 ";
                  String filePath = Environment.getExternalStorageDirectory()
                         + "/" +sSDPath +"/" +sSDName;
                  // 只是想验证下载的APK文件,下对了?文件可以覆盖?
                  openFile(filePath);
                  // 测试:下对了,文件可以覆盖.
                  break;
              case 1:
                  sDownLoadInfo = "文件存在 ";
                  break;
              default:
                  break;
              }
              Toast.makeText(DownLoadActivity.this, sDownLoadInfo,
                     Toast.LENGTH_SHORT).show();
           }
       });
    }
    // 打开APK程序代码
    private void openFile(String filePath) {
       File file = new File(filePath);
       System.out.println("OpenFile>> " + filePath);
       Intent intent = new Intent();
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       intent.setAction(android.content.Intent.ACTION_VIEW);
       intent.setDataAndType(Uri.fromFile(file),
              "application/vnd.android.package-archive");
       startActivity(intent);
    }
 
/**
     * 该函数返回整形 (-2:连接超时-1:下载出错 0:下载成功 )
     */
    public int downFile(String urlStr, String path, String fileName,
           boolean isOverride) {
       String sSDpath = Environment.getExternalStorageDirectory()+"/" + path;
       File fileDl = CreadeFileDir(sSDpath, fileName);
       int iReturn = 0;
 
       try {
           InputStream inSt = URLConnection(urlStr);
 
           FileOutputStream fileOS = new FileOutputStream(fileDl);
           //测试了一下:2048>每次取流的大小>1024
           byte[] buf =newbyte[1024];
 
           int count = 0;
           if (inSt ==null)
              iReturn = -1;
           else {
              count = inSt.read(buf);
              int iTmp =0;
              while (count > 0) {
                  fileOS.write(buf, 0, count);
                  count = inSt.read(buf);
                  iTmp++;
              }
              iReturn = 0;
              System.out.println(" Loop Times>> "+iTmp);
           }
           fileOS.close();
           inSt.close();
       } catch (IOException e) {
           e.printStackTrace();
           System.out.println(e.getMessage());
           iReturn = -1;
       }
       return iReturn;
    }
 
/**
     * 创建目录与文件,返回文件
     */
    public File CreadeFileDir(String sFilePath, String sFileName) {
       File file = null;
       final String fileName = sFileName;
       File tmpFile = new File(sFilePath);
       if (!tmpFile.exists()) {
           tmpFile.mkdir();
       }
       file = new File(sFilePath +"//" + fileName);
       return file;
    }
 
    public InputStream URLConnection(String sURL) {
       InputStream isReturn = null;
       try {
           URL url = new URL(sURL);
           try {
              HttpURLConnection urlConn = (HttpURLConnection) url
                     .openConnection();
 
              // 连接超时,时间
              urlConn.setConnectTimeout(1000);
              //不知道为什么加入下面2句程序要报错???
              // 设置方式为POST
//            urlConn.setRequestMethod("POST");
//            // Post请求不能使用缓存
//            urlConn.setUseCaches(false);
 
              // 设置连接允许输入/输出的标志,不能在连接确定后设置
//            urlConn.setDoInput(true);
//            urlConn.setDoOutput(true);
 
              urlConn.connect();
 
              if (urlConn.getResponseCode() <= 1000) {
                  System.out.println("内容大小:" + urlConn.getContentLength());
                  System.out.println("内容类型:" + urlConn.getContentType());
                  isReturn = urlConn.getInputStream();
              }
           } catch (Exception e) {
              e.printStackTrace();
              System.out.println(e.getMessage());
           }
       } catch (MalformedURLException e) {
           e.printStackTrace();
           System.out.println(e.getMessage());
       }
       return isReturn;
    }


上图为读取流中数据不同的Buffer数组的值,后取流中数据的次数。


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页