保存图片到本地和分享多张图片到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);

    // 启动分享GUI
    oks.show(this);
}

2.效果展示图片

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

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

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();
        }
    }

    // 提示是否獲取權限,获取权限后跳转到二维码扫描界面
    @Override
    public 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() {
        @Override
        public 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() {
        @Override
        public 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() {
                @Override
                public void onDismiss(ActionSheet actionSheet, boolean isCancel) {

                }

                @Override
                public void onOtherButtonClick(ActionSheet actionSheet, int index) {
                    switch (index) {
                        case 0://QQ
                            packageName = "com.tencent.mobileqq";
                            break;
                        case 1://微信
                            packageName = "com.tencent.mm";
                            break;
                        case 2://微博
                            packageName = "com.sina.weibo";
                            break;
                        case 3://LINE
                            packageName = "jp.naver.line.android";
                            break;
                        case 4://WhatsAPP
                            packageName = "com.whatsapp";
                            break;
                        case 5://Facebook
                            packageName = "com.facebook.katana";
                            break;
                    }
                    if (!ShareImage.isAPPInstalled(getActivity(), packageName))//判断是否安装了相应app,并提示
                        ToastUtils.showToast(getActivity(), getString(R.string.language_noInstalledAPK));
                    else
                        getPermissions();//獲取權限和保存圖片后分享到朋友圈
                }
            }).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;
        else
            path = 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;
        else
            return 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.效果图

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

相关文章:

  • 2022-12-23
  • 2022-02-10
  • 2021-06-13
  • 2021-10-30
  • 2021-06-19
  • 2021-11-30
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-12
  • 2022-02-09
  • 2021-07-13
  • 2022-03-03
  • 2021-12-26
相关资源
相似解决方案