首页 > 代码库 > android一个上传图片的例子,包括如何终止上传过程,如果在上传的时候更新进度条(一)

android一个上传图片的例子,包括如何终止上传过程,如果在上传的时候更新进度条(一)

先上效果图:



Layout为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@drawable/black"
  android:orientation="vertical">
  
  <RelativeLayout
  	  xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1"
      android:isScrollContainer="true">
  	  <ImageView
  		android:layout_width="fill_parent"
  		android:layout_height="fill_parent"
  		android:scaleType="centerInside"
  		android:id="@+id/photo_upload_preview_image"
  		android:layout_centerInParent="true">
  	  </ImageView>
  	  
  	  <!-- photo_upload_progress_item的位置跟photo_upload_preview_image是一样的,为了显示photo_upload_preview_image还在loading
  	   -->
  	  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:paddingTop="10dp"
		android:paddingBottom="10dp"
		android:orientation="horizontal"
		android:id="@+id/photo_upload_progress_item"
		android:layout_centerInParent="true"
		android:visibility="gone">
		<ProgressBar 
	  	  android:layout_width="wrap_content" 
	  	  android:layout_height="wrap_content" 
      	  android:layout_marginRight="4dp"
      	  android:layout_gravity="center_vertical"
      	  android:visibility="visible"
      	  style="?android:attr/progressBarStyleSmall"
      	  android:indeterminateDrawable="@drawable/progress_bar_drawable">
		</ProgressBar>
    	<TextView
      	  android:layout_width="wrap_content"
      	  android:layout_height="wrap_content"
      	  android:layout_gravity="center_vertical"
      	  android:gravity="center"
      	  android:textColor="@drawable/white"
      	  android:text="正在载入照片...">
    	</TextView>
  	  </LinearLayout>
  </RelativeLayout>
  
  <!-- photo_upload_progress_layout在photo_upload_preview_image的正底下,带有进度条,显示photo_upload_preview_image的上传进度
   -->
  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:id="@+id/photo_upload_progress_layout"
  	android:orientation="vertical"
  	android:background="@drawable/black"
  	android:visibility="gone">
  	<LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
  	  android:layout_width="fill_parent"
      android:layout_height="10dp"
      android:background="@drawable/upload_photo_progress_bg"
      android:layout_marginTop="6dp"
      android:layout_marginBottom="6dp"
      android:layout_marginLeft="6dp"
      android:layout_marginRight="6dp"
      android:layout_gravity="center_horizontal"
      android:paddingLeft="0dp"
      android:paddingRight="0dp"
      android:id="@+id/photo_upload_progress_bar_container">
      <View
        android:layout_width="3dp"
        android:layout_height="fill_parent"
        android:id="@+id/photo_upload_progress_bar"
        android:background="@drawable/upload_photo_progress_bar">
      </View>
	</LinearLayout>
	<TextView
	  android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginBottom="6dp"
      android:layout_gravity="center_horizontal"
      android:text="照片上传中..."
      android:textColor="@drawable/white">
	</TextView>
  </LinearLayout>
  
  
  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:id="@+id/photo_upload_bottom_bar"
  	android:orientation="vertical"
  	android:background="#BFBFBF"
  	android:paddingLeft="10dp"
  	android:paddingRight="10dp"
  	android:paddingBottom="4dp"
  	android:paddingTop="2dp">
	
  	<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
  		android:layout_height="wrap_content"
  		android:id="@+id/photo_upload_album_layout"
  		android:paddingTop="5dp"
  		android:background="#BFBFBF">
  		<TextView
  			xmlns:android="http://schemas.android.com/apk/res/android"
    		android:layout_width="wrap_content"
  			android:layout_height="wrap_content"
  			android:layout_marginLeft="5dp"
  			android:text="上传至"
  			android:textSize="16dp"
  			android:singleLine="true"
  			android:textColor="@drawable/gray2"
  			android:gravity="center_vertical"
  			android:id="@+id/photo_upload_ablum_prompt">
  		</TextView>
  		<TextView
  			xmlns:android="http://schemas.android.com/apk/res/android"
    		android:layout_width="wrap_content"
  			android:layout_height="wrap_content"
  			android:layout_toRightOf="@id/photo_upload_ablum_prompt"
  			android:layout_marginLeft="5dp"
  			android:text="手机相册"
  			android:textSize="16dp"
  			android:singleLine="true"
  			android:gravity="center_vertical"
  			android:textColor="@drawable/black"
  			android:id="@+id/photo_upload_ablum_name">
  		</TextView>
  		<!-- 在右侧,可以选择专辑
  		 -->
  		<Button
  			android:id="@+id/photo_upload_choose_album"
	        android:layout_width="wrap_content"
	        android:layout_height="40dp"
	        android:layout_alignParentRight="true"
	        android:text="专辑"
	        android:textColor="@drawable/black"
	        android:paddingRight="30dp"
	        android:background="@drawable/location_button">
  		</Button>
  	</RelativeLayout>
  	
  	<!-- 这个在photo_upload_album_layout的下面为位置增加模块
  	 -->
  	<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/photo_upload_location_layout"
     android:layout_below="@id/photo_upload_album_layout"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content">
     <RelativeLayout
	     xmlns:android="http://schemas.android.com/apk/res/android"
	     android:id="@+id/photo_upload_location_right_layout"
	     android:layout_width="wrap_content"
	     android:layout_height="wrap_content"
	     android:layout_alignParentRight="true"
	     android:background="#BFBFBF"
	     android:paddingTop="5dp"
	     android:paddingBottom="5dp">
	     <Button
	        android:id="@+id/photo_upload_add_gps"
	        android:layout_width="wrap_content"
	        android:layout_height="40dp"
	        android:text="位置"
	        android:textColor="@drawable/black"
	        android:paddingRight="30dp"
	        android:background="@drawable/location_button">
	     </Button>
	  </RelativeLayout>
  	<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/photo_upload_location_left_layout"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginRight="5dp"
     android:layout_alignParentLeft="true"
     android:layout_toLeftOf="@id/photo_upload_location_right_layout">
     <ImageView
     	android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="10dp"
        android:id="@+id/photo_upload_location_icon"
        android:src=http://www.mamicode.com/"@drawable/location">
