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="@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一个上传图片的样例,包含怎样终止上传过程,假设在上传的时候更新进度条(一)的更多相关文章
- JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例
什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...
- 使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...
- android AsyncTask异步下载并更新进度条
AsyncTask异步下载并更新进度条 //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...
- socket编程——一个简单的样例
从一个简单的使用TCP样例開始socket编程,其基本过程例如以下: server client ++ ...
- 第一个Angular2的样例
欢迎跟我一起学习Angular2 本文根据angular2官网手动敲码得来: 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 - 开发环境搭建 - 配 ...
- Yii学习笔记之二(使用gii生成一个简单的样例)
1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` ( `po ...
- Android UI(四)云通讯录项目之云端更新进度条实现
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...
- 创建android画笔程序的样例(有镜面效果)
先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, appr ...
- android发送短信样例
Android应用开发中我们经常须要发送手机短信.这对于android平台来说,是最简单只是的功能了,无需太多代码,也无需自己定义代码,仅仅须要调用android提供的消息管理类SmsManager就 ...
随机推荐
- Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
- ofstream 使用的一点主意事项
有如下代码段: ofstream ofs; while(...) { ofs.close(); ofs.open(...) ofs << "内容"; ... } ofs ...
- UML看书笔记1:主体思想
对象设计需要解决的三大问题: 1.把“现实世界”映射到“对象世界” 2.从“对象世界”描述“现实世界” 3.验证“对象世界”是否反映了“现实世界” 现实世界与我们的对象世 ...
- dedecms的安装以及为他配置虚拟主机
一.概念: 1.CMS是:Content Manage System 内容管理系统 内容包括:商品,文章,软件,视频 2.当前市面上常用的CMS有哪些? DedeCMS: 织梦 中小型公司 ...
- 重操JS旧业第十一弹:BOM对象
BOM对象即浏览器内置对象,现今流行的浏览器内核有Safri,Firefox,Chrome,Opera,IE其中IE的兼容性是最蛋疼的在10及其过后还好点,但是现在IE基本上淘汰,而国内像360这种垃 ...
- 用QT打开网页
原地址:http://blog.csdn.net/fjb2080/article/details/8136084 1.用qlabel. QLabellabel->setText(tr(" ...
- android文件下载大小和网络不一致(偏大)
今天在写一个文件下载的程序,在网上搜索了一个抄,用来下载MP3文件. 但是发现下载的MP3文件比原来的文件要大,而且MP3中会有杂音. 在Log中加入日志后发现: 从 网络流中获取的流长度为3000 ...
- hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)
Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...
- Hadoop--序列化
序列化: 对象的序列化用于将一个对象编码成字节流,以及从字节流中重新构建对象. 将一个对象编码成一个字节流称为序列化该对象. 序列化三种主要的用途: 1.作为一种持久化格式. 2.作为一种通信的数据格 ...
- POJ 2773 Happy 2006 数学题
题目地址:http://poj.org/problem?id=2773 因为k可能大于m,利用gcd(m+k,m)=gcd(k,m)=gcd(m,k)的性质,最后可以转化为计算在[1,m]范围内的个数 ...