• xutils工具上传日志文件--使用https并且带进度条显示


    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() + "
    ==> 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

    下面

  • 相关阅读:
    myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)
    使用Android Studio调试UiAutomator过程中遇到的问题
    手游性能之渲染分析2
    手游性能之渲染分析1
    手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳
    手脱ASProtect v1.23 RC1(有Stolen Code)
    Java 中extends与implements使用方法
    Java在处理大数据的时候一些小技巧
    Oracle 分页原理
    powerdesigner连接数据库 导出数据
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7569792.html
Copyright © 2020-2023  润新知