一步一步来:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("设置头像"); String[] items = { "选择本地照片", "拍照" }; builder.setNegativeButton("取消", null); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: // 选择本地照片 Intent intent1 = new Intent(Intent.ACTION_PICK); intent1.setType("image/*"); //不截图时,加上intent.putExtra("return-data", true); startActivityForResult(intent1, 101); break; case 1: // 拍照 // 这个出捕获图片的常量值 Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 设置图片输出位置; 输出到制定的uri路径上; intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(sdcardPath+fileName))); // 设置请求码 startActivityForResult(intent2, 100); break; } } }); builder.create().show();回调方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK) { //拍照 Uri uri = Uri.fromFile(new File(sdcardPath + fileName)); startPhotoZoom(uri); } else if (requestCode == 101 && resultCode == RESULT_OK) { //相册 // 获取data中的数据 Uri data2 = data.getData(); startPhotoZoom(data2); //不截图时,直接调用下两行的获取bitmap方式,再转为String,就好了,上传 } else if (requestCode == 102 && resultCode == RESULT_OK) { //这个参数data,是固定写法 Bitmap bitmap = data.getParcelableExtra("data"); //转为String String s = savePhoto(bitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis())); //final String path = data.getData().getPath(); Map<String,Object> mapfile = new HashMap<>(); //这里用了网络请求,上传头像到服务器 mapfile.put("source","android"); mapfile.put("uid","3063"); mapfile.put("file",new File(s)); OKHttpFileUtil.getInstence().upFile(mapfile, new Callback() { @Override public void onFailure(Call call, IOException e) { handler.post(new Runnable() { @Override public void run() { Log.e("MyDetail","上传失败"); } }); } @Override public void onResponse(Call call, Response response) throws IOException { handler.post(new Runnable() { @Override public void run() { Log.e("MyDetail","上传成功"); rp.postt(path, map, MyBean.class); } }); } }); } }网络请求:
package com.example.jingdong.NewMVP.Utils; import com.example.jingdong.HttpUtils.OKHttpUtil; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; /** * Created by Administrator on 2017/12/25 0025. */ public class OKHttpFileUtil { public final static String BASE_URL = "http://120.27.23.105/"; public final static String UPLOAD_FILE_ACTION = "file/upload"; public OkHttpClient okHttpClient; public static volatile OKHttpFileUtil okHttpFileUtil; public OKHttpFileUtil(){ } public static OKHttpFileUtil getInstence(){ if(null==okHttpFileUtil){ synchronized (OKHttpUtil.class){ if(okHttpFileUtil==null){ okHttpFileUtil = new OKHttpFileUtil(); } } } return okHttpFileUtil; } public OkHttpClient getOKHttpCilent(){ okHttpClient = new OkHttpClient.Builder() .readTimeout(10*1000, TimeUnit.SECONDS) .writeTimeout(10*1000,TimeUnit.SECONDS) .connectTimeout(10*1000,TimeUnit.SECONDS).build(); return okHttpClient; } public void upFile(Map<String,Object> map, Callback callback){ String url = String.format("%s%s",BASE_URL,UPLOAD_FILE_ACTION); MultipartBody.Builder multiparbody = new MultipartBody.Builder(); multiparbody.setType(MultipartBody.FORM); for(String key : map.keySet()){ Object o = map.get(key); if(o instanceof String){ multiparbody.addFormDataPart(key,o.toString()); }else if(o instanceof File){ File file = (File) o; multiparbody.addFormDataPart(key,file.getName(),MultipartBody.create(MediaType.parse("multipart/form-data"),file)); } } RequestBody requestBody = multiparbody.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); Call call = getOKHttpCilent().newCall(request); call.enqueue(callback); } public void downFile(Callback callback){ Request request = new Request.Builder() .url("http://g.hiphotos.baidu.com/image/pic/item/908fa0ec08fa513d08b6a0ab376d55fbb2fbd9a3.jpg") .get() .build(); getOKHttpCilent().newBuilder().build().newCall(request).enqueue(callback); } }
/** * 裁剪图片方法实现 * */ protected void startPhotoZoom(Uri uri) { if (uri == null) { Log.e("tag", "The uri is not exist."); } Log.e("tag", uri.toString()+""); 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("outputFormat", "JPEG");// 图片格式 intent.putExtra("noFaceDetection", false);// 取消人脸识别 intent.putExtra("return-data", true); //不截图时,intent加参数piuExtru加这行代码,直接获取bitmap对象 startActivityForResult(intent, 102); }bitmap转为String方法:
public String savePhoto(Bitmap photoBitmap, String path, String photoName) { String localPath = null; if (android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(path, photoName + ".jpg"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { // 转换完成 localPath = photoFile.getPath(); fileOutputStream.flush(); } } } catch (FileNotFoundException e) { photoFile.delete(); localPath = null; e.printStackTrace(); } catch (IOException e) { photoFile.delete(); localPath = null; e.printStackTrace(); } finally { try { if (fileOutputStream != null) { fileOutputStream.close(); fileOutputStream = null; } } catch (IOException e) { e.printStackTrace(); } } } return localPath; }
在这里加个下载,在上边的OKHttpUtil中有个方法是下载图片,下载方法中的call的回调方法中加入如下代码:
@Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String fileName = "/11111.jpg"; String sdcardPath = Environment.getExternalStorageDirectory().getPath(); final File file = new File(sdcardPath + fileName); InputStream inputStream = response.body().byteStream(); FileOutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[2048]; int len = 0; while ((len = inputStream.read(buffer)) != -1){ outputStream.write(buffer,0,len); } outputStream.flush(); outputStream.close(); inputStream.close(); handler.post(new Runnable() { @Override public void run() { presenter.success(file.getPath()); } }); } }