保存图片到本地和分享多张图片到QQ、微信、WhatsApp、Facebook等平台

保存图片到本地和分享多张图片到QQ、微信、WhatsApp、Facebook等平台

一、分享图片到各个平台多种方式:如第三方的sdk:ShardSDK,直接通过分享到的平台的包名来分享图片的原生方法

1.通过ShareSDK分享图片,不要忘记导入相应的应用包和初始化ShardSDK哦

/*** 分享*/
private void share() {OnekeyShare oks = new OnekeyShare();// 关闭sso授权oks.disableSSOWhenAuthorize();// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间等使用oks.setTitle(nameShare);// 商品编号 code, nameShare, imageUrlShare// titleUrl是标题的网络链接,QQ和QQ空间等使用oks.setTitleUrl(MyConfig.shopUrl + code);// text是分享文本,所有平台都需要这个字段oks.setText(nameShare + " " + MyConfig.shopUrl + code);// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数// oks.setImagePath("/sdcard/pic.png");// 确保SDcard下面存在此张图片// 网络路径获取图片oks.setImageUrl(imageUrlShare);// 商品的图片网址//oks.setImageArray();//分享图片集合// oks.setImageUrl("http://www.vipstation.com.hk/images/itemimg/L16454754.jpg");// url仅在微信(包括好友和朋友圈)中使用oks.setUrl(MyConfig.shopUrl + code);// comment是我对这条分享的评论,仅在人人网和QQ空间使用// oks.setComment("我是测试评论文本");// site是分享此内容的网站名称,仅在QQ空间使用// oks.setSite(getString(R.string.app_name));// siteUrl是分享此内容的网站地址,仅在QQ空间使用// oks.setSiteUrl(MyConfig.shopUrl + code);/* 这里添加自定义的平台代码(复制链接) */Bitmap logo = BitmapFactory.decodeResource(getResources(), R.drawable.ssdk_oks_classic_copylink);String label = getString(R.string.ssdk_copyLink);/* 复制链接图标的点击事件 */View.OnClickListener listener = new View.OnClickListener() {@SuppressWarnings("deprecation")public void onClick(View v) {ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);// 将文本内容放到系统剪贴板里。cm.setText(MyConfig.shopUrl + code);ToastXutil.showToast(getApplicationContext(), getString(R.string.language_copiedSuccessfully));}};/* 添加自定义图标 */oks.setCustomerLogo(logo, label, listener);// 启动分享GUIoks.show(this);
}

2.效果展示图片

二、通过要分享到应用的包名的原生分享方式来分享图片,该分享方式是首先把图片保存到本地,再拿保存到本地的图片分享到各个应用

1.保存图片和分享图片

