首先第一步是权限(没有涉及到高级系统权限)
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
接下来是布局文件的设置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <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" /> </LinearLayout>
activity代码
public class MainActivity extends AppCompatActivity implements View.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 mBtnTakePhoto; /** * 从相册选择 */ private Button mBtnChooseAlumb; private ImageView mImgLogo; private Intent intent; private File imgRoot; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // 说明外置存储可用,已经被挂载 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(); } } } private void initView() { mBtnTakePhoto = (Button) findViewById(R.id.btn_take_photo); mBtnTakePhoto.setOnClickListener(this); mBtnChooseAlumb = (Button) findViewById(R.id.btn_choose_alumb); mBtnChooseAlumb.setOnClickListener(this); mImgLogo = (ImageView) findViewById(R.id.img_logo); } @Override public void onClick(View v) { switch (v.getId()) { default: break; 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; } } @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"); mImgLogo.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; } }