package logback.ecmapplication.cetcs.com.myapplication;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xutils.common.Callback;
import org.xutils.db.sqlite.KeyValue;
import org.xutils.http.RequestParams;
import org.xutils.http.body.MultipartBody; import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.xutils.x; import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory; import static logback.ecmapplication.cetcs.com.myapplication.EcmsApplication.log;
/****
*
* 几点注意事项:
* 1、如果app存在代码混淆,对功能有影响
* 2、运行app的时候一定要记得把对应的存储权限打开,在android 6.0以上要做权限检查
* 把手机内部存储android/data/com.cetcs.ecmapplication/logs下的文件压缩成zip文件
* zip文件存储在android/data/com.cetcs.ecmapplication/目录下ecmslog.zip
* 然后使用xutils将android/data/com.cetcs.ecmapplication/ecmslog.zip上传到
* http://10.12.8.8:8080/UpLoad_file/upload后台
* 使用https:http://blog.csdn.net/haoaoo/article/details/54614875
* */ public class MainActivity extends Activity {
private Button btn;
// Log.d(ECM_TAG, "->" + tag + ":" + msg)
private final static String CLASS_TAG = "MainActivity";
private final static String ECM_TAG = "ecms2223";
private ProgressDialog progressDialog;
private static SSLContext mSSLContext = null;
private static final String TAG = "NetWorkUtils";
public static int DEFAULT_CACHE_EXPIRY_TIME = 30 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "522552522525");
new Thread(new Runnable() {
@Override
public void run() {
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "2323222522552522525");
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "232322253533636522552522525");
}
}).start(); /* log.info(ECM_TAG,CLASS_TAG,"骂我们skkjfskjjkfsjk");
log.warn(CLASS_TAG,"424424242422424");
log.error(CLASS_TAG,"jkklsakkfa2322323");
log.getName();*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(MainActivity.this,"上传文件",Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this,"上传文件dssd",Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
///storage/emulated/0/android/data/com.cetcs.ecmapplication/logs
String sourceFilePath = Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication"+File.separator+"logs";
String zipFilePath = Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication";
log.error("jkklsakkfa2322323 sourceFilePath :"+sourceFilePath);
String fileName = "ecmslog";
boolean flag = FileToZip.fileToZip(sourceFilePath, zipFilePath, fileName);
if(flag){
log.info(" jkklsakkfa2322323文件打包成功!");
}else{
log.info(" jkklsakkfa2322323文件打包失败");
} final File f = new File(Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication"+File.separator+"ecmslog.zip");
log.info(" jkklsakkfa2322323上传文件路径{}"+f.toString());
if(f!= null && f.exists()){
log.info(" jkklsakkfa2322323上传文件存在");
}else{
log.info(" jkklsakkfa2322323上传文件不存在");
return;
}
String URL = "https://ecm-log.westone-service.cn:7777/UpLoad_file/upload";
RequestParams params = new RequestParams(URL);
SSLContext sslContext = getSSLContext(MainActivity.this); params.setSslSocketFactory(sslContext.getSocketFactory()); params.setMultipart(true);
params.addBodyParameter("imei",SystemUtil.getIMEI(getApplication()));
params.addBodyParameter("phoneNumber","18780279472");
params.addBodyParameter("phone_model",SystemUtil.getDeviceBrand()+":"+SystemUtil.getSystemModel());
params.addBodyParameter("appPackageName","com.cetcs.ecmapplication");
params.addBodyParameter("app_versionName","1.7.8.1");
params.addBodyParameter("app_versionCode","200");
params.addBodyParameter("File",f,null,"ecmslog.zip");
x.http().post(params, new Callback.ProgressCallback<File>() {
@Override
public void onWaiting() { } @Override
public void onStarted() {
progressDialog = new ProgressDialog(
MainActivity.this);
progressDialog.setTitle("日志上传中...");
progressDialog.setMessage("");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setProgressNumberFormat("%1d Mb /%2d Mb");
progressDialog.show();
} @Override
public void onLoading(long total, long current,
boolean isUploading) {
log.error("jkklsakkfa2322323 onLoading :"+ total +","+current+""+(int) (((int) current / (float) total) * 100));
log.error("jkklsakkfa2322323 onLoading :"+bytes2kb(current));
int process = (int)((current * 1.0 / total)*100);
progressDialog.setMessage(""+bytes2kb(current)+"/"+bytes2kb(total)+" "+process+"%");
progressDialog.setProgress(process); } @Override
public void onSuccess(File file) {
progressDialog.dismiss();
log.error("jkklsakkfa2322323 onSuccess");
Toast.makeText(MainActivity.this,file.getName()+"文件成功",Toast.LENGTH_LONG).show();
} @Override
public void onError(Throwable throwable, boolean b) {
progressDialog.dismiss();
log.error("jkklsakkfa2322323 onError");
Toast.makeText(MainActivity.this,f.getName()+"上传文件失败"+throwable.getMessage(),Toast.LENGTH_LONG).show();
} @Override
public void onCancelled(CancelledException e) {
log.error("jkklsakkfa2322323 onCancelled");
} @Override
public void onFinished() {
log.error("jkklsakkfa2322323 onFinished");
}
});
}
}).start(); }
}); } /**
* byte(字节)根据长度转成kb(千字节)和mb(兆字节)
*
* @param bytes
* @return
*/
public static String bytes2kb(long bytes) {
BigDecimal filesize = new BigDecimal(bytes);
BigDecimal megabyte = new BigDecimal(1024 * 1024);
float returnValue = filesize.divide(megabyte, 2, BigDecimal.ROUND_UP)
.floatValue();
if (returnValue > 1)
return (returnValue + "MB");
BigDecimal kilobyte = new BigDecimal(1024);
returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP)
.floatValue();
return (returnValue + "KB");
} public static String getPrintSize(long size) {
//如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
if (size < 1024) {
return String.valueOf(size) + "B";
} else {
size = size / 1024;
}
//如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
//因为还没有到达要使用另一个单位的时候
//接下去以此类推
if (size < 1024) {
return String.valueOf(size) + "KB";
} else {
size = size / 1024;
}
if (size < 1024) {
//因为如果以MB为单位的话,要保留最后1位小数,
//因此,把此数乘以100之后再取余
size = size * 100;
return String.valueOf((size / 100)) + "."
+ String.valueOf((size % 100)) + "MB";
} else {
//否则如果要以GB为单位的,先除于1024再作同样的处理
size = size * 100 / 1024;
return String.valueOf((size / 100)) + "."
+ String.valueOf((size % 100)) + "GB";
}
} /**
* 获取Https的证书
*
* @param context 上下文
* @return SSL的上下文对象
*/
private static SSLContext getSSLContext(Context context) {
CertificateFactory certificateFactory = null;
InputStream inputStream = null;
Certificate cer = null;
KeyStore keystore = null;
TrustManagerFactory trustManagerFactory = null;
try {
certificateFactory = CertificateFactory.getInstance("X.509");
inputStream = context.getAssets().open("upload_logs.cer");//这里导入SSL证书文件
try {
cer = certificateFactory.generateCertificate(inputStream);
} finally {
inputStream.close();
} //创建一个证书库,并将证书导入证书库
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null, null); //双向验证时使用
keystore.setCertificateEntry("trust", cer); // 实例化信任库
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore); mSSLContext = SSLContext.getInstance("TLS");
mSSLContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); //信任所有证书 (官方不推荐使用)
// s_sSLContext.init(null, new TrustManager[]{new X509TrustManager() {
//
// @Override
// public X509Certificate[] getAcceptedIssuers() {
// return null;
// }
//
// @Override
// public void checkServerTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
//
// @Override
// public void checkClientTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
// }}, new SecureRandom()); return mSSLContext; } catch (Exception e) {
e.printStackTrace();
}
return null;
} }

