Android 测试上传头像到服务器

现在很多的app中都有用户注册登录以及头像修改的功能, 下面就我碰到的上传头像到服务器中做个简单的介绍。

既然要上传头像, 那么Android中图片的来源有两种方式 :通过文件管理器、通过拍照

1:文件管理器(图库)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");// 选择图片类型
// 在onActivityResult中处理选择结果
startActivityForResult(intent, PICTURE_REQUEST_CODE);

2:拍照

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 请求拍照的Action
// 在onActivityResult中处理拍照结果
startActivityForResult(intent, CAMERA_REQUEST_CODE);

通过Intent来请求图片资源, 那么请求到的图片资源怎么去获取呢?此时就可以通过Activity中的 onActivityResult方法来对图片进行处理

protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK && data != null)
		{
			Uri uri = data.getData();
			Bitmap bitmap = null;
			if (null != uri)
			{
				String imgPath = null;
				ContentResolver resolver = this.getContentResolver();
				String[] columns = { MediaStore.Images.Media.DATA };
				Cursor cursor = null;
				cursor = resolver.query(uri, columns, null, null, null);
				if (Build.VERSION.SDK_INT > 18)// 4.4以后文件选择发生变化,判断处理
				{
					// http://blog.csdn.net/tempersitu/article/details/20557383
					if (requestCode == PICTURE_REQUEST_CODE)// 选择图片
					{
						imgPath = uri.getPath();
						if (!TextUtils.isEmpty(imgPath)
							&& imgPath.contains(":"))
						{
							String imgIndex = imgPath.split(":")[1];
							cursor = resolver.query(
								MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
								columns, "_id=?", new String[] { imgIndex },
								null);
						}
					}
				}
				if (null != cursor && cursor.moveToFirst())
				{
					int columnIndex = cursor.getColumnIndex(columns[0]);
					imgPath = cursor.getString(columnIndex);
					cursor.close();
				}
				if (!TextUtils.isEmpty(imgPath))
				{
					bitmap = genBitmap(imgPath);
				}
			}
			else if (requestCode == CAMERA_REQUEST_CODE)// 拍照
			{
				// 拍照时,注意小米手机不会保存图片到本地,只可以从intent中取出bitmap, 要特殊处理
				Object object = data.getExtras().get("data");
				if (null != object && object instanceof Bitmap)
				{
					bitmap = (Bitmap) object;
				}
			}
			if (null != bitmap)
			{
				upload(bitmap);
			}
		}
	}
对选择的图片进行处理后再上传

/**上传图片到服务器*/
	private void upload(final Bitmap bitmap)
	{

		new AsyncTask<Bitmap, Void, String>()
		{
			ProgressDialog progressDialog;

			protected void onPreExecute()
			{
				progressDialog = new ProgressDialog(MainActivity.this);
				progressDialog.setCanceledOnTouchOutside(false);
				progressDialog.setMessage("正在和服务器通信中……");
				progressDialog.show();
			};

			@Override
			protected String doInBackground(Bitmap... params)
			{
				try
				{
					//此处没有判断是否有sd卡
					File dirFile = new File("/mnt/sdcard/android/cache");
					if(!dirFile.exists())
					{
						dirFile.mkdirs();
					}
					File file = new File(dirFile, "photo.png");
					if (params[0].compress(CompressFormat.PNG, 50,
						new FileOutputStream(file)))
					{
						System.out.println("保存图片成功");
						HttpClient client = new DefaultHttpClient();

						HttpPost httpPost = new HttpPost(UPLOAD_URL);
						MultipartEntity entity = new MultipartEntity();
						// 通过RSA加密后的用户名
						String miUserName = "GuKDdJVZXBpjrX3JmumCDkgIzjlGcEfpy9ty+Gpwt5fNDopuM1KqNMTmMy0eflplRoJFj8A0tw4e66ib+wfPB7YXxSk836s+yk7MvrmF289u5o2nBzb+roEGZhEjlmCGheXgC4EBWcHqR2Sp+lVzQLE/yELJE9uXG1YKQuYqvpY=";
						entity.addPart("acc", new StringBody(miUserName));
						entity.addPart("ext", new StringBody("png"));
						entity.addPart("img", new FileBody(file));
						httpPost.setEntity(entity);
						HttpResponse response = client.execute(httpPost);
						if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
						{
							InputStream in = response.getEntity().getContent();
							byte[] buffer = new byte[1024];
							int len = 0;
							StringBuffer stringBuffer = new StringBuffer();
							while ((len = in.read(buffer)) != -1)
							{
								stringBuffer.append(new String(buffer, 0, len,
									"utf-8"));
							}
							System.out.println("stringBuffer = "
								+ stringBuffer.toString().trim());
							file.delete();//删除文件
							return stringBuffer.toString().trim();
						}
					}
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				return null;
			}

			protected void onPostExecute(String result)
			{
				progressDialog.dismiss();
				if (!TextUtils.isEmpty(result))
				{
					try
					{
						JSONObject jsonObject = new JSONObject(result);
						if (null != jsonObject
							&& "1".equals(jsonObject.opt("result")))
						{// 上传成功
							mIvImageView.setImageBitmap(bitmap);
							Toast.makeText(MainActivity.this, "上传成功",
								Toast.LENGTH_SHORT).show();
						}
					}
					catch (JSONException e)
					{
						e.printStackTrace();
					}
				}
				else
				{
					Toast.makeText(MainActivity.this, "上传失败",
						Toast.LENGTH_SHORT).show();
				}
			};
		}.execute(bitmap);
	}

	/**通过给定的图片路径生成对应的bitmap*/
	private Bitmap genBitmap(String imgPath)
	{
		BitmapFactory.Options options = new Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(imgPath, options);
		int imageWidth = options.outWidth;
		int imageHeight = options.outHeight;

		int widthSample = (int) (imageWidth / mWH);
		int heightSample = (int) (imageHeight / mWH);
		// 计算缩放比例
		options.inSampleSize = widthSample < heightSample ? heightSample
			: widthSample;
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(imgPath, options);
	}
最后注意要在AndroidManifest.xml中加入相应的权限

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

上面代码中用的一些变量

	private static final String UPLOAD_URL = "http://comments.roboo.com/photoUpload";
	private static final int CAMERA_REQUEST_CODE = 222;
	private static final int PICTURE_REQUEST_CODE = 444;
	/**上传图片的宽度和高度*/
	private int mWH = 90;// 单位dp
	private ImageView mIvImageView;
	private Button mBtnCamera;
	private Button mBtnPicture;

下载地址:http://download.csdn.net/detail/u012612952/8298037



 


你可能感兴趣的:(android,上传头像)