android端(上代码):
package org.txlian.rightbut;
import java.io.ByteArrayOutputStream;
import java.io.File;
import org.txlian.myapp.R;
import org.txlian.userinfo.Base64Coder;
import org.txlian.webutil.WebUtil;
import android.R.anim;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
public class AddTalkDialog extends Activity {
//private MyDialog dialog;
private LinearLayout layout;
private EditText inwhere = null;
private EditText dowhat = null;
private EditText status = null;
private ImageView photo = null;
private Button add = null;
private String tp = null;
private WebUtil webUtil = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.addtalk_dialog);
//dialog=new MyDialog(this);
layout=(LinearLayout)findViewById(R.id.addtalk_main_dialog_layout);
layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
}
});
inwhere=(EditText)findViewById(R.id.addtalk_inwhere);
status=(EditText)findViewById(R.id.addtalk_status);
dowhat=(EditText)findViewById(R.id.addtalk_dowhat);
photo=(ImageView)findViewById(R.id.addtalk_photo);
photo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ShowPickDialog();
}
});
add=(Button)findViewById(R.id.addtalk_btn_ok);
this.add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
webUtil = new WebUtil();
int stau = webUtil.addPoster(AddTalkDialog.this.inwhere
.getText().toString(), AddTalkDialog.this.dowhat
.getText().toString(), AddTalkDialog.this.status
.getText().toString(), tp);//发起http请求发送图片参数*注意一点很重要的事情:tp这个参数需要URLEncoder.encode(tp, "utf-8");要不包含了特殊字符会出错;
AddTalkDialog.this.finish();
}
} );
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
this.exitDialog() ;
}
return false ;
}
private void exitDialog(){
new AlertDialog.Builder(this)
.setTitle("是否要取消发布?")
.setNegativeButton("是", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
AddTalkDialog.this.finish();
}
})
.setPositiveButton("否", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
}).show();
}
@Override
public boolean onTouchEvent(MotionEvent event){
this.exitDialog();
return false;
}
/**
* 选择提示对话框
*/
private void ShowPickDialog() {
new AlertDialog.Builder(this)
.setTitle("选择...")
.setNegativeButton("相册", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, 1);
}
})
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
//下面这句指定调用相机拍照后的照片存储的路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
"xiaoma.jpg")));
startActivityForResult(intent, 2);
}
}).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// 如果是直接从相册获取
case 1:
if(data!=null){
startPhotoZoom(data.getData());
}
break;
// 如果是调用相机拍照时
case 2:
File temp = new File(Environment.getExternalStorageDirectory()
+ "/xiaoma.jpg");
startPhotoZoom(Uri.fromFile(temp));
break;
// 取得裁剪后的图片
case 3:
/**
* 非空判断大家一定要验证
*
*/
if(data != null){
setPicToView(data);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 裁剪图片方法实现
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
/**
* 保存图片数据
* @param picdata
*/
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(photo);
/**
* 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上
* 传到服务器
*/
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
byte[] b = stream.toByteArray();
// 将图片流以字符串形式存储下来
tp = new String(Base64Coder.encodeLines(b));
/*这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了,
服务器处理的方法是服务器那边的事了
如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换
为我们可以用的图片类型就OK啦.
Bitmap dBitmap = BitmapFactory.decodeFile(tp);
Drawable drawable = new BitmapDrawable(dBitmap);
*/
AddTalkDialog.this.photo.setImageDrawable(drawable);//show image on page
}
}
}
服务器端(上代码):
public void addImg() {
User user = (User) ServletActionContext.getContext().getSession()
.get("LOGIN");
if (talkImg != null && talkImg.length() > 0&&!talkImg.equals("null")) {
String imgname = (new Date()).toString().replace(" ", "")
.replace(":", "");
androidUploadImg(talkImg, "/txlian/talkimg/" + imgname + ".jpg",
400);//服务器对图片裁剪方法
talk.setImgSrc("/txlian/talkimg/" + imgname + ".jpg");
}else{
talk.setImgSrc("");
}
if (talk.getInwhere().length() > 0 && talk.getDowhat().length() > 0
&& talk.getContent().length() > 0) {
talkService.addTalk(user, talk);
sendJsonMsg(1, "发布成功!");
} else {
sendJsonMsg(0, "发布失败!");
}
}
以上借鉴了小马同志的资源,铁磁感谢;