使用hppts参考:

http://blog.csdn.net/haoaoo/article/details/54614875

随着17年ios上线必须要支持https,以及考虑到网络安全这块,越来越多的APP开发支持和使用https。

在gradle里配置 
compile 'org.xutils:xutils:3.2.2'

在Application里配置

x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG);

  

public class NetWorkUtils {

    private static SSLContext mSSLContext = null;
private static final String TAG = "NetWorkUtils";
public static int DEFAULT_CACHE_EXPIRY_TIME = 30 * 1000; /**
* http get请求
*
* @param params 请求参数 get请求使用 addQueryStringParameter方法添加参数
* @param callback 回调对象
*/
public static Callback.Cancelable getHttpRequest(RequestParams params, final HttpCallback callback) {
return sendHttpRequest(HttpMethod.GET, params, callback);
} /**
* http post请求
*
* @param params 请求参数 post请求使用 addBodyParameter方法添加参数
* @param callback 回调对象
*/
public static Callback.Cancelable postHttpRequest(RequestParams params, final HttpCallback callback) {
return sendHttpRequest(HttpMethod.POST, params, callback);
} public static Callback.Cancelable sendHttpRequest(HttpMethod method, RequestParams params, final HttpCallback callback) { if (params == null) {
params = new RequestParams();
} params.setCacheMaxAge(1000 * 0); //为请求添加缓存时间
params.setConnectTimeout(DEFAULT_CACHE_EXPIRY_TIME);
final String url = params.getUri(); LogUtil.d("sendRequest: url = " + url);
SSLContext sslContext = getSSLContext(GoPlusApplication.getApplication());
if (null == sslContext) {
if (BuildConfig.DEBUG) LogManager.d(TAG, "Error:Can't Get SSLContext!");
return null;
} params.setSslSocketFactory(sslContext.getSocketFactory()); return x.http().request(method, params, new Callback.CommonCallback<String>() { @Override
public void onCancelled(CancelledException msg) {
Toast.makeText(text, msg.getMessage(), Toast.LENGTH_SHORT).show();
callback.onFinished();
} @Override
public void onError(Throwable arg0, boolean arg1) {
Toast.makeText(text, arg0.getMessage(), Toast.LENGTH_SHORT).show();
LogManager.i(TAG, "==> RequestCallBack.onError()");
LogManager.e(TAG, "==> response:" + arg0.getMessage() + "\n==> error:" + arg1);
callback.onFinished();
} @Override
public void onSuccess(String result) {
LogManager.i(TAG, "==> RequestCallBack.onSuccess()");
if (result == null) {
return;
}
callback.onSuccess(result);
} @Override
public void onFinished() {
LogUtil.d("onFinished");
}
});
} /**
* 获取Https的证书
*
* @param context 上下文
* @return SSL的上下文对象
*/
private static SSLContext getSSLContext(Context context) {
CertificateFactory certificateFactory = null;
InputStream inputStream = null;
Certificate cer = null;
KeyStore keystore = null;
TrustManagerFactory trustManagerFactory = null;
try {
certificateFactory = CertificateFactory.getInstance("X.509");
inputStream = context.getAssets().open("baidu.cer");//这里导入SSL证书文件
try {
cer = certificateFactory.generateCertificate(inputStream);
LogManager.i(TAG, cer.getPublicKey().toString());
} finally {
inputStream.close();
} //创建一个证书库,并将证书导入证书库
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null, null); //双向验证时使用
keystore.setCertificateEntry("trust", cer); // 实例化信任库
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore); mSSLContext = SSLContext.getInstance("TLS");
mSSLContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); //信任所有证书 (官方不推荐使用)
// s_sSLContext.init(null, new TrustManager[]{new X509TrustManager() {
//
// @Override
// public X509Certificate[] getAcceptedIssuers() {
// return null;
// }
//
// @Override
// public void checkServerTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
//
// @Override
// public void checkClientTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
// }}, new SecureRandom()); return mSSLContext; } catch (Exception e) {
e.printStackTrace();
}
return null;
}
} public static abstract class HttpCallback {
public abstract void onSucc(String result); public abstract void onfailed();
}

