先上效果图:

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="@drawable/location"
>
</ImageView> <Button
android:id="@+id/photo_upload_remove_location"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="移除"
android:textColor="@drawable/black"
android:background="@drawable/common_button_style"
android:layout_alignParentRight="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
>
</Button>
<TextView
android:id="@+id/photo_upload_location_des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/black"
android:layout_marginTop="10dp"
android:layout_toLeftOf="@id/photo_upload_remove_location"
android:layout_toRightOf="@id/photo_upload_location_icon">
</TextView>
</RelativeLayout> </RelativeLayout>
<!-- 这个editText用户能够输入一些信息,在位置模块的正下方
-->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/photo_upload_title"
android:singleLine="true"
android:maxLength="63"
android:maxLines="3"
android:hint="请输入:"
android:inputType="textMultiLine">
</EditText> <!-- 这两个button在editText的正下方
--> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:background="@drawable/common_button_style"
android:text="上传"
android:id="@+id/photo_upload_button_upload"
android:textColor="@drawable/black"
android:layout_weight="1"
android:textSize="18dp">
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/common_button_style"
android:text="取消"
android:id="@+id/photo_upload_button_cancel"
android:textColor="@drawable/black"
android:layout_weight="1"
android:textSize="18dp">
</Button>
</LinearLayout>
</LinearLayout> </LinearLayout>

这里我们是把本地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;
}

android一个上传图片的样例,包含怎样终止上传过程,假设在上传的时候更新进度条(一)的更多相关文章

  1. JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

  2. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  3. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  4. socket编程——一个简单的样例

    从一个简单的使用TCP样例開始socket编程,其基本过程例如以下: server                                                  client ++ ...

  5. 第一个Angular2的样例

    欢迎跟我一起学习Angular2 本文根据angular2官网手动敲码得来: 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 - 开发环境搭建 - 配 ...

  6. Yii学习笔记之二(使用gii生成一个简单的样例)

    1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` ( `po ...

  7. Android UI(四)云通讯录项目之云端更新进度条实现

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...

  8. 创建android画笔程序的样例(有镜面效果)

    先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, appr ...

  9. android发送短信样例

    Android应用开发中我们经常须要发送手机短信.这对于android平台来说,是最简单只是的功能了,无需太多代码,也无需自己定义代码,仅仅须要调用android提供的消息管理类SmsManager就 ...

随机推荐

  1. 嵌入jetty到Java代码

    在做Demo实例时,使用的jetty版本号为8.x. 为了避免麻烦,将全部的包都导入到MyEclipse的lib文件夹下. 实例1:自己定义handler的服务器 package com.jetty. ...

  2. mysql导入sql文件过大或连接超时的解决的方法

    前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个奇妙sql语句交给实施,仅仅要导入出错就把例如以下语句运行就能够了.至今屡试不爽. set global max_allowed_pa ...

  3. TortoiseSVN 文件关联图标不显示的解决方法

    对于SVN来说,因为每个图标都代表着不同的含义,预示着不同的状态,是指示灯的作用,如果没有正确的图标很可能造成数据的丢失等 之前看了网上其他人写的帖子,,有一些是直接删除注册表下“ShellIconO ...

  4. Ch06 验证

    6.1  服务器端验证 6.1.1  Data Annotations验证 6.1.2  扩展ModelMetadtaProvider 6.2  客户端验证 6.2.1  客户端验证初步 6.2.2  ...

  5. 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件

    查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求.   内容 查找符号 (.pdb) 文件 查找源文件   查找符号 (.pdb) 文件 说明 在之前的 Vis ...

  6. 调整系统的inode数量

    inode节点中,记录了文件的类型.大小.权限.所有者.文件连接的数目.创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针. 一般情况不需要特殊配置,如果存放文件很多,需要配置 ...

  7. HTTP协议和web工作原理

    本章学完之后能干什么? 要把 知识点学好,那就需要把它相关的周边知识点了解全面 HTTP协议是web学习的核心!!! 学东东切忌只学配置,不学原理:只学会框架有什么用,要会自己写框架!! web学习直 ...

  8. 如何编译tizen源码(图文教程)?

    前一篇文章已经介绍了如何下载tizen源码,下面我将继续讲述如何编译源码. 1 下载安装gbs编译工具 tizen源码是用gbs工具进行编译的,因此我们首先得将此工具下载下来,并且设置好. 下面的Ub ...

  9. c#后台弹出提示

    Page.ClientScript.RegisterClientScriptBlock(typeof(string), "", @"<script>alert ...

  10. C# - 重写虚方法

    项目目录: 创建教师类(Teacher),虚方法有Teach(); 创建学生类(Student),重写的方法是Teach(); 教师类: · 加上关键字 Virtual 就是声明可以重写此方法. us ...