private boolean isShareImage;//是否是分享图片功能
private String packageName = null;//分享平台的一些包名
public void onViewClicked(View view) {switch (view.getId()) {case R.id.fragment_saleAll://保存所有图片isShareImage = false;getPermissions();//獲取權限和保存圖片break;case R.id.fragment_share://分享图片到朋友圈isShareImage = true;shareDirection();break;}}
    //获取存储权限private void getPermissions() {// Android6.0以上(包括6.0)系统,不能只是在AndroidManifest.xml中进行配置,// 还要在程序代码中进行动态设置相应的权限。// 版本号if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {// 存储空间权限requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
//                requestPermissions(new String[]{Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);} else {saveOrShareImage();}} else {saveOrShareImage();}}// 提示是否獲取權限,获取权限后跳转到二维码扫描界面@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 0:if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 取得权限saveOrShareImage();} else {// 未取得权限showToast(getString(R.string.language_noPermissions));}break;}}//保存或分享图片private void saveOrShareImage() {if (isShareImage) {showWaitProgressDialog(getActivity(), 1, getString(R.string.language_pleaseWait));//删除保存分享图片的文件夹和文件ImageCompressUtils.deleteAllFilesOfDir(new File(CommonConstants.shareImagePath));} else {showWaitProgressDialog();}new Thread(saveAllFileRunnable).start();}
    //保存所有的图片private Runnable saveAllFileRunnable = new Runnable() {@Overridepublic void run() {try {downloadNum = 0;for (int i = 0; i < listMImage.size(); i++) {if (listMImage.get(i).getMark() == 1) {//只保存已经上传了的所有图片downloadNum++;mBitmap = ImageLoader.getInstance().loadImageSync(listMImage.get(i).getImgPath());SaveImageUtil.saveFile(mBitmap, listMImage.get(i).getImgPath(), getActivity(), isShareImage);}}if (downloadNum >= getServerImage.size()) {if (isShareImage)ShareImage.shareImagesToWeiXin(getActivity(), CommonConstants.shareImagePath, packageName);//分享图片else {mSaveMessage = getString(R.string.language_pictureSavedSuccessfully);}dismissProgressDialog();}} catch (Exception e) {dismissProgressDialog();
//                if (isShareImage)
//                    mSaveMessage = "分享失败,可能沒有存儲空間的權限!";
//                else {
//                    mSaveMessage = getString(R.string.language_pictureSavedFailed);
//                }e.printStackTrace();}if (isShareImage == false)messageHandler.sendMessage(messageHandler.obtainMessage());}};private Handler messageHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {showToast(mSaveMessage);}
//选择分享到朋友圈还是朋友
private void shareDirection() {ActionSheet.createBuilder(getActivity(), getActivity().getSupportFragmentManager()).setCancelButtonTitle(getString(R.string.language_dialogNegative)).setOtherButtonTitles(getString(R.string.language_qq), getString(R.string.language_WeChat), getString(R.string.language_weiBo), getString(R.string.language_line), getString(R.string.language_WhatsApp), getString(R.string.language_Facebook)).setCancelableOnTouchOutside(true)//dialog弹出后会点击屏幕,dialog是否消失.setListener(new ActionSheet.ActionSheetListener() {@Overridepublic void onDismiss(ActionSheet actionSheet, boolean isCancel) {}@Overridepublic void onOtherButtonClick(ActionSheet actionSheet, int index) {switch (index) {case 0://QQpackageName = "com.tencent.mobileqq";break;case 1://微信packageName = "com.tencent.mm";break;case 2://微博packageName = "com.sina.weibo";break;case 3://LINEpackageName = "jp.naver.line.android";break;case 4://WhatsAPPpackageName = "com.whatsapp";break;case 5://FacebookpackageName = "com.facebook.katana";break;}if (!ShareImage.isAPPInstalled(getActivity(), packageName))//判断是否安装了相应app,并提示ToastUtils.showToast(getActivity(), getString(R.string.language_noInstalledAPK));elsegetPermissions();//獲取權限和保存圖片后分享到朋友圈}}).show();
}

2.保存图片的方法

/*** 保存圖片的方法*/
public class SaveImageUtil {// 图片保存的文件夹
//    private static String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/VIPInternalPicture/";
//    private static String path = Environment.getExternalStorageDirectory()
//            .getAbsolutePath() + "/VIPInternal/VIPInternalPicture/";//下载图片保存到系统图库private static final String pathImage = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/";//分享到朋友圈的图片保存的地址private static final String shareImagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/share_internal_image/";/*** 把图片网址转换为Drawable*/public static Drawable loadImageFromNetwork(String imageUrl) {Drawable drawable = null;try {// 可以在这里通过文件名来判断,是否本地有此图片drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png");} catch (Exception e) {Log.d("test", e.getMessage());}
//        if (drawable == null) {
//            Log.d("test", "null drawable");
//        } else {
//            Log.d("test", "not null drawable");
//        }return drawable;}@SuppressLint("DefaultLocale")public static void saveFile(Bitmap bm, String url, Context context, Boolean isShareImage) throws Exception {String path = null;if (isShareImage)path = shareImagePath;elsepath = pathImage;// 判断sd卡是否存在if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// 判断文件夹是否存在File dirFile = new File(path);if (!dirFile.exists()) {dirFile.mkdirs();//创建此抽象路径指定的目录,包括所有必须但不存在的父目录。(及可以创建多级目录,无论是否存在父目录)}String fileName = url.substring(url.lastIndexOf("/") + 1, url.length()).toLowerCase();File file = new File(path + fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));bm.compress(Bitmap.CompressFormat.PNG, 100, bos);bos.flush();bos.close();
//            //把文件插入到系统图库
//            MediaStore.Images.Media.insertImage(context.getContentResolver(), bm, fileName, null);// 通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file)));} else {Toast.makeText(context, context.getString(R.string.language_notSDCard), Toast.LENGTH_SHORT).show();}}
}

3.分享图片的方法

/*** 分享图片*/
public class ShareImage {//判断是否安装微信private static boolean isInstallWeChat(Context context) {PackageInfo packageInfo = null;try {packageInfo = context.getPackageManager().getPackageInfo("com.tencent.mm", 0);} catch (Exception e) {packageInfo = null;e.printStackTrace();}if (packageInfo == null)return false;elsereturn true;}//通过包名断是否安装了该程序public static boolean isAPPInstalled(Context context, String packageName) {PackageManager pm = context.getPackageManager();List<PackageInfo> pinfo = pm.getInstalledPackages(0);for (int i = 0; i < pinfo.size(); i++) {if (pinfo.get(i).packageName.equals(packageName)) {return true;}}return false;}/*** 分享图片到微信,分享的是本地图片** @param path        存放图片的地址* @param packageName 要分享到平台的包名*/public static void shareImagesToWeiXin(Context context, String path, String packageName) {try {Intent intent = new Intent("android.intent.action.SEND");intent.setPackage(packageName);//自己选择分享到好友还是朋友圈//直接跳转到LINE选择好友的界面//intent.setComponent(new ComponentName("jp.naver.line.android", "jp.naver.line.android.activity.selectchat.SelectChatActivity"));
//            if (isFriends) {
//                //com.tencent.mm.ui.tools.ShareImgUI   直接分享到微信好友,
//                weChatIntent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI"));
//            } else
//                //com.tencent.mm.ui.tools.ShareToTimeLineUI  直接分享到微信朋友圈,最多可以分享九张图片到微信朋友圈
//                intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI"));intent.setAction(Intent.ACTION_SEND_MULTIPLE);ArrayList<Uri> imageList = new ArrayList();File[] files = new File(path).listFiles();if (files != null) {for (File file : files) {L.e(file.getAbsolutePath());File f = new File(file.getAbsolutePath());if (f.exists()) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {//android 7.0以下imageList.add(Uri.fromFile(f));} else {//android 7.0及以上Uri uri = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(context.getContentResolver(), f.getAbsolutePath(), f.getName(), null));imageList.add(uri);}}}}intent.setType("image/*");intent.putExtra(Intent.EXTRA_STREAM, imageList);
//            weChatIntent.putExtra("Kdescription", "aaaa"); //分享描述context.startActivity(intent);} catch (Exception e) {ToastUtils.showToast(context.getApplicationContext(), context.getString(R.string.language_shareFail));}}
}

4.效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32882.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这样写代码,同事乐开花

往期热门文章&#xff1a; 1、Java接口开发&#xff0c;不用写Controller、Service、Dao、Mapper、XML、VO&#xff0c;自动生成&#xff01; 2、为什么说程序员是一个极度劳累的工作&#xff1f; 3、Spring6的新特性&#xff0c;正式“抛弃”feign了 4、微软美国全职员工福利&…

【资源分享】经典老歌、KTV必点歌曲分享

不知道各位小伙伴有没有遇到过这种情况。长辈叫你帮他下载一些老歌放U盘里面&#xff0c;于是打开搜索引擎正准备大展手脚时&#xff0c;却发现是一个又一个的付费购买。 本人也是在这上面与搜索引擎做了不少斗争&#xff0c;以下包含了KTV必点歌曲五百多首&#xff0c;经典粤…

基于GPT3.5模型搭建的聊天系统BAIChat

1. 使用chatgpt前提条件 需要特殊的网络环境。如果是小白&#xff0c;不会搭建网络环境&#xff0c;可以关注我私信我&#xff0c;在线帮你搭建网络环境。 2.BAIChat链接 https://chatbot.theb.ai/#/chat/1686535596065 GPT3 研究背景 最近的研究表明&#xff0c;在 pretrai…

【编程必备】保姆级教学:简单教你使用 Python 调用 ChatGPT-3.5-API

前天 OpenAI 开放了两个新模型的api接口&#xff0c;专门为聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。 ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model. 从上面这句话&#xff0c;我们可以知道现在 chat.openai.com 官网就是由 gpt-3.5…

GPT时代,超强大脑才是你的第一财富。

ChatGPT 爆火后&#xff0c;无数人把这个无所不能的对话机器人当做生活、工作助理&#xff0c;用其代替搜索引擎、生成流畅的翻译、甚至撰写文章、剪辑视频、分析数据&#xff0c;享受着“不劳而获”的便利和高效体验。 自然而然地&#xff0c;一些老生常谈的话题&#xff0c;比…

新书上市 | 从大脑认知开始,全方面提高编程能力,助你摆脱“GPT焦虑症”

目录 一、ChatGPT火爆全网二、《程序员超强大脑》三、本书内容四、本书特色五、作译者简介1、费莉安赫尔曼斯&#xff08;Felienne Hermans&#xff09;2、蒋楠 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零…

别贩卖焦虑了,人工智能永远无法取代你

每一次生产力的变革&#xff0c;在带来技术进步与更高效率的同时&#xff0c;也都无可避免的会带来一波失业浪潮&#xff0c;当下的人工智能浪潮自然也不例外。现在&#xff0c;第一批因为AI失业的人已经出现了…… 因为AI失业的第一批人&#xff0c;已经开始在游戏行业出现了 …

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展&#xff0c;互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务&#xff0c;然后有了“考研信息平台”&#xff0c;这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计&#xff0c;大多采用java技…

【.NET AI Books】问题分类和技能使用大全

第一章 问题分类 我会把问题设定放在首位&#xff0c;也就是我们的第一章。毕竟所有生成式的 AI 都是需要基于问题给出答案。所以我一直不认同人工智能会取代人类&#xff0c;没有人类哪来问题呢&#xff1f; ChatGPT 的神奇之处在于它可以根据你的问题去完成不同的工作&…

周期函数傅里叶级数的各次谐波系数确定

周期函数傅里叶级数的各次谐波系数确定 在不考虑直流分量的情况下对于周期函数的系数进行计算确定。 简单阐述原理过程。 实例场景&#xff1a; 假定被采样信号的模拟信号时一个周期性时间函数&#xff0c;除基波外还含有不衰减的直流分量和各次函数。 基本形式 周期函数的…

奈奎斯特稳定性判据的步骤(含详细推导)

奈奎斯特稳定性判据的步骤&#xff1a; 一、作出半闭合曲线1.作出开环系统的奈奎斯特曲线2.补圆 二、计算R的大小三、判断Z是否为0 提示&#xff1a;本文只含有奈奎斯特判据的步骤&#xff0c;适合期末防挂科的同学&#xff0c;若想要透彻地了解奈奎斯特判据的原理&#xff0c;…

《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 文章目录 一、前言二、简介1. 谁发明了设计模式&#xff1f;2. 我怎么学不会设计模式&#xff1f;3. 适合人群4. 我能学到什么5.…

三角函数到傅立叶级数

我讨厌傅立叶级数的叫法&#xff0c;这老让我感觉到很深奥&#xff0c;但当我用三角级数时&#xff0c;感觉就大不同了&#xff01;&#xff01; 下面进入正题 正弦波 信号处理中极为极为极为重要的一个函数,三角函数,之所以叫做三角函数,是因为它的计算方式和直角三角密切相…

三大变换与自控(一)傅里叶级数

这一系列文章记录了我在学习三大变换时的心得。 首先从傅里叶变换开始&#xff0c;这是将一个信号从时域转变成频域的算法&#xff0c;在信号处理方面非常有用。 如果正在阅读这篇文章的读者还对傅立叶分析没有一个比较清楚的感性认识&#xff0c;建议先阅读一下知乎的一篇文…

python实现FFT(快速傅里叶变换)

python实现FFT&#xff08;快速傅里叶变换&#xff09; 简单定义一个FFT函数&#xff0c;以后的使用中可以直接幅值粘贴使用。 首先生成了一个频率为1、振幅为1的正弦函数&#xff1a; 然后计算该信号的频率和幅值&#xff0c;得到计算结果如下&#xff1a; 其中计算相位角…

《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 1. 为甚&#xff0c;撸Mybatis 我就知道&#xff0c;你会忍不住对它下手&#xff01;&#x1f928; 21年带着粉丝伙伴撸了一遍…

傅里叶变换F(f)与F(w)的探究——以余弦函数为例

我们在信号与系统和通信原理中学到的傅里叶变化大多是 F ( ω ) F(\omega) F(ω)这种形式的&#xff1a; 但有时在看资料的时候&#xff0c;发现有人会用 F ( f ) F(f) F(f)这种表达&#xff0c;在画频域图的时候也有 ω \omega ω和 f f f两种横坐标&#xff0c;幅值也会有相应…

傅里叶级数和傅里叶变换

最近在课堂中再次接触了傅里叶级数&#xff08;FS——Fourier Series&#xff09;和傅里叶变换&#xff08;FT——Fourier Transform&#xff09;&#xff0c;这里写一点粗浅的笔记来帮助自己理解。 一、傅里叶级数的意义 首先傅里叶级数是伟大的&#xff0c;它成功的给我们描…

冲激函数的性质

电路对于单位冲激函数的激励的零状态响应称为单位冲激响应。 单位冲激函数也是一种奇异函数&#xff0c;可定义为 单位冲激函数又称为δ函数。它在t≠0处为0&#xff0c;但在t0处为奇异的。 单位冲激函数δ(t)可以看作是单位脉冲函数的极限情况。图1-a为一个单位矩形脉冲函数…

单边指数信号的傅立叶matlab,实验四连续信号的傅立叶变换

subplot(3,1,3);plot(w1,phai) %该三行用来得到相频特性图可得到完整图形。 例2&#xff0e;求2 11)(ω ωj F 的傅里叶逆变换)(t f 。 解&#xff1a;编写如下M 文件&#xff0c; syms t w F1/(1w^2); fifourier(F,w,t) ezplot(f) 运行后&#xff0c;可得如下的文本和如图2所示…