android调用相机拍照和和选取系统图库图片,主要是通过意图intent,使用startActivityForResult方法启动和onActivityResult方法获取回调数据,拿到图片路径。
这是我做的一个小demo,想上效果图:
MainActivity代码:
public class MainActivity extends Activity
{
private ImageView mImageView;
private static final int SELECT_TO_PHOTO_TAG = 0X001;//选图
private static final int TAKE_CAMERA_TAG = 0X002;//拍照
private String photoPath;//图片路径
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化控件
*/
private void initView()
{
mImageView = (ImageView)this.findViewById(R.id.imageView1);
mImageView.setOnClickListener(mListener);//设置点击事件
}
/**
* 点击事件的监听器
*/
private OnClickListener mListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
if(v == mImageView)
{
//T弹出对话框
final CharSequence[] check = {"照片", "相机"};
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("请选择照片").setItems(check, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
switch(which)
{
case 0://选图
selectPhoto();
break;
case 1://拍照
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, TAKE_CAMERA_TAG);
break;
default:
break;
}
}
}).create();
dialog.show();
}
}
};
/**
* 打开图库
* 选取图片
*/
private void selectPhoto()
{
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, SELECT_TO_PHOTO_TAG);
}
/**
* 获取返回来的图片
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == TAKE_CAMERA_TAG)//拍照
{
try
{
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.get("data");
photoPath = BitmapUtils.saveBitmap(System.currentTimeMillis() + ".png", bitmap);
mImageView.setImageBitmap(bitmap);
Toast.makeText(getApplicationContext(), photoPath, Toast.LENGTH_SHORT).show();
}
catch(Exception e)
{
e.printStackTrace();
}
}else if(requestCode == SELECT_TO_PHOTO_TAG)//选取图库的图片
{
ContentResolver cr = MainActivity.this.getContentResolver();
try
{
Uri uri = data.getData();
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = cr.query(uri, projection, null, null, null);
if(cursor != null)
{
cursor.moveToFirst();
int index = cursor.getColumnIndex(projection[0]);
photoPath = cursor.getString(index);
cursor.close();
if(photoPath != null)
{
Toast.makeText(getApplicationContext(), photoPath, Toast.LENGTH_SHORT).show();
Bitmap bitmap = BitmapFactory.decodeFile(photoPath);
mImageView.setImageBitmap(bitmap);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
super.onResume();
}
}
新建一个BitmapUtils工具类,用于保存拍照得到的图片
public classBitmapUtils
{/*** 保存图片
* 返回path
*@paramname
*@parambitmap
*@return
*/
public staticString saveBitmap(String name, Bitmap bitmap)
{
File file= newFile(Environment.getExternalStorageDirectory(), name);if(file.exists())
{
file.delete();
}try{
FileOutputStream outputStream= newFileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,90, outputStream);
outputStream.flush();
outputStream.close();
String path=file.getPath();returnpath;
}catch(Exception e)
{
e.printStackTrace();
}return null;
}
}
最后要在AndroidManifest.xml中添加所需的权限