package com.example.cameraphoto5k;
import java.io.File;
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private static final int FLAG_CAMERA_REQUEST = 100;
private static final int FLAG_ALUMB_REQUEST = 101;
private static final int FLAG_CROP_REQUEST = 102;
private Button btnTake;
private Button btnChoose;
private ImageView imgLogo;
private Intent intent;
private File imgRoot;
private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 说明外置存储可用,已经被挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// SD卡根目录
File rootSD = Environment.getExternalStorageDirectory();
imgRoot = new File(rootSD.getAbsolutePath() + File.separator + "imgs");
if (!imgRoot.exists()) {
imgRoot.mkdirs();
}
}
btnTake = (Button) findViewById(R.id.btn_take_photo);
btnChoose = (Button) findViewById(R.id.btn_choose_alumb);
imgLogo = (ImageView) findViewById(R.id.img_logo);
btnTake.setOnClickListener(this);
btnChoose.setOnClickListener(this);
//
// 隐式Intent,我们不用去指定要跳转到的Activity,只需要指定一个Action,就可以跳转到相应的页面
// 这个页面一般是系统给我们指定好的页面
// Intent intent = new Intent(Intent.ACTION_PICK);
// // 设置类型 image/jpeg image/png image/gif,*是通配符
// intent.setType("image/*");
// startActivity(intent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_take_photo:
// /storage/0/emulate/imgs/3243242323.jpg
File f = new File(imgRoot, new Date().getTime() + ".jpg");
uri = Uri.fromFile(f);
// 系统相机的隐式Intent是MediaStore.ACTION_IMAGE_CAPTURE)
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Uri
// 拍照输出的路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, FLAG_CAMERA_REQUEST);
break;
case R.id.btn_choose_alumb:
intent = new Intent(Intent.ACTION_PICK);
// 设置类型 image/jpeg image/png image/gif,*是通配符
intent.setType("image/*");
startActivityForResult(intent, FLAG_ALUMB_REQUEST);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 从系统相机返回的值
if (requestCode == FLAG_CAMERA_REQUEST) {
// imgLogo.setImageURI(uri);
intent = crop(uri);
startActivityForResult(intent, FLAG_CROP_REQUEST);
} else if (requestCode == FLAG_ALUMB_REQUEST) {
// 从相册中返回的值
uri = data.getData();
// imgLogo.setImageURI(uri);
intent = crop(uri);
startActivityForResult(intent, FLAG_CROP_REQUEST);
} else if (requestCode == FLAG_CROP_REQUEST) {
// 从返回值中直接获取bitmap
Bitmap bmp = (Bitmap) data.getExtras().get("data");
imgLogo.setImageBitmap(bmp);
}
}
/**
* 裁剪
* @param uri
* @return
*/
private Intent crop(Uri uri) {
// 隐式Intent,调用系统的裁剪
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", 300); // 裁剪的宽度
intent.putExtra("outputY", 300); // 裁剪的高度
// 可省略
intent.putExtra("scale", true); // 支持缩放
// 裁剪之后保存的路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse(uri.getPath() + ".bak")); // 将裁剪的结果输出到指定的Uri
// 必须加,否则返回值中找不到返回的值
intent.putExtra("return-data", true); // 若为true则表示返回数据
// 可以省略
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 裁剪成的图片的格式
// intent.putExtra("noFaceDetection", true); //启用人脸识别
return intent;
}
}
///
1.apI接口声明
@Multipart
@POST("file/upload")
Call<Bean> upLoad(@Query("uid") String uid, @Part MultipartBody.Part part);
2.代码构造 MultipartBody.Part
LoginApi loignApi = RetrofitManager.getDefault().create(LoginApi.class);
//RequestBody封装了文件和文件的类型
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
// MultipartBody.Part封装了接受的key和文件名字和RequestBody
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
Call<Bean> login = loignApi.upLoad("71", part);
3.本地图片资源转换成File
public File getFile() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
String defaultPath = getApplicationContext().getFilesDir()
.getAbsolutePath() + "/defaultGoodInfo";
File file = new File(defaultPath);
if (!file.exists()) {
file.mkdirs();
}
String defaultImgPath = defaultPath + "/messageImg.jpg";
file = new File(defaultImgPath);
try {
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 20, fOut);
fOut.flush();
fOut.close();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
<Button
android:id="@+id/btn_take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拍照上传" />
<Button
android:id="@+id/btn_choose_alumb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从相册选择" />
<ImageView
android:id="@+id/img_logo"
android:layout_width="100dp"
android:layout_height="100dp" />