Android分享网络图片至微信QQ

1:实现选择分享弹框

public class ShareDialog {
    
    
    public static final String TAG = "ShareDialog";
    private static PopupWindow popupWindow;
    private static final String TYPE_WECHAT = "session";
    private static final String TYPE_WECHAT_MOMENT = "timeline";
    public static final String KEY_SHARE_TYPE = "key_share_type";
    private static WbShareHandler shareHandler;
    public static final int SHARE_CLIENT = 1;
    private static int mShareType = SHARE_CLIENT;
    private static IWXAPI mApi;
    private static String token;
    //    private Tencent mTencent;
    private static String mSharetypes;

    /**
     * 分享图片
     *
     * @param v
     */
    @SuppressLint("WrongConstant")
    public static void openshareimage(TextView v, Activity activity, String file) {
    
    
        if (popupWindow != null && popupWindow.isShowing()) {
    
    
            return;
        }
        //设置PopupWindow的View
        View view = LayoutInflater.from(activity).inflate(R.layout.popview_share, null);
        popupWindow = new PopupWindow(view, RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        popupWindow.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);
        popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        LinearLayout tvShareSeen = view.findViewById(R.id.tvShareSeen);
        LinearLayout tvSharepyq = view.findViewById(R.id.tvSharepyq);
        LinearLayout tvShareZQne = view.findViewById(R.id.tvShareZQne);
        LinearLayout tvShareQQ = view.findViewById(R.id.tvShareQQ);
        //微信好友分享
        tvShareSeen.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                ShareImageUtils.sharePictureToWechatFriend(activity, file, TYPE_WECHAT);
                if (popupWindow != null && popupWindow.isShowing()) {
    
    
                    popupWindow.dismiss();
                }
            }
        });
        //朋友圈分享
        tvSharepyq.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                ShareImageUtils.sharePictureToWechatFriend(activity, file, TYPE_WECHAT_MOMENT);
                if (popupWindow != null && popupWindow.isShowing()) {
    
    
                    popupWindow.dismiss();
                }
            }
        });
        //QQ好友分享
        tvShareQQ.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                SaveNetPhotoUtils.savePhoto(activity, file, "QQ");//上下文,网络图片地址,分享类型
                if (popupWindow != null && popupWindow.isShowing()) {
    
    
                    popupWindow.dismiss();
                }
            }
        });
        //QQ空间分享
        tvShareZQne.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                SaveNetPhotoUtils.savePhoto(activity, file, "KJ");//上下文,网络图片地址,分享类型
                if (popupWindow != null && popupWindow.isShowing()) {
    
    
                    popupWindow.dismiss();
                }
            }
        });
        popupWindow.setFocusable(true);
        popupWindow.setAnimationStyle(R.style.PopupWindow);
        popupWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
    
    
            @Override
            public void onDismiss() {
    
    
                popupWindow.dismiss();
                setBackgroundAlpha(activity, 1f);
            }
        });
        setBackgroundAlpha(activity, 0.6f);
    }
    
    //设置屏幕背景透明效果
    public static void setBackgroundAlpha(Activity activity, float alpha) {
    
    
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.alpha = alpha;
        activity.getWindow().setAttributes(lp);
    }
    }

2:微信QQ分享回调

/**
 * date:2020/9/30 0030
 * author:wsm (Administrator)
 * funcation:分享网络图片到QQ微信
 */
public class ShareImageUtils {
    
    
    public static final String TAG = "ShareImageUtils";
    //微信
    public static final String PACKAGE_WECHAT = "com.tencent.mm";
    //qq
    public static final String PACKAGE_MOBILE_QQ = "com.tencent.mobileqq";

    private static final String TYPE_WECHAT = "session";
    private static final String TYPE_WECHAT_MOMENT = "timeline";

