android拍照选择图片上传服务器自定义控件
做android项目的时候总免不了遇到图片上传功能,虽然就是调用android系统的拍照和相册选择功能,但是总面部了把一大推代码写在activity里,看上去一大推代码头都昏了。不如把这些功能都集成一个控件,以后遇到图片上传功能也不用那么麻烦了。好啦,下面开始上效果图。
</pre><pre name="code" class="java" style="font-size: 11.8181819915771px;">
</pre><pre name="code" class="java" style="font-size: 11.8181819915771px;">
效果图就是这样了,我们看效果图可以分析出大致的功能就是:一个Imageview里默认有一张图片,我们在选择了图片以后右上角有个删除的Imageview,点击以后可以删除选择的图片,那实际上就是一个FrameLayout嘛,好,下面开始贴代码。基本看代码都能看懂了,需要注意的是做了一下图片压缩的处理。因为不做压缩的话一个图片拍下来都是几兆大小,上传完全不可行。
</pre><pre name="code" class="java" style="font-size: 11.8181819915771px;">自定义控件代码
</pre><pre name="code" class="java">
public class ImagePicker extends FrameLayout implements View.OnClickListener {
private SelectType selectType; //选择的类型照相和选择
private Context context;
private ImageView imageView;
private ImageView deleteImageView;
private int imageViewWidth;
private int imageViewHeight;
private boolean hasImage;
private String imagePath;
private File file;
private LinearLayout dialogView;
private AlertDialog dialog;
private int scaleWidth=240;
private int scaleHeight=240;
public void setScale(int width,int height){
this.scaleWidth=width;
this.scaleHeight=height;
}
public ImagePicker(Context context) {
super(context);
this.context=context;
}
public ImagePicker(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
}
public ImagePicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context=context;
}
public boolean hasImage(){
return this.hasImage;
}
public String getImagePath(){
return this.imagePath;
}
public void setImagePath(String path){
File file=new File(path);
if(!file.exists()){
clearImagePicker();
return;
}
Bitmap bitmap=ImageUtils.getInstance().decodeSampledBitmap(file,imageViewWidth,imageViewHeight);
if(bitmap==null){
clearImagePicker();
return;
}
int degree = ImageUtils.getInstance().readPicDegree(path);
if(degree>0){
bitmap=ImageUtils.getInstance().rotateBitmap(degree,bitmap);
}
imageView.setImageBitmap(bitmap);
imagePath=path;
hasImage=true;
deleteImageView.setVisibility(View.VISIBLE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK&&
requestCode == getId()) {
if(selectType==null){
selectType=SelectType.CAMERA;
}
switch (selectType){
case CAMERA:
onCameraResult(data);
break;
case PHOTO:
onPhotoResult(data);
break;
}
}
}
private void onPhotoResult(Intent data){
Uri originalUri = data.getData();
Cursor cursor = ((Activity)context).managedQuery(originalUri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
try {
File tmpFile=compressImage(path);
setImagePath(tmpFile.getPath());
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context,"压缩图片失败",Toast.LENGTH_SHORT).show();
clearImagePicker();
return;
}
}
private void onCameraResult(Intent data){
try {
File tmpFile=compressImage(file.getPath());
setImagePath(tmpFile.getPath());
file.delete();
file=tmpFile;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context,"压缩图片失败",Toast.LENGTH_SHORT).show();
clearImagePicker();
return;
}
}
private File compressImage(String path) throws IOException {
//图片翻转角度
int degree=ImageUtils.getInstance().readPicDegree(path);
//缩放
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path,newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
int be = 1;
if (w > h && w > scaleWidth) {
be = newOpts.outWidth / scaleWidth;
} else if (w < h && h > scaleHeight) {
be = newOpts.outHeight / scaleHeight;
}
if (be <= 0){
be = 1;
}
newOpts.inSampleSize = be;
Bitmap bitmap = BitmapFactory.decodeFile(path, newOpts);
if(degree>0){
bitmap=ImageUtils.getInstance().rotateBitmap(degree,bitmap);
}
//压缩
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
options -= 10;
baos.reset();
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
}
//保存
String name = new DateFormat().format("yyyyMMddhhmmss", Calendar.getInstance()) + ".jpg";
File file = new File(SDCardUtils.getImageDir(context),name);
FileOutputStream b = new FileOutputStream(file);
baos.writeTo(b);
baos.close();
b.close();
return file;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
imageView=(ImageView)this.findViewById(R.id.ImagePicker_ImageView);
deleteImageView=(ImageView)this.findViewById(R.id.ImagePicker_ImageDelete);
imageView.setOnClickListener(this);
deleteImageView.setOnClickListener(this);
deleteImageView.setVisibility(View.GONE);
dialogView=(LinearLayout)LayoutInflater.from(this.context).inflate(R.layout.image_picker_dialog_layout,null);
dialogView.findViewById(R.id.ImagePicker_PhotoBtn).setOnClickListener(this);
dialogView.findViewById(R.id.ImagePicker_CameraBtn).setOnClickListener(this);
dialogView.findViewById(R.id.ImagePicker_CancelBtn).setOnClickListener(this);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
imageViewWidth=imageView.getWidth();;
imageViewHeight=imageView.getHeight();;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.ImagePicker_ImageView:
showImagePickerDialog();
break;
case R.id.ImagePicker_ImageDelete:
clearImagePicker();
break;
case R.id.ImagePicker_CameraBtn:
showCameraApp();
break;
case R.id.ImagePicker_PhotoBtn:
showPhotoApp();
break;
case R.id.ImagePicker_CancelBtn:
closeDialog();
break;
}
}
private void closeDialog(){
dialog.dismiss();
dialog=null;
}
private void showImagePickerDialog(){
ViewGroup parent=(ViewGroup)dialogView.getParent();
if(parent!=null){
parent.removeView(dialogView);
}
dialog= new AlertDialog.Builder(context).setTitle("图片选择")
.setView(dialogView).create();
dialog.show();
}
private void showPhotoApp(){
selectType=SelectType.PHOTO;
Intent photoIntent= new Intent(Intent.ACTION_GET_CONTENT);
photoIntent.setType("image/*");
((Activity)context).startActivityForResult(photoIntent, getId());
closeDialog();
}
private void showCameraApp(){
if(!SDCardUtils.hasSDCard()){
Toast.makeText(context,"请插入sd卡",Toast.LENGTH_SHORT).show();
return;
}
String name = new DateFormat().format("yyyyMMddhhmmss", Calendar.getInstance()) + ".jpg";
file = new File(SDCardUtils.getImageDir(context),name);
selectType=SelectType.CAMERA;
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
((Activity)context).startActivityForResult(cameraIntent, getId());
closeDialog();
}
public void clearImagePicker(){
hasImage=false;
imagePath=null;
imageView.setImageResource(R.drawable.image_picker_add);
deleteImageView.setVisibility(View.GONE);
}
enum SelectType{
PHOTO,CAMERA
}
}
</pre><p></p><p>我们的控件布局是这样的。</p><p></p><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<com.example.imageUpload.widget.ImagePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip"
android:id="@+id/ImagePicker_ImageView"
android:layout_gravity="center"
android:src="@drawable/image_picker_add"
android:scaleType="fitXY"/>
<ImageView
android:layout_width="20dip"
android:layout_height="20dip"
android:id="@+id/ImagePicker_ImageDelete"
android:src="@drawable/image_picker_delete"
android:layout_gravity="right|top" />
</com.example.imageUpload.widget.ImagePicker>
下面开始使用吧!在activity的xml文件里面include一下就可以了,布局代码我就不贴了,来看activity里面。我们需要重写一下onActivityResult,
上传文件我们无非就是用到 //imagePicker1.getImagePath();得到图片的路径
//imagePicker1.hasImage();是否有图片。
public class MyActivity extends Activity {
private ImagePicker imagePicker1;
private ImagePicker imagePicker2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imagePicker1 = (ImagePicker)findViewById(R.id.imagePicker1);
imagePicker2 = (ImagePicker)findViewById(R.id.imagePicker2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
imagePicker1.onActivityResult(requestCode, resultCode, data);
imagePicker2.onActivityResult(requestCode,resultCode,data);
//imagePicker1.getImagePath();
//imagePicker1.hasImage();
}
}
android拍照选择图片上传服务器自定义控件的更多相关文章
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- HTML5 Plus 拍照或者相册选择图片上传
HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传,利用HTML5 Plus的Camera.Gallery.IO.Storage和Uploader来实现手机APP拍照或者从相册 ...
- H5拍照、选择图片上传组件核心
背景 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-render).遂进行了调研,发现很多的工具.但有的太大,有的使用麻烦,有的不满足使用需求.决 ...
- [转]微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
本文转自:http://blog.csdn.net/qq_31383345/article/details/53014610 今天遇到微信小程序的用户头像设置功能,做笔记. 先上gif: 再上代码: ...
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
1.index.wxml <!--index.wxml--> <button style="margin:30rpx;" bindtap="choose ...
- MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件
场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...
- php图片上传服务器
原理是把图片上传到服务器的某个目录,然后在把他的名字存入数据库,或者不需要数据库这部分也行.读取的时候直接读取名字. HTML提交表格 <form method="post" ...
- ios中摄像头/相册获取图片压缩图片上传服务器方法总结
本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下. 这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...
- IOS 视频.图片上传服务器
//上传视频 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer. ...
随机推荐
- [原创]与来自facebook的朋友交流
与来自facebook的朋友交流 老板的儿子在facebook工作,现在正好有个假期回来,老总让我们部门与之进行一次交流.其实主要是他讲一下那边情况,然后我们准备些问题,多扩展一下我们见识. 流程 交 ...
- Knockout 新版应用开发教程之"visible"绑定
"visible" 绑定 用途 DOM元素的显示或者隐藏是根据绑定的值来的,前提是将visible绑定给该元素 例子 <div data-bind="visible ...
- [python实用代码片段]python获取当前时间的前一天,前一周,前一个月
python获取当前时间的前一天,前一周,前一个月. 实用python的datetime.timedelta方法,避免了有的月份是30和31等不同的情况. 获取前一个月的时间,方法实现:首先datet ...
- Android 学习笔记 Service
PS:前几篇的内容光是上代码了,也没有细细的讲解..感觉这样写很不好..因此还是多一些讲解吧... 学习内容: 1.了解Service... 2.Service的启动与停止.. 3.绑定与取消绑定Se ...
- 流行的ios开源项目
本文介绍一些流行的iOS的开源项目库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- CSS 最核心的四个概念
本文将讲述 CSS 中最核心的几个概念,包括:盒模型.position.float等.这些是 CSS 的基础,也是最常用的几个属性,它们之间看似独立却又相辅相成.为了掌握它们,有必要写出来探讨一下,如 ...
- (二)Protobuf的C#使用
[转]http://blog.csdn.net/shantsc/article/details/50729402 protobuf c#版本分成两个版本,一个是protobuf-net,另一个是pr ...
- PowerShell 从网站上下载文件
在cmd下 执行powershell,可能会出现禁止运行的策略, 运行如下命令: powershell set-executionpolicy remotesigned 然后运行: powershel ...
- js验证电话号码的正则表达式
在做程序时遇到js验证电话号码的问题,使用正则表达式来操作很简单的.一起来看一下吧. 1,这种是比较简单的验证号码: 电话号码只能包含”(“.“)”.“-”和数字 <input type=t ...
- jquery实现表格内容筛选
对于表格来说,当数据比较多的时候,我们无法一页一页的查找,这时可以通过一个搜索框来实现搜索. 对于这个搜素框,我们为了更好的体验可以利用keyup事件实现在用户输入的时候就开始筛选,而不是填完以后点击 ...