这里我们是把本地SD根目录下的一张图片,转成Bitmap,再存到要上传的tmp文件夹里面:

private class LoadPhotoTask extends AsyncTask<Void, Void, Boolean>{
		private Bitmap mLoadedBitmap = null;
		
    	protected Boolean doInBackground(Void... params) {
    		try {
				if(mFilePathName.length() > 0){
					File file = new File(mFilePathName);
					if (!file.exists()) {
						return false;
					}
					BitmapFactory.Options opt = new BitmapFactory.Options();
					long fileSize = file.length();
					int maxSize = 2*1024 * 1024;
					if(fileSize <= maxSize){
						opt.inSampleSize = 1;
					}else if(fileSize <= maxSize * 4){ <strong>//小于8M</strong>
						opt.inSampleSize = 2;
					}else{
						long times = fileSize / maxSize;
						opt.inSampleSize = (int)(Math.log(times) / Math.log(2.0)) + 1; <strong>//Math.log返回以e为底的对数</strong>
					}
					try{
						mLoadedBitmap = BitmapFactory.decodeFile(mFilePathName,opt);<strong>//opt为缩小的倍数</strong>
						mUploadFilePathName = SaveBitmapToFile(mLoadedBitmap);
					}catch(OutOfMemoryError e){
						Toast.makeText(UploadPhotoActivity.this, 
								   getResources().getString(R.string.no_memory_to_view_photo), 
								   Toast.LENGTH_SHORT).show();
						UploadPhotoActivity.this.finish();
						
					}
				}
				return true;
			} catch (Exception e) {
				Log.e("UploadPhotoActivity", "doInBackground", e);
				return false;
			}
    	}  
    	
    	
    	protected void onPostExecute(Boolean result){
    		try {
				showLoadPreviewProgressBar(false);
				if(mLoadedBitmap != null){
					ImageView IamgePreView = (ImageView)findViewById(R.id.photo_upload_preview_image);
					IamgePreView.setImageBitmap(mLoadedBitmap);
				}else{
					
				}
				mLoadedBitmap = null;
			} catch (Exception e) {
				Log.e("UploadPhotoActivity", "onPostExecute", e);
			}
    	}
    }

private String SaveBitmapToFile(Bitmap bmp){
		if (null == bmp) {
			return null;
		}
		String fileName = "upload_tmp.jpg";
		<strong>File f = this.getFileStreamPath(fileName);</strong>//data/data/com.example.tianqitongtest/files/upload_tmp.jpg,这个是要上传的文件存的位置
		if (f.exists()) {
			f.delete();
		}
		FileOutputStream ostream;
		try {
			<strong>int targetWidth = 780;
			int w = bmp.getWidth();
			if (w > targetWidth) {
				int h = bmp.getHeight();
				int targetHeight = (targetWidth * h) / w;
				bmp = Bitmap.createScaledBitmap(bmp, targetWidth, targetHeight,
						true);//根据指定宽度和高度来生成一个新的Bitmap
			}</strong>
			ostream = this.openFileOutput(fileName, MODE_PRIVATE);
			bmp.compress(Bitmap.CompressFormat.JPEG, 70, ostream);
			ostream.flush();
			ostream.close();
			ostream = null;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return f.getAbsolutePath();
	}

上传的时候需要把键盘收起:

private void hideInputMethod(){
		View view = getCurrentFocus();
		if(view != null){
		    ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}
	

得到SD卡上的11.jpg的图片路径:

private String getStoredPicPath() {
		String fileName = "11.jpg";
		return Environment.getExternalStorageDirectory()+"/"+fileName;
	}