实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
package sun.geoffery.uploadpic; import java.io.DataOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.provider.MediaStore.MediaColumns; import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; /** * All rights Reserved, Designed By GeofferySun * * @Title: UploadActivity.java * @Package sun.geoffery.uploadpic * @Description:上传图片页面 * @author: GeofferySun * @date: 2015年1月15日 上午1:05:01 * @version V1.0 */ public class UploadActivity extends Activity implements OnClickListener { private Context mContext; private Button backBtn; private Button funBtn; private TextView titleTxt; private ImageView picImg; private SelectPicPopupWindow menuWindow; // 自定义的头像编辑弹出框 private Uri photoUri; /** 使用照相机拍照获取图片 */ public static final int SELECT_PIC_BY_TACK_PHOTO = 1; /** 使用相册中的图片 */ public static final int SELECT_PIC_BY_PICK_PHOTO = 2; /** 获取到的图片路径 */ private String picPath = ""; private static ProgressDialog pd; private String resultStr = ""; // 服务端返回结果集 private String imgUrl = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.activity_upload); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.layout_titlebar); mContext = UploadActivity.this; initViews(); } /** * 初始化页面控件 */ private void initViews() { backBtn = (Button) findViewById(R.id.backBtn); funBtn = (Button) findViewById(R.id.funBtn); titleTxt = (TextView) findViewById(R.id.titleTxt); picImg = (ImageView) findViewById(R.id.picImg); backBtn.setText("返回"); funBtn.setText("发布"); titleTxt.setText("散发谣言"); backBtn.setOnClickListener(this); funBtn.setOnClickListener(this); picImg.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.backBtn:// 返回 case R.id.funBtn:// 发布【没有处理】 finish(); break; case R.id.picImg:// 添加图片点击事件 // 从页面底部弹出一个窗体,选择拍照还是从相册选择已有图片 menuWindow = new SelectPicPopupWindow(mContext, itemsOnClick); menuWindow.showAtLocation(findViewById(R.id.uploadLayout), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); break; default: break; } } //为弹出窗口实现监听类 private OnClickListener itemsOnClick = new OnClickListener() { @Override public void onClick(View v) { // 隐藏弹出窗口 menuWindow.dismiss(); switch (v.getId()) { case R.id.takePhotoBtn:// 拍照 takePhoto(); break; case R.id.pickPhotoBtn:// 相册选择图片 pickPhoto(); break; case R.id.cancelBtn:// 取消 break; default: break; } } }; /** * 拍照获取图片 */ private void takePhoto() { // 执行拍照前,应该先判断SD卡是否存在 String SDState = Environment.getExternalStorageState(); if (SDState.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); /*** * 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的 * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图 * 如果不使用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰 */ ContentValues values = new ContentValues(); photoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO); } else { Toast.makeText(this, "内存卡不存在", Toast.LENGTH_LONG).show(); } } /*** * 从相册中取图片 */ private void pickPhoto() { Intent intent = new Intent(); // 如果要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, SELECT_PIC_BY_PICK_PHOTO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 点击取消按钮 if(resultCode == RESULT_CANCELED){ return; } // 可以使用同一个方法,这里分开写为了防止以后扩展不同的需求 switch (requestCode) { case SELECT_PIC_BY_PICK_PHOTO:// 如果是直接从相册获取 doPhoto(requestCode, data); break; case SELECT_PIC_BY_TACK_PHOTO:// 如果是调用相机拍照时 doPhoto(requestCode, data); break; } super.onActivityResult(requestCode, resultCode, data); } /** * 选择图片后,获取图片的路径 * * @param requestCode * @param data */ private void doPhoto(int requestCode, Intent data) { // 从相册取图片,有些手机有异常情况,请注意 if (requestCode == SELECT_PIC_BY_PICK_PHOTO) { if (data == null) { Toast.makeText(this, "选择图片文件出错", Toast.LENGTH_LONG).show(); return; } photoUri = data.getData(); if (photoUri == null) { Toast.makeText(this, "选择图片文件出错", Toast.LENGTH_LONG).show(); return; } } String[] pojo = { MediaColumns.DATA }; // The method managedQuery() from the type Activity is deprecated //Cursor cursor = managedQuery(photoUri, pojo, null, null, null); Cursor cursor = mContext.getContentResolver().query(photoUri, pojo, null, null, null); if (cursor != null) { int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]); cursor.moveToFirst(); picPath = cursor.getString(columnIndex); // 4.0以上的版本会自动关闭 (4.0--14;; 4.0.3--15) if (Integer.parseInt(Build.VERSION.SDK) < 14) { cursor.close(); } } // 如果图片符合要求将其上传到服务器 if (picPath != null && ( picPath.endsWith(".png") || picPath.endsWith(".PNG") || picPath.endsWith(".jpg") || picPath.endsWith(".JPG"))) { BitmapFactory.Options option = new BitmapFactory.Options(); // 压缩图片:表示缩略图大小为原始图片大小的几分之一,1为原图 option.inSampleSize = 1; // 根据图片的SDCard路径读出Bitmap Bitmap bm = BitmapFactory.decodeFile(picPath, option); // 显示在图片控件上 picImg.setImageBitmap(bm); pd = ProgressDialog.show(mContext, null, "正在上传图片,请稍候..."); new Thread(uploadImageRunnable).start(); } else { Toast.makeText(this, "选择图片文件不正确", Toast.LENGTH_LONG).show(); } } /** * 使用HttpUrlConnection模拟post表单进行文件 * 上传平时很少使用,比较麻烦 * 原理是: 分析文件上传的数据格式,然后根据格式构造相应的发送给服务器的字符串。 */ Runnable uploadImageRunnable = new Runnable() { @Override public void run() { if(TextUtils.isEmpty(imgUrl)){ Toast.makeText(mContext, "还没有设置上传服务器的路径!", Toast.LENGTH_SHORT).show(); return; } Map<String, String> textParams = new HashMap<String, String>(); Map<String, File> fileparams = new HashMap<String, File>(); try { // 创建一个URL对象 URL url = new URL(imgUrl); textParams = new HashMap<String, String>(); fileparams = new HashMap<String, File>(); // 要上传的图片文件 File file = new File(picPath); fileparams.put("image", file); // 利用HttpURLConnection对象从网络中获取网页数据 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置连接超时(记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作) conn.setConnectTimeout(5000); // 设置允许输出(发送POST请求必须设置允许输出) conn.setDoOutput(true); // 设置使用POST的方式发送 conn.setRequestMethod("POST"); // 设置不使用缓存(容易出现问题) conn.setUseCaches(false); // 在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头 conn.setRequestProperty("ser-Agent", "Fiddler"); // 设置contentType conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" NetUtil.BOUNDARY); OutputStream os = conn.getOutputStream(); DataOutputStream ds = new DataOutputStream(os); NetUtil.writeStringParams(textParams, ds); NetUtil.writeFileParams(fileparams, ds); NetUtil.paramsEnd(ds); // 对文件流操作完,要记得及时关闭 os.close(); // 服务器返回的响应吗 int code = conn.getResponseCode(); // 从Internet获取网页,发送请求,将网页以流的形式读回来 // 对响应码进行判断 if (code == 200) {// 返回的响应码200,是成功 // 得到网络返回的输入流 InputStream is = conn.getInputStream(); resultStr = NetUtil.readString(is); } else { Toast.makeText(mContext, "请求URL失败!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } handler.sendEmptyMessage(0);// 执行耗时的方法之后发送消给handler } }; Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case 0: pd.dismiss(); try { JSONObject jsonObject = new JSONObject(resultStr); // 服务端以字符串“1”作为操作成功标记 if (jsonObject.optString("status").equals("1")) { // 用于拼接发布说说时用到的图片路径 // 服务端返回的JsonObject对象中提取到图片的网络URL路径 String imageUrl = jsonObject.optString("imageUrl"); // 获取缓存中的图片路径 Toast.makeText(mContext, imageUrl, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, jsonObject.optString("statusMessage"), Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } break; default: break; } return false; } }); }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论