首先看下本 demo实现的功能

1:实现网络图片的加载显示
2:点击图片底部弹出popupwindow
3:点击分享 实现单个图片分享到:微信,朋友圈,QQ,QQ控件(调用系统)
4:点击下载 实现图片的下载 ,并通知系统相册进行更新

调用开源框架:ImageLoader  (实现图片的加载) 使用githup共享的开源代码实现系统分享的改写
关于ImageLoader 使用 可以去参考大神的博客http://blog.csdn.net/xiaanming/article/details/26810303
githup 上的连接记不太清了 等下会放出源码  就一个工具类的代码。有兴趣的可以去研究研究
项目里注释写的挺详细的 ,不说废话了直接上代码 :
imageloader配置  
package com.example.downloaddemo;import java.io.File;
import java.util.HashMap;
import java.util.Map;import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.graphics.Bitmap.CompressFormat;
import android.os.Vibrator;import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;/*** Application*/
public class LocationApplication extends Application {public static ImageLoader imageLoader;@Overridepublic void onCreate() {super.onCreate();File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "imageloader/hire/Cache");imageLoader = ImageLoader.getInstance();ImageLoaderConfiguration config3 = new ImageLoaderConfiguration.Builder(getApplicationContext()).memoryCacheExtraOptions(480, 800)// max width, max height即每个缓存文件最大长 .discCacheExtraOptions(480,// 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader,// use it carefully (Better don't use it)/设置缓存详细信息不要设置.threadPoolSize(3)// 线程池内加载的数 .threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))// You can pass your own memory cache// implementation//你可通过自己的内存缓存实 .memoryCacheSize(2 * 1024 *// 1024).discCacheSize(50 * 1024 * 1024).discCacheFileNameGenerator(new Md5FileNameGenerator())// 将保存的url名称用MD5加密.tasksProcessingOrder(QueueProcessingType.FIFO).discCacheFileCount(100) // 缓存文件数量.discCache(new UnlimitedDiscCache(cacheDir))// 文件储存路径.defaultDisplayImageOptions(DisplayImageOptions.createSimple()).imageDownloader(new BaseImageDownloader(getApplicationContext(),5 * 1000, 30 * 1000)) // connectTimeout (5 s),// readTimeout (30// s)超时时间.writeDebugLogs() // Remove for release app.build();// Initialize ImageLoader with configuration.imageLoader.init(config3);}
}

封装好的分享工具类:
package com.example.downloaddemo;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.Point;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Patterns;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;public class AndroidShare extends Dialog implementsAdapterView.OnItemClickListener {private LinearLayout mLayout;private GridView mGridView;private float mDensity;private String msgText = "分享了";private String mImgPath;private int mScreenOrientation;private List<ShareItem> mListData;private Handler mHandler = new Handler();private Runnable work = new Runnable() {public void run() {int orient = getScreenOrientation();if (orient != mScreenOrientation) {if (orient == 0)mGridView.setNumColumns(4);else {mGridView.setNumColumns(6);}mScreenOrientation = orient;((AndroidShare.MyAdapter) mGridView.getAdapter()).notifyDataSetChanged();}mHandler.postDelayed(this, 1000L);}};public AndroidShare(Context context) {super(context, R.style.shareDialogTheme);}public AndroidShare(Context context, int theme, String msgText,final String imgUri) {super(context, theme);this.msgText = msgText;if (Patterns.WEB_URL.matcher(imgUri).matches())new Thread(new Runnable() {public void run() {try {mImgPath = getImagePath(imgUri, getFileCache());} catch (Exception e) {e.printStackTrace();}}}).start();elsethis.mImgPath = imgUri;}public AndroidShare(Context context, String msgText, final String imgUri) {super(context, R.style.shareDialogTheme);this.msgText = msgText;if (Patterns.WEB_URL.matcher(imgUri).matches())new Thread(new Runnable() {public void run() {try {mImgPath = getImagePath(imgUri, getFileCache());} catch (Exception e) {e.printStackTrace();}}}).start();elsethis.mImgPath = imgUri;}void init(Context context) {DisplayMetrics dm = new DisplayMetrics();dm = context.getResources().getDisplayMetrics();this.mDensity = dm.density;this.mListData = new ArrayList<ShareItem>();this.mListData.add(new ShareItem("微信", R.drawable.logo_wechat,"com.tencent.mm.ui.tools.ShareImgUI", "com.tencent.mm"));this.mListData.add(new ShareItem("朋友圈", R.drawable.logo_wechatmoments,"com.tencent.mm.ui.tools.ShareToTimeLineUI", "com.tencent.mm"));this.mListData.add(new ShareItem("qq", R.drawable.logo_qq,"com.tencent.mobileqq.activity.JumpActivity","com.tencent.mobileqq"));this.mListData.add(new ShareItem("qq空间", R.drawable.logo_qzone,"com.qzone.ui.operation.QZonePublishMoodActivity","com.qzone"));this.mLayout = new LinearLayout(context);this.mLayout.setOrientation(1);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2);params.leftMargin = ((int) (10.0F * this.mDensity));params.rightMargin = ((int) (10.0F * this.mDensity));this.mLayout.setLayoutParams(params);this.mLayout.setBackgroundColor(Color.parseColor("#D9DEDF"));this.mGridView = new GridView(context);this.mGridView.setLayoutParams(new ViewGroup.LayoutParams(-1, -2));this.mGridView.setGravity(17);this.mGridView.setHorizontalSpacing((int) (10.0F * this.mDensity));this.mGridView.setVerticalSpacing((int) (10.0F * this.mDensity));this.mGridView.setStretchMode(1);this.mGridView.setColumnWidth((int) (90.0F * this.mDensity));this.mGridView.setHorizontalScrollBarEnabled(false);this.mGridView.setVerticalScrollBarEnabled(false);this.mLayout.addView(this.mGridView);}public List<ComponentName> queryPackage() {List<ComponentName> cns = new ArrayList<ComponentName>();Intent i = new Intent("android.intent.action.SEND");i.setType("image/*");List<ResolveInfo> resolveInfo = getContext().getPackageManager().queryIntentActivities(i, 0);for (ResolveInfo info : resolveInfo) {ActivityInfo ac = info.activityInfo;ComponentName cn = new ComponentName(ac.packageName, ac.name);cns.add(cn);}return cns;}public boolean isAvilible(Context context, String packageName) {PackageManager packageManager = context.getPackageManager();List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);for (int i = 0; i < pinfo.size(); i++) {if (((PackageInfo) pinfo.get(i)).packageName.equalsIgnoreCase(packageName))return true;}return false;}protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Context context = getContext();init(context);setContentView(this.mLayout);getWindow().setGravity(80);if (getScreenOrientation() == 0) {this.mScreenOrientation = 0;this.mGridView.setNumColumns(4);} else {this.mGridView.setNumColumns(6);this.mScreenOrientation = 1;}this.mGridView.setAdapter(new MyAdapter());this.mGridView.setOnItemClickListener(this);this.mHandler.postDelayed(this.work, 1000L);setOnDismissListener(new DialogInterface.OnDismissListener() {public void onDismiss(DialogInterface dialog) {mHandler.removeCallbacks(work);}});}public void show() {super.show();}@SuppressLint("NewApi")public int getScreenOrientation() {int landscape = 0;int portrait = 1;Point pt = new Point();getWindow().getWindowManager().getDefaultDisplay().getSize(pt);int width = pt.x;int height = pt.y;return width > height ? portrait : landscape;}public void onItemClick(AdapterView<?> parent, View view, int position,long id) {ShareItem share = (ShareItem) this.mListData.get(position);shareMsg(getContext(), "分享到...", this.msgText, this.mImgPath, share);}@TargetApi(Build.VERSION_CODES.GINGERBREAD)@SuppressLint("NewApi")private void shareMsg(Context context, String msgTitle, String msgText,String imgPath, ShareItem share) {if (!share.packageName.isEmpty()&& !isAvilible(getContext(), share.packageName)) {Toast.makeText(getContext(), "请先安装" + share.title,Toast.LENGTH_SHORT).show();return;}Intent intent = new Intent("android.intent.action.SEND");if ((imgPath == null) || (imgPath.equals(""))) {intent.setType("text/plain");} else {File f = new File(imgPath);if ((f != null) && (f.exists()) && (f.isFile())) {intent.setType("image/png");intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));}}intent.putExtra(Intent.EXTRA_SUBJECT, msgTitle);intent.putExtra(Intent.EXTRA_TEXT, msgText);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (!share.packageName.isEmpty()) {intent.setComponent(new ComponentName(share.packageName,share.activityName));context.startActivity(intent);} else {context.startActivity(Intent.createChooser(intent, msgTitle));}}private File getFileCache() {File cache = null;if (Environment.getExternalStorageState().equals("mounted"))cache = new File(Environment.getExternalStorageDirectory() + "/."+ getContext().getPackageName());else {cache = new File(getContext().getCacheDir().getAbsolutePath()+ "/." + getContext().getPackageName());}if ((cache != null) && (!cache.exists())) {cache.mkdirs();}return cache;}public String getImagePath(String imageUrl, File cache) throws Exception {String name = imageUrl.hashCode()+ imageUrl.substring(imageUrl.lastIndexOf("."));File file = new File(cache, name);if (file.exists()) {return file.getAbsolutePath();}URL url = new URL(imageUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");conn.setDoInput(true);if (conn.getResponseCode() == 200) {InputStream is = conn.getInputStream();FileOutputStream fos = new FileOutputStream(file);byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}is.close();fos.close();return file.getAbsolutePath();}return null;}private final class MyAdapter extends BaseAdapter {private static final int image_id = 256;private static final int tv_id = 512;public MyAdapter() {}public int getCount() {return mListData.size();}public Object getItem(int position) {return null;}public long getItemId(int position) {return 0L;}private View getItemView() {LinearLayout item = new LinearLayout(getContext());item.setOrientation(1);int padding = (int) (10.0F * mDensity);item.setPadding(padding, padding, padding, padding);item.setGravity(17);ImageView iv = new ImageView(getContext());item.addView(iv);iv.setLayoutParams(new LinearLayout.LayoutParams(-2, -2));iv.setId(image_id);TextView tv = new TextView(getContext());item.addView(tv);LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(-2, -2);layoutParams.topMargin = ((int) (5.0F * mDensity));tv.setLayoutParams(layoutParams);tv.setTextColor(Color.parseColor("#212121"));tv.setTextSize(16.0F);tv.setId(tv_id);return item;}public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = getItemView();}ImageView iv = (ImageView) convertView.findViewById(image_id);TextView tv = (TextView) convertView.findViewById(tv_id);AndroidShare.ShareItem item = (AndroidShare.ShareItem) mListData.get(position);iv.setImageResource(item.logo);tv.setText(item.title);return convertView;}}private class ShareItem {String title;int logo;String activityName;String packageName;public ShareItem(String title, int logo, String activityName,String packageName) {this.title = title;this.logo = logo;this.activityName = activityName;this.packageName = packageName;}}
}
主要功能代码:
package com.example.downloaddemo;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {// 图片urlprivate String phat = "http://www.qqya.com/userimg/15/13100P04140.jpg";// 设置SD路径private final static String ALBUM_PATH = Environment.getExternalStorageDirectory() + "/baocunlujing/";private File dirFile, myCaptureFile;private ProgressDialog mSaveDialog = null;private Bitmap mBitmaps;private String mFileName;private ImageView img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);inti();}/*** 初始化ui*/void inti() {img = (ImageView) findViewById(R.id.img);img.setOnClickListener(this);/** 调用开源框架 ImageLoader加载并显示图片*/ImageLoader.getInstance().loadImage(phat,new SimpleImageLoadingListener() {private Bitmap mBitmap;@Overridepublic void onLoadingComplete(String imageUri, View view,Bitmap mBitmap) {this.mBitmap = mBitmap;// 将bitmap转换为全局变量,以供下方调用mBitmaps = mBitmap;super.onLoadingComplete(imageUri, view, mBitmap);img.setImageBitmap(mBitmap);}});}/*** 保存文件* * @param bm* @param fileName* @throws IOException*/public void saveFile(Bitmap bm, String fileName) throws IOException {dirFile = new File(ALBUM_PATH);if (!dirFile.exists()) {dirFile.mkdir();}myCaptureFile = new File(ALBUM_PATH + fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);bos.flush();bos.close();}/*** 弹出窗*/private void showDialog() {View view = LayoutInflater.from(this).inflate(R.layout.image_pager,null);final Dialog dialog = new Dialog(this,R.style.transparentFrameWindowStyle);dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));Window window = dialog.getWindow();// 设置显示动画window.setWindowAnimations(R.style.main_menu_animstyle);WindowManager.LayoutParams wl = window.getAttributes();wl.x = 0;wl.y = this.getWindowManager().getDefaultDisplay().getHeight();// 以下这两句是为了保证按钮可以水平满屏wl.width = ViewGroup.LayoutParams.MATCH_PARENT;wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;// 设置显示位置dialog.onWindowAttributesChanged(wl);// 设置点击外围解散dialog.setCanceledOnTouchOutside(true);dialog.show();Button sendBtn = (Button) view.findViewById(R.id.quxiao);Button sendBtn1 = (Button) view.findViewById(R.id.xiazai);Button share = (Button) view.findViewById(R.id.share);// 下载sendBtn1.setOnClickListener(new View.OnClickListener() {@SuppressLint("NewApi")@Overridepublic void onClick(View arg0) {// 图片名字 自定义String name = "tupianname.jpg";// 替换名字mFileName = name;mSaveDialog = ProgressDialog.show(MainActivity.this, "保存图片","图片正在保存中,请稍等...", true);try {// 无异常保存成功 产生异常保存失败saveFile(mBitmaps, mFileName);mSaveDialog.dismiss();// 保存成功 通知相册进行显示最新照片Toast.makeText(MainActivity.this, "图片保存到:我的文件" + mFileName,Toast.LENGTH_SHORT).show();Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri uri = Uri.fromFile(myCaptureFile);intent.setData(uri);sendBroadcast(intent);} catch (IOException e) {Toast.makeText(MainActivity.this, "图片保存失败!",Toast.LENGTH_SHORT).show();e.printStackTrace();}}});// 分享share.setOnClickListener(new View.OnClickListener() {@SuppressLint("NewApi")@Overridepublic void onClick(View arg0) {// 调用 系统分享功能AndroidShare as = new AndroidShare(MainActivity.this, "分享着张图片",phat);as.show();}});// 取消框sendBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});}/** img的点击事件*/@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.img:// 当图片未加载的情况下 弹出提示if (mBitmaps != null) {showDialog();} else {Toast.makeText(getApplicationContext(), "图片未加载成功", 0).show();}break;default:break;}}
}

布局比较简单就不放出来了 。
下面放下成果,
DOME  下载 :http://download.csdn.net/detail/a153013144/9266545

Android 通过开源框架实现加载网络图片并下载到SD卡通知系统相册显示,(并实现分享图片功能)相关推荐

  1. 安卓 加载网络图片并下载本地

    安卓 加载网络图并下载 1,最近暂时不忙,终于有时间学习复习知识点了, 发现自己对于网络加载图并且下载不熟悉,于是乎补习了一下,嗯 下面我就说具体代码吧. 2,首先添加布局代码: <ImageV ...

  2. Android开发之异步任务加载网络图片并存储在sdcard中(源代码分享)

    在MainActivity中的代码 package com.example.f02_sdcard02;import android.os.AsyncTask; import android.os.Bu ...

  3. 项目实战(三):banner加载网络图片,不变形,可缩放可完全显示

    Banner图片加载 在项目中难免会遇到遇到轮播图这种功能需求,而大多数都是用Banner去实现.在项目中尽量从后端获取bannerlist列表数据并进行展示,这样进行更新时只需要后台更改即可,而不需 ...

  4. android studio 加载图片,Android Studio 加载网络图片

    Android Studio是基于gradle的一个Android开发软件,在引用网络图片的时候需要连接第三方库,这里介绍 引用glide的方法. 一.在github页面搜索glide,点击第一个 二 ...

  5. Android Glide加载网络图片不显示,但用网页打开又正常显示

    前言 最近做Demo比较多,之前在搭网络框架的时候遇到了图片加载的问题,因为我以前的框架中加载网络图片是没有问题,这次居然出问题,但是其实也不难解决吧. 异常问题 报错有两个 ① Failed to ...

  6. android多种方式实现异步加载图片

    记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...

  7. Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较

    在android中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片.在这里我主要介绍一下我自己在使用Volley, Picasso, U ...

  8. Android slider加载网络图片的框架

    android中使用slider加载网络图片,众所周知,在开发App的时候,差不多每个app的主页面的搭建都少不了广告轮播,广告轮播,我们可以手动轮播,也可以让其自动轮播,这都是可以的,当我们使用Vi ...

  9. 【转载】一行代码加载网络图片到ImageView——Android Picasso

    原文链接:一句代码加载网络图片到ImageView--Android Picasso  注意:此处使用下面代码需要先配置一下gradle,下载所需包. 具体操作如下图: compile 'com.sq ...

最新文章

  1. PL-VINS:实时基于点线的单目惯导SLAM系统
  2. html3d样式,CSS+HTML3D文字效果
  3. Codeforces 959 E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))
  4. 【转】Vue.js入门教程(一)从静态页面到前后端分离开发
  5. Lucene3.5自学4--建索引相关知识总结
  6. php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?
  7. apache+mod_wsgi配置
  8. windows linux 传文件_2种windows到linux上传文件的方法
  9. GRE(Generic Routing Encapsulation,通用路由封装)tunnel技术
  10. 单片机控制24v电压_整车控制器-硬件篇
  11. 蚂蚁庄园 php源码,求一个基于Auto.js的蚂蚁庄园脚本
  12. 【攻略】舰これ辅助程式介绍-航海日志
  13. hihocode——#1498 : Diligent Robots
  14. 爬虫基础_01——正则
  15. 基于PHP和MySQL的奶茶网站,基于PHP和MySQL的网站设计与实现
  16. 吱口令代付|淘宝天猫教程|找人代付|淘宝代付源码
  17. Ubuntu 17.04下安装64位谷歌Chrome浏览器
  18. 5G工业路由器PLC无线组网远程控制
  19. Java开发常用英语单词表
  20. 科目二 总结(方向盘,离合器,刹车)

热门文章

  1. 蓝牙AirTag防丢器FindMy
  2. Verilog之文件操作
  3. C++ wait_for
  4. 阿里云服务器的系统盘怎么选?
  5. linux发送http post请求
  6. 用Python代码实现电子时钟
  7. Java高手群(学习交流群)
  8. AR引擎技术选型和使用实现方案
  9. Go语言教程第三集 集合、函数和方法
  10. 加载在线图片被拒绝403--防盗链问题