标签:
初学安卓四个月不到的我,可能入门也算不上。边学边摸索,慢慢地能在百度上找到正确的能用的代码了,这应该就是我学这么久得到的进步了。
今天花了一天的时间,实现了上传头像和更改头像的功能。大部分的代码都是copy过来的,大概能看懂,知道怎么用,仅此!
好的,忙了一天,做个自我总结~
在这里先总结上传头像功能的实现:
思路:
创建一个activity,简单的关联一个有imageView和button的布局。当点击imageView的时候,弹出一个dialog,该dialog可以调用系统的拍照、相册,这样就可以实现选择要上传的图片了,然后再调用系统裁剪,图片裁剪好将图片显示在imageView中;当点击button的时候,就执行上传的功能。
(哦,需要说明的是,这里用了xUtils来处理http请求,从而实现上传。所以需要xUtils架包,因为要请求网络和访问手机sd卡,所以也不要忘了加对应的权限。对了,这里还实现了将裁剪好的图片保存在手机sd卡的功能。)
代码部分:
一、客户端
//①onCreate部分
private ImageView img;
private Button btnUpload;
private HttpUtils httpUtils;
private String URL="http://10.50.8.33:8080/Person_proj/servlet/UploadServlet";//服务器路径
private String[] items = { "拍照", "相册" };
private String title = "选择照片";
private static final int PHOTO_CARMERA = 1;
private static final int PHOTO_PICK = 2;
private static final int PHOTO_CUT = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.main_img);
btnUpload = (Button) findViewById(R.id.upload);//上传图片的按钮
btnUpload.setOnClickListener(clickListener);
img.setOnClickListener(clickListener);
httpUtils=new HttpUtils(10000);// 创建并实例化HttpUtils类
}
//②点击事件的监听
private OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_img://imageView监听
AlertDialog.Builder dialog = AndroidUtil.getListDialogBuilder(//这里调用了 AndroidUtil的静态方法,所以需要再写一个类(加在后面)
MainActivity.this, items, title, dialogListener);//弹出dialog,其中items、title可以自定义,这里将其定义成全局变量;
//dialogListener是对该dialog的监听(监听选择照片的方式:拍照、相册)
dialog.show();
break;
case R.id.upload://上传图片按钮监听
upload();//调用上传方法
break;
default:
break;
}
}
};
//③上传方法(上传到服务器)
protected void upload() {
RequestParams params=new RequestParams();
params.addBodyParameter(tempFile.getPath().replace("/", ""), tempFile);//这里的tempFile的创建以当前系统时间为名称,防止重复
//防止重复的目的:使得每个用户都获取到自己上传的头像
System.out.println(tempFile);
httpUtils.send(HttpMethod.POST,URL, params,new RequestCallBack<String>() {
@Override
public void onFailure(HttpException e, String msg) {
Toast.makeText(MainActivity.this, "上传失败,检查一下服务器地址是否正确", Toast.LENGTH_SHORT).show();
Log.i("MainActivity", e.getExceptionCode() + "====="
+ msg);
}
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
Toast.makeText(MainActivity.this, "上传成功,马上去服务器看看吧!", Toast.LENGTH_SHORT).show();
Log.i("MainActivity", "====upload_error====="
+ responseInfo.result);
}
});
}
//④tempFile的创建(该方法我是放在onCreate方法前面,放在后面应该也没有关系)
// 创建一个以当前系统时间为名称的文件,防止重复
private File tempFile = new File(Environment.getExternalStorageDirectory(),
getPhotoFileName());
// 使用系统当前日期加以调整作为照片的名称
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("‘PNG‘_yyyyMMdd_HHmmss");
picname=sdf.format(date) + ".png";
return sdf.format(date) + ".png";
}
//⑤dialog的监听(这里调用的方法有好几个)
private android.content.DialogInterface.OnClickListener dialogListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {//case的变量值,定义成了全局变量
case 0://数组items的下标值,这里的当然是拍照
// 调用拍照
startCamera(dialog);
break;
case 1:
// 调用相册
startPick(dialog);
break;
default:
break;
}
}
};
// 调用系统相机
protected void startCamera(DialogInterface dialog) {
dialog.dismiss();
// 调用系统的拍照功能
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("camerasensortype", 2); // 调用前置摄像头
intent.putExtra("autofocus", true); // 自动对焦
intent.putExtra("fullScreen", false); // 全屏
intent.putExtra("showActionIcons", false);
// 指定调用相机拍照后照片的存储路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
startActivityForResult(intent, PHOTO_CARMERA);
}
// 调用系统相册
protected void startPick(DialogInterface dialog) {
dialog.dismiss();
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, PHOTO_PICK);
}
//重写返回结果码方法:选好图片之后再回到界面,对应显示选好的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {//这里的case变量值,定义为全局变量
case PHOTO_CARMERA://拍照方式
startPhotoZoom(Uri.fromFile(tempFile), 300);//调用裁剪方法
break;
case PHOTO_PICK://相册方式
if (null != data) {
startPhotoZoom(data.getData(), 300);//调用裁剪方法
}
break;
case PHOTO_CUT://图片裁剪成功
if (null != data) {
setPicToView(data);//将图片显示在ImageView上
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
// 调用系统裁剪
private void startPhotoZoom(Uri uri, int size) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以裁剪
intent.putExtra("crop", true);
// aspectX,aspectY是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY是裁剪图片的宽高
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
// 设置是否返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTO_CUT);
}
// 将裁剪后的图片显示在ImageView上
private void setPicToView(Intent data) {
Bundle bundle = data.getExtras();
if (null != bundle) {
final Bitmap bmp = bundle.getParcelable("data");
img.setImageBitmap(bmp);
saveCropPic(bmp);//调用保存在sdcard方法(也可以不保存,或者保存在手机本地)
Log.i("MainActivity", tempFile.getAbsolutePath());
}
}
// 把裁剪后的图片保存到sdcard上
private void saveCropPic(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileOutputStream fis = null;
bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
try {
fis = new FileOutputStream(tempFile);
fis.write(baos.toByteArray());
fis.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != baos) {
baos.close();
}
if (null != fis) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// AndroidUtil类
public class AndroidUtil {
// 返回一个列表对话框
public static AlertDialog.Builder getListDialogBuilder(Context context,
String[] items, String title, OnClickListener clickListener) {
return new AlertDialog.Builder(context).setTitle(title).setItems(items, clickListener);
}
}
二、服务器端(UploadServlet)
public class AndroidUploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
SmartUpload smartUpload = new SmartUpload();
String msg=request.getParameter("msg");
out.print(msg);
try {
smartUpload.initialize(this.getServletConfig(), request, response);
smartUpload.upload();
com.jspsmart.upload.File smartFile = smartUpload.getFiles().getFile(0);
if (!smartFile.isMissing()) {
String saveFileName = "images/" + smartFile.getFileName(); //图片保存在webroot目录下的images文件夹下
smartFile.saveAs(saveFileName, smartUpload.SAVE_VIRTUAL);
System.out.println("ok:" + saveFileName+ ", msg:" + smartUpload.getRequest().getParameter("msg"));
} else {
out.print("missing...");
}
} catch (Exception e) {
System.out.println(e+","+msg);
}
out.flush();
out.close();
}
}
我人生中第一篇博客,到此结束~耶耶~~改天总结从服务器获取图片显示在客户端。
标签:
原文地址:http://www.cnblogs.com/f-l-j-123/p/4941121.html