对于这个功能的大致构想如下:
在menu菜单中加入拍照按钮 --> 调用手机自带的相机app --> 将拍好的照片保存在SD卡中某一特定目录 --> 向BrowserActivity返回这个照片的路径 --> 调用UploadTask函数上传
这个功能在实现时需要注意的是:
1.在用户点击按钮时要记录当前的资料库、路径,为最后的上传工作做准备
2.因为安卓阵营的机型繁多复杂,并且各个厂商的订制系统又不一样,所以直接调用硬件容易出问题,而调用手机自带的相机app则会减少很多问题
3.写完代码时要加上使用相机的权限问题。而且在启动app时要判断是否有SD卡,手机是否有相机,若没有的话可将此功能关闭。(在Seadroid中开机会检查SD Card的状态,若是没有或是配置不正确则会throw RuntimeException,所以在此就不需要单独判断了)
4.关于onActivityResult(int requestCode, int resultCode, Intent data) 中data返回null的问题:当照片存储路径为默认图片库(即没有Intent.putExtra(MediaStore.EXTRA_OUTPUT, photo)这句话时),data有返回值,返回的是拍得照片的缩略图;当存储路径改为自定义的路径时,data返回为null,需要我们自定义一个Uri来记录照片。
核心代码:
private void CameraTakePhoto() {
Intent imageCaptureIntent = new Intent("android.media.action.IMAGE_CAPTURE");
String strImgDirPath = DataManager.getExternalRootDirectory() + "/myPhotos/";
String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";
strImgPath = strImgDirPath + fileName;
File ImgDir = new File(strImgDirPath);
if (!ImgDir.exists()) {
ImgDir.mkdirs();
}
File Img = new File(strImgDirPath, fileName);
while (Img.exists()) {
fileName = fileName + "(1)";
strImgPath = strImgDirPath + fileName;
}
Uri photo = Uri.fromFile(Img);
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photo);
setResult(RESULT_OK, imageCaptureIntent);
startActivityForResult(imageCaptureIntent, TAKE_PHOTO_REQUEST);
}
还要给BrowserActivity中返回result,所以要在onActivityResult中加入如下代码:
case TAKE_PHOTO_REQUEST:
if (resultCode == RESULT_OK) {
showToast(getString(R.string.take_photo_successfully));
if (!Utils.isNetworkOn()) {
showToast("Network is not connected");
return;
}
if(strImgPath == null) {
showToast("Unable to upload, no path available");
Log.i(DEBUG_TAG, "Pick file request did not return a path");
return;
}
showToast(getString(R.string.added_to_upload_tasks));
addUploadTask(navContext.getRepoID(),
navContext.getRepoName(), navContext.getDirPath(), strImgPath);
}