网络请求
okhttp的依赖:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
网络权限和相机权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
对Okhttp的封装:
public class HttpUtils1 {
private static HttpUtils1 httpUtils;
private final OkHttpClient client;
private HttpUtils1() {
/**
* 自定义拦截器上传公共参数
*/
client = new OkHttpClient();
}
public static HttpUtils1 getHttpUtils(){
if(httpUtils==null){
synchronized (HttpUtils1.class){
httpUtils=new HttpUtils1();
}
}
return httpUtils;
}
/**
* get请求
* @param str
* @param callback
*/
public void doGet(String str, Callback callback){
Request build = new Request.Builder().url(str).build();
client.newCall(build).enqueue(callback);
}
/**
* post请求
*/
public void doPost(String str, Map<String,String> map, Callback callback){
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String,String> entry:map.entrySet()
) {
builder.add(entry.getKey(),entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder().url(str).post(formBody).build();
client.newCall(request).enqueue(callback);
}
public void uploadFile(HashMap<String, Object> paramsMap, String filePath, final CallBackListener listener) {
//http://120.27.23.105/file/upload
try {
String actionUrl = "file/upload";
String sdcardPath = Environment.getExternalStorageDirectory().getPath();
filePath = sdcardPath + filePath;
final String requestUrl = String.format("%s%s", "http://120.27.23.105/", actionUrl);
File file = new File(filePath);
MultipartBody.Builder builder = new MultipartBody.Builder();
//设置类型 表单
builder.setType(MultipartBody.FORM);
for (String key : paramsMap.keySet()) {
Object object = paramsMap.get(key);
builder.addFormDataPart(key, object.toString());
}//image/jpeg
// MediaType mediaType = MediaType.parse("application/octet-stream");
//MediaType mediaType = MediaType.parse("image/jpeg");
builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
//创建RequestBody
RequestBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(requestUrl).post(body).build();
//单独设置参数 比如读取超时时间
final Call call = getOKHttpClient().newBuilder().build().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (null != listener) {
listener.onError("上传失败" + requestUrl + "|" + e.toString());
}
Log.e("TAG", "上传失败==" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String string = response.body().string();
if (null != listener) {
listener.onSuccess("" + string + requestUrl);
}
Log.e("TAG", "上传成功==" + string);
} else {
Log.e("TAG", "上传失败------------");
if (null != listener) {
listener.onError("上传失败" + requestUrl);
}
}
}
});
} catch (Exception e) {
if (null != listener) {
listener.onError("上传失败" + e.getMessage());
}
}
}
private OkHttpClient getOKHttpClient() {
OkHttpClient client = new OkHttpClient
.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
return client;
}
}
写个接口回调的方法:
public interface CallBackListener {
public void onSuccess(String msg);
public void onError(String msg);
}
mainactivity的布局:
public interface CallBackListener {
public void onSuccess(String msg);
public void onError(String msg);
}
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.baiwei.shenxuesong.sctx.MainActivity">
<ImageView
android:id="@+id/iv_tx"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"/>
</android.support.constraint.ConstraintLayout>
dialog_select_photo的布局:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_gravity="center_horizontal"
android:id="@+id/tv_select_gallery"
android:textSize="20sp"
android:text="从 相册中选取"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_select_camera"
android:textSize="20sp"
android:text="拍照"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
主要的逻辑代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_gravity="center_horizontal"
android:id="@+id/tv_select_gallery"
android:textSize="20sp"
android:text="从 相册中选取"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_select_camera"
android:textSize="20sp"
android:text="拍照"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener ,CallBackListener{ private ImageView img; private static String path = "/sdcard/myHead/"; private Bitmap head; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = findViewById(R.id.iv_tx); img.setOnClickListener(this); Bitmap bt = BitmapFactory.decodeFile(path + "head.jpg");// 从SD卡中找头像,转换成Bitmap if (bt != null) { @SuppressWarnings("deprecation") Drawable drawable = new BitmapDrawable(bt);// 转换成drawable img.setImageDrawable(drawable); } else { /** * 如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中 * */ } } @Override public void onClick(View view) { showTypeDialog(); } private void showTypeDialog() { //创建AlertDialog AlertDialog.Builder builder = new AlertDialog.Builder(this); final AlertDialog dialog = builder.create(); View view = View.inflate(this, R.layout.dialog_select_photo, null); TextView tv_select_gallery = (TextView) view.findViewById(R.id.tv_select_gallery); TextView tv_select_camera = (TextView) view.findViewById(R.id.tv_select_camera); tv_select_gallery.setOnClickListener(new View.OnClickListener() {// 在相册中选取 @Override public void onClick(View v) { Intent intent1 = new Intent(Intent.ACTION_PICK, null); intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent1, 1); dialog.dismiss(); } }); tv_select_camera.setOnClickListener(new View.OnClickListener() {// 调用照相机 @Override public void onClick(View v) { Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "mmexport1511619684769.jpg"))); startActivityForResult(intent2, 2);// 采用ForResult打开 dialog.dismiss(); } }); dialog.setView(view); dialog.show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { cropPhoto(data.getData());// 裁剪图片 } break; case 2: if (resultCode == RESULT_OK) { File temp = new File(Environment.getExternalStorageDirectory() + "/mmexport1511619684769.jpg"); cropPhoto(Uri.fromFile(temp));// 裁剪图片 } break; case 3: if (data != null) { Bundle extras = data.getExtras(); head = extras.getParcelable("data"); if (head != null) { /** * 上传服务器代码 */ setPicToView(head);// 保存在SD卡中 img.setImageBitmap(head);// 用ImageView显示出来 } }else{ getTu(); } break; default: break; } super.onActivityResult(requestCode, resultCode, data); } /** * 调用系统的裁剪功能 * * @param uri */ public void cropPhoto(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, 3); } /** * 读取 * @param mBitmap */ private void setPicToView(Bitmap mBitmap) { String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 return; } FileOutputStream b = null; File file = new File(path); file.mkdirs();// 创建文件夹 String fileName = path + "mmexport1511619684769.jpg";// 图片名字 try { b = new FileOutputStream(fileName); mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { // 关闭流 b.flush(); b.close(); } catch (IOException e) { e.printStackTrace(); } } } /* @Override public void showStr(String s) { Toast.makeText(getActivity().getApplicationContext(), "", Toast.LENGTH_SHORT).show(); } */ /** * 网络下载 */ private void getTu(){ //上传图片 HashMap<String, Object> paramsMap = new HashMap<String, Object>(); paramsMap.put("uid", "71"); //网络请求 HttpUtils1.getHttpUtils().uploadFile(paramsMap, "/abc123.jpg", this); } @Override public void onSuccess(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onError(String msg) { // Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } }