位置: 编程技术 - 正文
推荐整理分享Android图片上传,可以选择多张图片,缩放预览,拍照上传等(安卓如何实现图片上传功能),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:安卓如何实现图片上传功能,android 图片上传,安卓上传照片,安卓上传照片,安卓如何实现图片上传功能,android多图上传,android图片上传的题,android 图片上传,内容如对您有帮助,希望把文章链接给更多的朋友!
仿照微信,朋友圈分享图片功能 。可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。
微信
微信
微信
微信
下载地址 : 微信上传图片源码
//部分代码如下
[java] view plaincopypackage com.king.photo.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import com.king.photo.R; import com.king.photo.util.Bimp; import com.king.photo.util.FileUtils; import com.king.photo.util.ImageItem; import com.king.photo.util.PublicWay; import com.king.photo.util.Res; //首页面activity public class MainActivity extends Activity { private GridView noScrollgridview; private GridAdapter adapter; private View parentView; private PopupWindow pop = null; private LinearLayout ll_popup; public static Bitmap bimap ; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Res.init(this); bimap = BitmapFactory.decodeResource( getResources(), R.drawable.icon_addpic_unfocused); PublicWay.activityList.add(this); parentView = getLayoutInflater().inflate(R.layout.activity_selectimg, null); setContentView(parentView); Init(); } public void Init() { pop = new PopupWindow(MainActivity.this); View view = getLayoutInflater().inflate(R.layout.item_popupwindows, null); ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup); pop.setWidth(LayoutParams.MATCH_PARENT); pop.setHeight(LayoutParams.WRAP_CONTENT); pop.setBackgroundDrawable(new BitmapDrawable()); pop.setFocusable(true); pop.setOutsideTouchable(true); pop.setContentView(view); RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent); Button bt1 = (Button) view .findViewById(R.id.item_popupwindows_camera); Button bt2 = (Button) view .findViewById(R.id.item_popupwindows_Photo); Button bt3 = (Button) view .findViewById(R.id.item_popupwindows_cancel); parent.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pop.dismiss(); ll_popup.clearAnimation(); } }); bt1.setOnClickListener(new OnClickListener() { public void onClick(View v) { photo(); pop.dismiss(); ll_popup.clearAnimation(); } }); bt2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlbumActivity.class); startActivity(intent); overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out); pop.dismiss(); ll_popup.clearAnimation(); } }); bt3.setOnClickListener(new OnClickListener() { public void onClick(View v) { pop.dismiss(); ll_popup.clearAnimation(); } }); noScrollgridview = (GridView) findViewById(R.id.noScrollgridview); noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT)); adapter = new GridAdapter(this); adapter.update(); noScrollgridview.setAdapter(adapter); noScrollgridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (arg2 == Bimp.tempSelectBitmap.size()) { Log.i("ddddddd", "----------"); ll_popup.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.activity_translate_in)); pop.showAtLocation(parentView, Gravity.BOTTOM, 0, 0); } else { Intent intent = new Intent(MainActivity.this, GalleryActivity.class); intent.putExtra("position", "1"); intent.putExtra("ID", arg2); startActivity(intent); } } }); } @SuppressLint("HandlerLeak") public class GridAdapter extends BaseAdapter { private LayoutInflater inflater; private int selectedPosition = -1; private boolean shape; public boolean isShape() { return shape; } public void setShape(boolean shape) { this.shape = shape; } public GridAdapter(Context context) { inflater = LayoutInflater.from(context); } public void update() { loading(); } public int getCount() { if(Bimp.tempSelectBitmap.size() == 9){ return 9; } return (Bimp.tempSelectBitmap.size() 1); } public Object getItem(int arg0) { return null; } public long getItemId(int arg0) { return 0; } public void setSelectedPosition(int position) { selectedPosition = position; } public int getSelectedPosition() { return selectedPosition; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_published_grida, parent, false); holder = new ViewHolder(); holder.image = (ImageView) convertView .findViewById(R.id.item_grida_image); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position ==Bimp.tempSelectBitmap.size()) { holder.image.setImageBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.icon_addpic_unfocused)); if (position == 9) { holder.image.setVisibility(View.GONE); } } else { holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap()); } return convertView; } public class ViewHolder { public ImageView image; } Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: adapter.notifyDataSetChanged(); break; } super.handleMessage(msg); } }; public void loading() { new Thread(new Runnable() { public void run() { while (true) { if (Bimp.max == Bimp.tempSelectBitmap.size()) { Message message = new Message(); message.what = 1; handler.sendMessage(message); break; } else { Bimp.max = 1; Message message = new Message(); message.what = 1; handler.sendMessage(message); } } } }).start(); } } public String getString(String s) { String path = null; if (s == null) return ""; for (int i = s.length() - 1; i > 0; i) { s.charAt(i); } return path; } protected void onRestart() { adapter.update(); super.onRestart(); } private static final int TAKE_PICTURE = 0x; public void photo() { Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PICTURE: if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) { String fileName = String.valueOf(System.currentTimeMillis()); Bitmap bm = (Bitmap) data.getExtras().get("data"); FileUtils.saveBitmap(bm, fileName); ImageItem takePhoto = new ImageItem(); takePhoto.setBitmap(bm); Bimp.tempSelectBitmap.add(takePhoto); } break; } } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { for(int i=0;i<PublicWay.activityList.size();i){ if (null != PublicWay.activityList.get(i)) { PublicWay.activityList.get(i).finish(); } } System.exit(0); } return true; } }下载地址 : 微信上传图片源码
备份下载地址: 实现效果 主要是通过点击从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于好没有移动至最后,但原理相同. 二. 项目工程结构三. 界面布局详细代码
1.主界面activity_main.xml 主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.
[html] view plaincopy<RelativeLayout xmlns:android=" xmlns:tools=" android:id="@id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.suishoupaipublish.MainActivity" tools:ignore="MergeRootFrame" > <!-- 顶部添加文字 --> <RelativeLayout android:id="@id/Layout_top" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="dp" android:layout_marginTop="5dp" android:layout_alignParentTop="true" android:gravity="center"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="sp" android:gravity="center" android:text="发布信息" /> </RelativeLayout> <!-- 底部按钮 --> <RelativeLayout android:id="@id/Layout_bottom" android:layout_alignParentBottom="true" android:layout_width="fill_parent" android:layout_height="dp" android:gravity="center" > <Button android:id="@id/button1" android:layout_width="wrap_content" android:layout_height="fill_parent" android:textSize="sp" android:text="发布拍拍" /> <Button android:id="@id/button2" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_toRightOf="@id/button1" android:textSize="sp" android:text="取消发布" /> </RelativeLayout> <!-- 显示图片 --> <RelativeLayout android:id="@id/Content_Layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/Layout_bottom" android:layout_below="@id/Layout_top" android:gravity="center"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_alignParentBottom="true" > <!-- 设置运行多行 设置圆角图形 黑色字体--> <EditText android:id="@id/editText1" android:layout_height="dp" android:layout_width="fill_parent" android:textColor="#" android:layout_margin="dp" android:textSize="sp" android:hint="随手说出你此刻的心声..." android:maxLength="" android:singleLine="false" android:background="@drawable/editview_shape" /> <!-- 网显示图片 行列间距5dp 每列宽度dp --> <GridView android:id="@id/gridView1" android:layout_width="fill_parent" android:layout_height="dp" android:layout_margin="dp" android:background="#EFDFDF" android:horizontalSpacing="5dp" android:verticalSpacing="5dp" android:numColumns="4" android:columnWidth="dp" android:stretchMode="columnWidth" android:gravity="center" > </GridView> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)" android:gravity="center" /> </LinearLayout> </RelativeLayout> </RelativeLayout> 2.显示ImageView图片布局griditem_addpic.xml[html] view plaincopy<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <RelativeLayout android:layout_gravity="center" android:layout_width="dp" android:layout_height="dp" android:orientation="vertical" > <ImageView android:layout_marginTop="dp" android:layout_marginRight="dp" android:id="@id/imageView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/gridview_addpic" /> </RelativeLayout> </LinearLayout> 3.设置EditView控件圆角和颜色 editview_shape.xml[html] view plaincopy<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" android:shape="rectangle" android:padding="dp"> <!-- 填充editView的颜色 --> <soild android:color="#ffffff"/> <!-- 设置圆角的弧度,radius半径越大,editView的边角越圆 --> <corners android:radius="dp" android:bottomRightRadius="dp" android:bottomLeftRadius="dp" android:topLeftRadius="dp" android:topRightRadius="dp"/> <stroke android:color="#CD" android:width="4px" /> </shape> 四. 代码详解 它主要是思想如下: 1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作. 2.当点击加号图片()时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage. 3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片. 4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除. 具体代码如下所示:[java] view plaincopypublic class MainActivity extends Activity { private GridView gridView1; //网显示缩略图 private Button buttonPublish; //发布按钮 private final int IMAGE_OPEN = 1; //打开图片标记 private String pathImage; //选择图片路径 private Bitmap bmp; //导入临时图片 private ArrayList<HashMap<String, Object>> imageItem; private SimpleAdapter simpleAdapter; //适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * 防止键盘挡住输入框 * 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan" * 希望动态调整高度 android:windowSoftInputMode="adjustResize" */ getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_PAN); //锁定屏幕 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); //获取控件对象 gridView1 = (GridView) findViewById(R.id.gridView1); /* * 载入默认图片添加图片加号 * 通过适配器实现 * SimpleAdapter参数imageItem为数据源 R.layout.griditem_addpic为布局 */ //获取资源图片加号 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic); imageItem = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", bmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); /* * HashMap载入bmp图片在GridView中不显示,但是如果载入资源ID能显示 如 * map.put("itemImage", R.drawable.img); * 解决方法: * 1.自定义继承BaseAdapter实现 * 2.ViewBinder()接口实现 * 参考 */ simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); /* * 监听GridView点击事件 * 报错:该函数必须抽象方法 故需要手动导入import android.view.View; */ gridView1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { if( imageItem.size() == ) { //第一张为默认图片 Toast.makeText(MainActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show(); } else if(position == 0) { //点击图片位置为 0对应0张图片 Toast.makeText(MainActivity.this, "添加图片", Toast.LENGTH_SHORT).show(); //选择图片 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_OPEN); //通过onResume()刷新数据 } else { dialog(position); //Toast.makeText(MainActivity.this, "点击第"(position 1)" 号图片", // Toast.LENGTH_SHORT).show(); } } }); } //获取图片路径 响应startActivityForResult protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //打开图片 if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) { Uri uri = data.getData(); if (!TextUtils.isEmpty(uri.getAuthority())) { //查询选择图片 Cursor cursor = getContentResolver().query( uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); //返回 没找到选择图片 if (null == cursor) { return; } //光标移动至开头 获取图片路径 cursor.moveToFirst(); pathImage = cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media.DATA)); } } //end if 打开图片 } //刷新图片 @Override protected void onResume() { super.onResume(); if(!TextUtils.isEmpty(pathImage)){ Bitmap addbmp=BitmapFactory.decodeFile(pathImage); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", addbmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); simpleAdapter.notifyDataSetChanged(); //刷新后释放防止手机休眠后自动添加 pathImage = null; } } /* * Dialog对话框提示用户删除操作 * position为删除图片位置 */ protected void dialog(final int position) { AlertDialog.Builder builder = new Builder(MainActivity.this); builder.setMessage("确认移除已添加图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); imageItem.remove(position); simpleAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } } 同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.[html] view plaincopy<!-- 申明网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 申明权限 操作SD卡 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 五. 总结 该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示. 这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法. 下载地址:Android回调机制的讨论 原文链接:
Android自定义系列(2)——拟物化类弹窗式视频播放窗口 这是个自定义样式的简易播放器窗口,建立在FrameLayout上的隐藏窗口,触发可显示视频窗口。实现了从asserts目录下播放视频资源。1.在主布局文件中,设
Android 断点续传的实现 这两天用了下android5.1下载功能,简直鸡肋。无奈自己研究了半天的断点续传,总结一下。本文参考了慕课网XRay_Chen大神的视频,在此表示衷心的感谢!
标签: 安卓如何实现图片上传功能
本文链接地址:https://www.jiuchutong.com/biancheng/386085.html 转载请保留说明!上一篇:Android底部tab与标题栏相结合(android底部弹出页面)
友情链接: 武汉网站建设