//开启系统图库
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
//开相机
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), System.currentTimeMillis() + ".jpg");
path = file.getAbsolutePath();
Uri path = Uri.fromFile(file);
intent2.putExtra(MediaStore.EXTRA_OUTPUT, path);
//intent选择器
Intent chooser = Intent.createChooser(intent1, "选择头像");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2});
startActivityForResult(chooser, 100);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == 101) {
String filePath = "";
if (data != null) {
//图库选图
//对于部分手机来说,在安卓原生的拍照程序基础上做了修改
//导致拍照的照片会随着arg2返回到这里
Uri uri = data.getData();
if (uri != null) {
if (!uri.getPath().equals(imageUri.getPath())) {
//图库
Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
cursor.moveToNext();
filePath = cursor.getString(0);
cursor.close();
} else {
//拍照
//拍照的路径依然是cameraPath
filePath = cameraPath;
}
} else {
Bundle bundle = data.getExtras();
//bitmap是拍照回来的照片
Bitmap bitmap = (Bitmap) bundle.get("data");
//TODO 将bitmap存储到SD卡
}
} else {
//相机拍照
filePath = cameraPath;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
调用系统的摄像头进行拍照:
第一步:声明个imageUri,以便拍照时返回用
第二步:
//创建file对象,用于存储拍照后的图片
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
//android 7.0后的特性,直接使用fromFile不安全,所以用getUriForFile
imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.fileprovider", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
//启动拍照相机程序
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
第三部:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
第四部:
因为用到了FileProvider,所以需要在manifest中注册
同时也要为了兼顾旧版本,需要加权限。
第五部:创建xml文件夹,并创建file_path文件
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
} else {
openAlbum();
}
private void openAlbum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 100) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum();
} else {
Log.i("TAG", "onRequestPermissionsResult: " + "error");
}
}
}
然后在OnActivityResult里面
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
handlerImageOnKitKat(data);
} else {
handlerImageBeforeKitKat(data);
}
}
break;
private void handlerImageOnKitKat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(this, uri)) {
//如果是document类型的uri
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
//content类型
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
//file类型
imagePath = uri.getPath();
}
displayImage(imagePath);
}
private void handlerImageBeforeKitKat(Intent data) {
String path = getImagePath(data.getData(), null);
displayImage(path);
}
private void displayImage(String path) {
if (path != null) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
imageView.setImageBitmap(bitmap);
}
}
private String getImagePath(Uri data, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(data, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}