    /**
     * 分享单张图片到微信
     *
     * @param context context
     * @param picFile 要分享的图片文件
     */
    public static void sharePictureToWechatFriend(Activity context, String picFile, String type) {
    
    
        IWXAPI wxapi = WXAPIFactory.createWXAPI(context, 微信开放平台上的值);
        wxapi.registerApp(微信开放平台上的值);
        if (isAvilible(context, PACKAGE_WECHAT)) {
    
    
            new Thread(new Runnable() {
    
    
                @Override
                public void run() {
    
    
                    try {
    
    
                        Bitmap bmp = BitmapFactory.decodeStream(new URL(picFile).openStream());
                        //初始化 WXImageObject 和 WXMediaMessage 对象
                        WXImageObject imgObj = new WXImageObject(bmp);
                        WXMediaMessage msg = new WXMediaMessage();
                        msg.mediaObject = imgObj;

                        //设置缩略图
                        Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 100, 100, true);
                        bmp.recycle();
                        msg.thumbData = Util.bmpToByteArray(thumbBmp, true);

                        //构造一个Req
                        SendMessageToWX.Req req = new SendMessageToWX.Req();
                        req.transaction = buildTransaction("img");
                        req.message = msg;
                        //根据type设置分享情景
                        switch (type) {
    
    
                            case TYPE_WECHAT:
                                //分享到微信好友
                                req.scene = SendMessageToWX.Req.WXSceneSession;
                                break;
                            case TYPE_WECHAT_MOMENT:
                                //分享到微信朋友圈
                                req.scene = SendMessageToWX.Req.WXSceneTimeline;
                                break;
                        }
                        //调用api接口,发送数据到微信
                        wxapi.sendReq(req);
                    } catch (Exception e) {
    
    
                        e.printStackTrace();
                    }
                }
            }).start();

        } else {
    
    
            ToastUtil.show("请先安装微信客户端");
        }
    }


    /**
     * 分享单张图片到QQ好友
     *
     * @param context conrtext
     * @param picFile 要分享的图片文件
     */
    public static void sharePictureToQQFriend(Activity context, String picFile, String type) {
    
    
        Log.v(TAG, "type==" + type);
        Tencent tencent = Tencent.createInstance(QQ开放平台上的id, context.getApplicationContext());
        if (isAvilible(context, PACKAGE_MOBILE_QQ)) {
    
    
            if (type.equals("QQ")) {
    
    
            //分享至QQ好友
                Bundle params = new Bundle();
                params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
                params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, picFile);// 图片地址
                params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE);
                tencent.shareToQQ(context, params, new ShareUiListener());
            } else {
    
    
            //分享至QQ空间
                Bundle params = new Bundle();
                params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
                params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, picFile);// 图片地址
                params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
                tencent.shareToQQ(context, params, new ShareUiListener());
            }

        } else {
    
    
            ToastUtil.show("请先安装QQ客户端");
        }
    }

    /**
     * 检查手机上是否安装了指定的软件
     *
     * @param context
     * @param packageName:应用包名
     * @return
     */
    public static boolean isAvilible(Context context, String packageName) {
    
    
        //获取packagemanager
        final PackageManager packageManager = context.getPackageManager();
        //获取所有已安装程序的包信息
        List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
        //用于存储所有已安装程序的包名
        List<String> packageNames = new ArrayList<String>();
        //从pinfo中将包名字逐一取出,压入pName list中
        if (packageInfos != null) {
    
    
            for (int i = 0; i < packageInfos.size(); i++) {
    
    
                String packName = packageInfos.get(i).packageName;
                packageNames.add(packName);
            }
        }
        //判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
        return packageNames.contains(packageName);
    }

    static class ShareUiListener implements IUiListener {
    
    

        @Override
        public void onComplete(Object response) {
    
    
            ToastUtil.show("分享成功");

        }

        @Override
        public void onError(UiError uiError) {
    
    
            //分享失败
            Log.v(TAG, "----uiErrorsss-----" + uiError.errorCode);
            ToastUtil.show("分享失败");
        }

        @Override
        public void onCancel() {
    
    
            //分享取消
            Log.v(TAG, "----onCancelsss-----");
            ToastUtil.show("分享取消");
        }
    }

    /**
     * 构建一个唯一标志
     *
     * @param type 分享的类型分字符串
     * @return 返回唯一字符串
     */
    private static String buildTransaction(String type) {
    
    
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }
}

3:QQ分享单张图片不能使用网络图片,所以要先保存到本地再获取本地图片分享至QQ及空间

/**
 * date:2020/9/26 0026
 * author:wsm (Administrator)
 * funcation:保存图片至相册
 */
public class SaveNetPhotoUtils {
    
    
    public static final String TAG = "SaveNetPhotoUtils";

    private static Activity contexts;
    private static String photoUrls;
    private static Bitmap bitmap;
    private static String mSaveMessage = "failed";
    private static File mMyCaptureFile;
    private static String mType;

    /**
     * 保存图片,无须自定义名字
     *
     * @param context
     * @param photoUrl
     */
    public static void savePhoto(Activity context, String photoUrl, String types) {
    
    
        contexts = context;
        photoUrls = photoUrl;
        mType = types;
        new Thread(saveFileRunnable).start();
    }

    private static Runnable saveFileRunnable = new Runnable() {
    
    
        @Override
        public void run() {
    
    
            try {
    
    
                if (!TextUtils.isEmpty(photoUrls)) {
    
    
                    URL url = new URL(photoUrls);
                    InputStream inputStream = url.openStream();
                    bitmap = BitmapFactory.decodeStream(inputStream);
                    inputStream.close();
                }
                saveFile(bitmap);
                mSaveMessage = "success";
            } catch (IOException e) {
    
    
                mSaveMessage = "failed";
                e.printStackTrace();
            } catch (Exception e) {
    
    
                e.printStackTrace();
            }
            messageHandler.sendMessage(messageHandler.obtainMessage());
        }
    };

    /**
     * 保存成功和失败通知
     */
    @SuppressLint("HandlerLeak")
    private static Handler messageHandler = new Handler() {
    
    
        @Override
        public void handleMessage(Message msg) {
    
    
            Log.v(TAG, "mSaveMessage==" + mSaveMessage + "file==" + mMyCaptureFile.getAbsolutePath());
            if (mSaveMessage.equals("success")) {
    
    
                ShareImageUtils.sharePictureToQQFriend(contexts, mMyCaptureFile.getAbsolutePath(), mType);
            } else {
    
    
                ToastUtil.show("分享失败");
            }
        }
    };

    /**
     * 保存图片
     *
     * @param bm
     * @throws IOException
     */
    public static void saveFile(Bitmap bm) throws IOException {
    
    
        File dirFile = new File(Environment.getExternalStorageDirectory().getPath());
        if (!dirFile.exists()) {
    
    
            dirFile.mkdir();
        }

        //图片命名
        String fileName = UUID.randomUUID().toString() + ".jpg";
        mMyCaptureFile = new File(Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + fileName);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(mMyCaptureFile));
        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
        bos.flush();
        bos.close();

        //广播通知相册有图片更新
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri uri = Uri.fromFile(mMyCaptureFile);
        intent.setData(uri);
        contexts.sendBroadcast(intent);
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43117800/article/details/109000900