@XQF
2017-02-10T20:33:27.000000Z
字数 3383
阅读 1034
《Android探险》
拍照功能,,。原来有两套使用方式。一种是比较简单的intent,使用的是系统的拍照界面和处理。另一种是使用camera的API来进行自定义拍照界面和功能等。
参考博文
关于这次的学习不仅仅是学习到了如何使用Intent实现照相功能。还有存储的一些东西。为什么会涉及到存储?因为我们拍摄的照片是很大的,。,。,放在数据库里不现实。而且我们的拍摄的照片用户希望能供其它程序使用。要是自定义ContentProvider也是比较麻烦的。。。索性我们把文件放到外面的存储中去。于是就要设计到应用程序访问外部存储的知识。我们使用Context类提供的方法很轻松就完成。而且还要申请读取外部存储的权限。
例子的实现就是现在外部存储中自定义个file。拍照之后把结果放在该file中。老实说系统这里处理得轻松,我们只需要使用startActivityForResult()方法发出intent,并把uri放进intent就可以了。至于怎么存储我们不管。
要注意的是,我们要判断系统究竟支不支持拍照功能,。,。。。如何判断尼,那就是使用PackageManager来实现。PackageManager来判断该intent要启动的任务是不是为空。要是为空的话就使得触发拍照按钮不可点击。
好,现在能拍照了,但是有需求说是拍完照我要显示一个缩略图在view里面。。。。。。好吧,接下来就是如何处理图片。事实上我们拍摄的照片本来就放在了onActivityResult()方法中的intent里。所以我们可以从这个intent中取出照片。也可以根据我们指定的路径,直接去该路径下进行解析。
好,图片我也找到了,可以,。,超级大,我的手机屏幕都放不下,接下来就是怎么处理。处理图像还是用位图方便。于是先通过BitmapFactory()获取一个options参数,设置参数的inJustDecodeBounds属性为true。使得我们能获取图片的实际大小。获取到实际大小后再来和我们的目标大小对比进行处理。怎么处理就是根据实际情况和需求来设定了。
option的inSampleSize参数就是设置缩放的比例,2就是使得新bitmap对象变为原来的一半。
后来,。,。注意到后面打开程序的时候
public class UtilPicture {
public static Bitmap getScaleBitMap(String path, int destWidth, int destHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
//吧这个属性设置为true就能获取图片的实际大小
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
float realWidth = options.outWidth;
float realHeight = options.outHeight;
//默认设置
int inSampleSize = 1;
// 要是实际尺寸超出目的尺寸就要进行操作
if (realWidth > destWidth || realHeight > destHeight) {
// 实际的宽比实际的高还要高,这里实现的策略是挑小的计算缩放的标准
if (realWidth > realHeight) {
inSampleSize = Math.round(realHeight / destHeight);
} else {
inSampleSize = Math.round(realWidth / destWidth);
}
}
options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize;
return BitmapFactory.decodeFile(path, options);
}
//很少使用activty实例,但是,。getWindowManager()方法是Activity特有
// 获取windowManager还有另外一种方式,
public static Bitmap getScaleBitMap(String path, Activity activity) {
Point size = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(size);
return getScaleBitMap(path, size.x, size.y);
}
}
public class MyFragment extends Fragment {
private static final int REQUEST_IMAGE = 1;
private File mFile;
private Button mBtn;
private ImageView mImageView;
private String mPhotoName = "IMG_11.jpg";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_frag, container, false);
mBtn = (Button) view.findViewById(R.id.takePhoto);
mImageView = (ImageView) view.findViewById(R.id.imageView);
updateUI();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
PackageManager pm = getActivity().getPackageManager();
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (null == intent.resolveActivity(pm)) {
mBtn.setEnabled(false);
} else {
mFile = getFile();
Uri uri = Uri.fromFile(mFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().startActivityForResult(intent, REQUEST_IMAGE);
}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == getActivity().RESULT_OK) {
switch (requestCode) {
case REQUEST_IMAGE:
updateUI();
break;
}
}
}
private File getFile() {
File file = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//没有这块存储
if (null == file) {
return null;
}
return new File(file, mPhotoName);
}
private void updateUI() {
if (null == mFile) {
mImageView.setImageDrawable(null);
} else {
mImageView.setImageBitmap(UtilPicture.getScaleBitMap(mFile.getPath(), getActivity()));
}
}
}