package com.example.mr.weektwo_work.utils;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by Mr赵 on 2017/12/9.
*/
public class OkUrl {
//创建全局的okhttp
private static OkHttpClient
okHttpClient=
null;
private OkUrl() {
}
//将缓存的路径和超时操作抽成方法
public static OkHttpClient getInstance(){
if(
okHttpClient==
null){
//加同步安全
synchronized (OkHttpClient.
class){
if(
okHttpClient==
null){
//缓存路径
File secache=
new File(Environment.
getExternalStorageDirectory(),
"cache");
//指定缓存文件大小
int ceche=
10*
1024*
1024;
//创建构造器
okHttpClient =
new OkHttpClient.Builder()
//连接超时
.connectTimeout(
15, TimeUnit.
SECONDS)
//读写超时
.writeTimeout(
20,TimeUnit.
SECONDS).readTimeout(
202,TimeUnit.
SECONDS)
.build();
}
}
}
return okHttpClient;
}
/*
* get请求
* url路径 回调的callbask
* */
public static void doget(String url, Callback callback){
//创建请求对象---对象已经封装好
OkHttpClient okHttpClient=
getInstance();
//创建Request
Request request =
new Request.Builder().url(url).build();
//得到Call对象
Call call = okHttpClient.newCall(request);
//执行异步请求
call.enqueue(callback);
}
/**
* post请求
* 参数1 url
* 参数2 Map<String, String> params post请求的时候给服务器传的数据
* add..("","")
* add()
*/
public static void doPost(String url, Map<String, String> params, Callback callback) {
//创建OkHttpClient请求对象
OkHttpClient okHttpClient =
getInstance();
//3.x版本post请求换成FormBody 封装键值对参数
FormBody.Builder builder =
new FormBody.Builder();
//遍历集合
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
//创建Request
Request request =
new Request.Builder().url(url).post(builder.build()).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* post请求上传文件....包括图片....流的形式传任意文件...
* 参数1 url
* file表示上传的文件
* fileName....文件的名字,,例如aaa.jpg
* params ....传递除了file文件 其他的参数放到map集合
*
*/
public static void uploadFile(String url, File file, String fileName,Map<String,String> params) {
//创建OkHttpClient请求对象
OkHttpClient okHttpClient =
getInstance();
MultipartBody.Builder builder =
new MultipartBody.Builder();
builder.setType(MultipartBody.
FORM);
//参数
if (params !=
null){
for (String key : params.keySet()){
builder.addFormDataPart(key,params.get(key));
}
}
//文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,此处应该改变
builder.addFormDataPart(
"file",fileName, RequestBody.
create(MediaType.
parse(
"application/octet-stream"),file));
//构建
MultipartBody multipartBody = builder.build();
//创建Request
Request request =
new Request.Builder().url(url).post(multipartBody).build();
//得到Call
Call call = okHttpClient.newCall(request);
//执行请求
call.enqueue(
new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response)
throws IOException {
//上传成功回调 目前不需要处理
if (response.isSuccessful()){
String s = response.body().string();
com.orhanobut.logger.Logger.
e(
"上传--"+s);
}
}
});
}
/**
* Post请求发送JSON数据....{"name":"zhangsan","pwd":"123456"}
* 参数一:请求Url
* 参数二:请求的JSON
* 参数三:请求回调
*/
public static void doPostJson(String url, String jsonParams, Callback callback) {
RequestBody requestBody = RequestBody.
create(MediaType.
parse(
"application/json; charset=utf-8"), jsonParams);
Request request =
new Request.Builder().url(url).post(requestBody).build();
Call call =
getInstance().newCall(request);
call.enqueue(callback);
}
/**
* 下载文件 以流的形式把apk写入的指定文件 得到file后进行安装
* 参数er:请求Url
* 参数san:保存文件的文件夹....download
*/
public static void download(
final Activity context,
final String url,
final String saveDir) {
Request request =
new Request.Builder().url(url).build();
Call call =
getInstance().newCall(request);
call.enqueue(
new Callback() {
@Override
public void onFailure(Call call, IOException e) {
com.orhanobut.logger.Logger.
e(e.getLocalizedMessage());
}
@Override
public void onResponse(Call call,
final Response response)
throws IOException {
InputStream is =
null;
byte[] buf =
new byte[
2048];
int len =
0;
FileOutputStream fos =
null;
try {
is = response.body().byteStream();
//以字节流的形式拿回响应实体内容
//apk保存路径
final String fileDir =
isExistDir(
saveDir);
//文件
File file =
new File(fileDir,
getNameFromUrl(
url));
fos =
new FileOutputStream(file);
while ((len = is.read(buf)) != -
1) {
fos.write(buf,
0, len);
}
fos.flush();
context.runOnUiThread(
new Runnable() {
@Override
public void run() {
Toast.
makeText(
context,
"下载成功:" +
fileDir +
"," +
getNameFromUrl(
url), Toast.
LENGTH_SHORT).show();
}
});
//apk下载完成后 调用系统的安装方法
Intent intent =
new Intent(Intent.
ACTION_VIEW);
intent.setDataAndType(Uri.
fromFile(file),
"application/vnd.android.package-archive");
context.startActivity(intent);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (is !=
null) is.close();
if (fos !=
null) fos.close();
}
}
});
}
private static String isExistDir(String saveDir)
throws IOException {
// 下载位置
if (Environment.
getExternalStorageState().equals(Environment.
MEDIA_MOUNTED)) {
File downloadFile =
new File(Environment.
getExternalStorageDirectory(), saveDir);
if (!downloadFile.mkdirs()) {
downloadFile.createNewFile();
}
String savePath = downloadFile.getAbsolutePath();
Log.
e(
"savePath", savePath);
return savePath;
}
return null;
}
/**
* @param url
* @return 从下载连接中解析出文件名
*/
private static String getNameFromUrl(String url) {
return url.substring(url.lastIndexOf(
"/") +
1);
}
}