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