做设置头像时有这么一种需求,当点击一个按钮时,需要让用户选择是拍照获取照片,还是在图库中选择获取照片。
要满足上述需求,有两种解决方案,一种是创建一个选择dialog,这个会比较保险,可以自己定义dialog的样式,也可以很好的控制dialog里面的内容。但是会比较麻烦一点。具体代码如下。
/**
* 显示修改头像的对话框
*/
private void getPhoto() {
final String[] arrayOptions = new String[] { "拍照", "从相册中选择" };
AlertDialog dialog = new AlertDialog.Builder(PersonInfoActivity.this)
.setItems(arrayOptions, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
// 当选中了拍照item时
case 0:
// 拍摄照片
takePhoto();
break;
// 当选中了从相册中选则item时
case 1:
// 从相册中选择照片
selectPhoto();
break;
}
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
dialog.show();
}
代码很简单,我就不详细说明了,真有不懂的给我留言吧。
接着就是第二种方法,这种方法快捷方便,但是不好控制外观,和选择的数量。
第二中方法需要用到intent的两个函数。
Intent.createChooser()函数和chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
new Intent[] { takePhotoIntent });函数。
具体代码如下
public void onPickBoth(View v) {
Intent pickIntent = new Intent(Intent.ACTION_GET_CONTENT);
pickIntent.setType("image/*");
Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooserIntent = Intent.createChooser(pickIntent,
getString(R.string.activity_main_pick_both));
//将拍照intent设置为额外初始化intent
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
new Intent[] { takePhotoIntent });
startActivityForResult(chooserIntent, PICK_OR_TAKE_PICTURE);
}
和发起单个intent的一样,先创建好要发起的intent,这里面有takePhotoIntent,和pickIntent。两个,当然你可以有三个四个五个。
然后使用createChooser方法创建一个intent。createChooser里的第一个参数是默认要发起的Intent,第二个参数是弹出的选择对话框的标题。
接着使用putExtra,添加额外要发起的Intent,第一个参数是固定的,第二个参数是要额外发起的intent的新的实例。
这时候再startActivityForResult(chooserIntent, PICK_OR_TAKE_PICTURE);发起这个intent的,系统就会让你自己选择想要启动哪一个intent的。