所谓的https协议本质上是看你如何产生SSLFactory

下面

xutils工具上传日志文件--使用https并且带进度条显示的更多相关文章

  1. xutils工具上传日志文件--后台服务器的搭建

    在上一篇文章中使用xutils将手机上保存的日志上传到后台服务器中,现在我们来讲后台服务器是如何搭建的 后台服务器采用jsp+sevlet+mysql的框架 首先讲mysql数据库的表的建立 在fil ...

  2. xutils工具上传日志文件

    首先下载xutils java包: 添加到项目的工程中: 第二在新建一个类继承application package logback.ecmapplication.cetcs.com.myapplic ...

  3. Azure IoT Hub 十分钟入门系列 (4)- 实现从设备上传日志文件/图片到 Azure Storage

    本文主要分享一个案例: 10分钟内通过Device SDK上传文件到IoTHub B站视频:https://www.bilibili.com/video/av90224073/ 本文主要有如下内容: ...

  4. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  5. flume 增量上传日志文件到HDFS中

    1.采集日志文件时一个很常见的现象 采集需求:比如业务系统使用log4j生成日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs中. 1.1.根据需求,首先定义一下3大要素: 采集源 ...

  6. Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

    上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($ ...

  7. 两种方法上传本地文件到github

    https://www.jianshu.com/p/c70ca3a02087 自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的 ...

  8. 两种方法上传本地文件到github(转)

    自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...

  9. Winform上传下载文件代码

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...

随机推荐

  1. StringBuffer & StringBuilder

    java.lang.StringBuffer: ①代表可变的字符序列,可以对字符串内容进行增删.                       ②很多方法与String相同,但StingBuffer是可 ...

  2. 从汉堡加料说起——浅谈C#中的Decorator模式

    相信大家都在都在汉堡店吃过汉堡,有些汉堡店很有特色,推出了汉堡订制服务,即,可以在汉堡中加料,加肉饼,加生菜之类(有点类似我们本地的肥肠粉里面加冒结子).更是让不少吃货大快朵颐,大呼过瘾,加6,7层肉 ...

  3. JSON.parse() 的实现

    目录 1. JSON.parse() 2. 前置知识 2.1 JSON格式中的数据类型 2.2 转义字符的处理 2.2 判断对象是否相等 2.3 寻找匹配的字符串 2.4 基础的递归思想 3. 实现流 ...

  4. (Java实现) 洛谷 P1106 删数问题

    题目描述 键盘输入一个高精度的正整数NN(不超过250250位) ,去掉其中任意kk个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的NN和kk,寻找一种方案使得剩下的数字组成的新数最小 ...

  5. Java实现 蓝桥杯 算法提高 求arccos值

    算法提高 7-2求arccos值 时间限制:10.0s 内存限制:256.0MB 提交此题 问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1 ...

  6. Java实现 LeetCode 46 全排列

    46. 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2] ...

  7. java实现三进制转十进制

    ** 三进制转十进制** 不同进制的数值间的转换是软件开发中很可能 会遇到的常规问题.下面的代码演示了如何把键盘输入的3 进制数字转换为十进制.试完善之. BufferedReader br = ne ...

  8. Java实现第九届蓝桥杯耐摔指数

    耐摔指数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...

  9. java实现第七届蓝桥杯平方圈怪

    平方圈怪 题目描述 如果把一个正整数的每一位都平方后再求和,得到一个新的正整数. 对新产生的正整数再做同样的处理. 如此一来,你会发现,不管开始取的是什么数字, 最终如果不是落入1,就是落入同一个循环 ...

  10. Java实现第八届蓝桥杯字母组串

    字母组串 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA","AA ...