系列博客Android实战:方便大家快速集成到自己的项目中去
项目源码地址
http://download.csdn.net/detail/sinat_35615296/9886923
(1)效果演示
(2)主要流程
- 写了个BaseActivity内部封装了,6.0动态权限的获取
- 底部的弹窗使用github三方库ActionSheet实现(https://github.com/baoyongzhang/android-ActionSheet)
- 打开相机拍摄后传入一个图片地址,方便我们以后取出这个图片文件
- 打开相册后选取图片后,我们会把获取到的url转换成图片的地址
- 最后,根据图片的路径,使用BitmapUtils工具类压缩一下图片显示到UI上
演示核心代码
public class MainActivity extends BaseActivity implements View.OnClickListener {
/**
* UI
*/
private ImageView imageView;
private Button changePhotoBtn;
/**
* DATA
*/
// 拍照回调
private static final int PHOTO_REQUEST_CAREMA = 1;
// 相册回调
private static final int PHOTO_REQUEST_GALLERY = 2;
//保存拍摄相片的文件路径
private static String PHOTO_FILE_DICTIONARY;
//保存拍摄相片的名字
private static final String PHOTO_FILE_NAME = "photo.png";
//保存拍摄相片的File
private File tempFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
changePhotoBtn = ((Button) findViewById(R.id.changeAvator));
changePhotoBtn.setOnClickListener(this);
imageView = ((ImageView) findViewById(R.id.image));
}
/**
* 1 拍摄或者相册
*/
@Override
public void onClick(View v) {
setTheme(R.style.ActionSheetStyleiOS7);
ActionSheet.createBuilder(this,getSupportFragmentManager())
.setOtherButtonTitles("拍摄","从手机相册中选择")
.setCancelButtonTitle("取消")
.setCancelableOnTouchOutside(true)
.setListener(new ActionSheet.ActionSheetListener() {
@Override
public void onDismiss(ActionSheet actionSheet, boolean isCancel) {
}
@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {
if (index == 0){
startCamera();
}else {
startGalary();
}
}
})
.show();
}
/**
* 2-1 相册选取
*/
private void startGalary() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}
/**
* 2-2 相机上传
*/
private void startCamera() {
//保存相机拍摄图片的临时文件
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
//相片父路径
PHOTO_FILE_DICTIONARY = this.getExternalFilesDir(null).getAbsolutePath();
tempFile = new File(PHOTO_FILE_DICTIONARY, PHOTO_FILE_NAME);
tempFile.delete();
if (!tempFile.exists()) {
try {
tempFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplication(), "照片创建失败!", Toast.LENGTH_LONG).show();
return;
}
}
//打开相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//传入需要保存
Uri uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
} else {
Toast.makeText(getApplication(), "sdcard无效或没有插入!", Toast.LENGTH_SHORT).show();
}
}
/**
* 3 拍摄上传/相册选取的回调 得到相机/相册的图片路径
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/**
* 相机拍摄回调
*/
if (requestCode == PHOTO_REQUEST_CAREMA && resultCode == RESULT_OK) {
Toast.makeText(getApplication(), "相机拍摄回调!", Toast.LENGTH_SHORT).show();
//此方法获取到的是拍摄的原图,比较大
if (tempFile != null && tempFile.exists()) {
displayBitmap(tempFile.getAbsolutePath());
}
}
/**
* 相册选取回调
*/
if (requestCode == PHOTO_REQUEST_GALLERY && resultCode == RESULT_OK && data != null) {
Toast.makeText(getApplication(), "相册选取回调!", Toast.LENGTH_SHORT).show();
/**
* 方式0 通过Uri获取到图片文件的地址
*/
Uri uri = data.getData();
if (uri != null) {
String filePathFromUri = getFilePathFromUri(MainActivity.this, uri);
displayBitmap(filePathFromUri);
}
}
}
/**
* 4 根据回调路径,压缩图片仿OOM,最后展示图片
*/
private void displayBitmap(String imgPath) {
Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(imgPath, 480, 800);
imageView.setImageBitmap(bitmap);
}
/**
* 把图片的Uri转换成图片路径
*/
public static String getFilePathFromUri(final Context context, final Uri uri) {
if (null == uri) return null;
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
}