github源碼地址:https://github.com/15565201312/UploadPicturesDemo.git
https://github.com/15565201312/UploadPicturesDemo.git
https://github.com/15565201312/UploadPicturesDemo.git
https://github.com/15565201312/UploadPicturesDemo.git
1.首先調用使用隱式Intent 獲取本機相機
Intent it = new Intent();
it.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
file = new File(Environment.getExternalStorageDirectory().getPath(), "h"+(++a)+".png");
imageUri = Uri.fromFile(file);
// 以鍵值對的形式告訴系統照片保存的地址,鍵的名稱不能隨便寫
it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// 使用該API,it所對應的Activity銷燬時會回調MainActivity的onActivityResult方法
// 第二個參數就是一個請求碼,當有多個startActivityForResult方法的時候,就在onActivityResult用請求碼判斷是哪個Activity返回的數據
startActivityForResult(it, TAKE_PHOTO);
public class MainActivity extends AppCompatActivity {
private final int IMAGE_REQUEST_CODE = 0;
private final int RESIZE_REQUEST_CODE=3;
private ImageView img;
private LinearLayout linear;
private PopupWindow window;
private Uri imageUri;
private final int CUT_PHOTO=2;
private final int TAKE_PHOTO=1;
private File file;
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
private int a=1;
private final OkHttpClient client = new OkHttpClient();
private List<String> mImgUrls=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_popu, null);
TextView pai = view1.findViewById(R.id.text_pai);
TextView xiang = view1.findViewById(R.id.text_xiang);
TextView no= view1.findViewById(R.id.text_no);
pai.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 啓動系統提供的拍照Activity
Intent it = new Intent();
it.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
file = new File(Environment.getExternalStorageDirectory().getPath(), "h"+(++a)+".png");
imageUri = Uri.fromFile(file);
// 以鍵值對的形式告訴系統照片保存的地址,鍵的名稱不能隨便寫
it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// 使用該API,it所對應的Activity銷燬時會回調MainActivity的onActivityResult方法
// 第二個參數就是一個請求碼,當有多個startActivityForResult方法的時候,就在onActivityResult用請求碼判斷是哪個Activity返回的數據
startActivityForResult(it, TAKE_PHOTO);
window.dismiss();
}
});
xiang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// 打開手機相冊,設置請求碼
startActivityForResult(intent, IMAGE_REQUEST_CODE);
}
});
no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
window.dismiss();
}
});
window = new PopupWindow(view1, GridLayout.LayoutParams.MATCH_PARENT, GridLayout.LayoutParams.WRAP_CONTENT);
window.setBackgroundDrawable(new BitmapDrawable());
window.setFocusable(true);
window.setAnimationStyle(R.style.mymiao);
window.showAtLocation(linear, Gravity.BOTTOM,0,0);
}
});
}
private void initView() {
img = (ImageView) findViewById(R.id.img);
linear = (LinearLayout) findViewById(R.id.linear);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//在相冊裏面選擇好相片之後調回到現在的這個activity中
switch (requestCode) {
case IMAGE_REQUEST_CODE:
resizeImage(data.getData());
Glide.with(this)
.load(data.getData())
.bitmapTransform(new CropCircleTransformation(this))
.into(img);
//使用工具類拿到本機相冊
String realPathFromUri = RealPathFromUriUtils.getRealPathFromUri(this, data.getData());
System.out.println("------------1>"+realPathFromUri);
mImgUrls.add(realPathFromUri);
uploadImg();
window.dismiss();
break;
case TAKE_PHOTO:
// 如果發現拍照成功,則會再次構建出一個Intent對象,並把它的action指定爲
// com.android.camera.action.CROP。
// 這個Intent是用於對拍出的照片進行裁剪的,因爲攝像頭拍出的照片都比較大,
// 而我們可能只 希望截取其中的一小部分。
// 然後給這個Intent設置一些必要的屬性,並再次調用startActivityForResult()來啓動裁剪程序。
// 裁剪完成後的照片同時會輸出到h1.jpg中。
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CUT_PHOTO);// 啓動裁剪程序
break;
case CUT_PHOTO:
// 發送通知,通知媒體數據庫更新URL,否則圖庫無法顯示圖片
Intent it = new Intent();
it.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
it.setData(imageUri);
sendBroadcast(it);
// 裁剪完程序後,將圖片顯示在屏幕上
Bitmap bitmap = BitmapFactory.decodeFile(file.getPath());
img.setImageBitmap(bitmap);
//拍照的圖片上傳
mImgUrls.add(file.getPath());
uploadImg();
/* Glide.with(this)
.load(bitmap)
.bitmapTransform(new CropCircleTransformation(this))
.into(img);*/
break;
}
}
//這裏增加裁剪
public void resizeImage(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//裁剪的大小
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
//設置返回碼
startActivityForResult(intent, RESIZE_REQUEST_CODE);
}
private void uploadImg() {
// mImgUrls爲存放圖片的url集合
// mImgUrls.add(Environment.getExternalStorageDirectory().getAbsolutePath()+"/a.png");
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for (int i = 0; i < mImgUrls.size(); i++) {
File f = new File(mImgUrls.get(i));
if (f != null) {
builder.addFormDataPart("img", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
}
}
//添加其它信息
// builder.addFormDataPart("time",takePicTime);
// builder.addFormDataPart("mapX", SharedInfoUtils.getLongitude());
// builder.addFormDataPart("mapY",SharedInfoUtils.getLatitude());
// builder.addFormDataPart("name",SharedInfoUtils.getUserName());
MultipartBody requestBody = builder.build();
//構建請求
Request request = new Request.Builder()
.url("http://192.168.0.107:8080/UploadDemo4/UploadFile")//地址
.post(requestBody)//添加請求體
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("上傳失敗:e.getLocalizedMessage() = " + e.getLocalizedMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println("上傳照片成功:response = " + response.body().string());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "上傳成功