收藏
回答

安卓使用系统分享时,在微信未登录时,跳转到分享页面,结果登录微信之后,分享失败?

分2种情况:

1、微信未登录时,我们分享图片出去,结果跳转到登录页面,登录完成后,分享的图片失败

2、微信登录后,我们分享图片出去,结果跳转到分享朋友圈页面,分享成功

思考:

1、我们之前遇到过 当 intent.setType("*/*")时,分享是不能成功的,所以我们是用的是 intent.setType("image/*");进行分享图片

2、微信未登录时,我们去分享的时候,微信做了一个页面跳转的操作,是否是 使用了 intent.setType("*/*");这样的类型进行接收导致的?

具体的我这边录制了视频,您可以加我微信,给你看看 微信号:xqp20141005

然后我想了一下,使用ContentResolver的Uri 替换FileProvider获取到的Uri,不知道可不可以,求大佬解答一下:

package com.linyun.logodesign.utils;


import android.content.Context;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;


import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.SPUtils;
import com.google.gson.reflect.TypeToken;


import java.util.HashMap;
import java.util.List;
import java.util.Set;


/**
 * 微信分享的bug修复
 * {@url https://developers.weixin.qq.com/community/develop/doc/00042600688a4001867ba7e2051400 }
 * 问题描述:针对微信未登录状态时,分享微信和朋友圈失败问题的解决
 */
public class WxShareBugFixUtils {
    private static HashMap<String, ShareBean> shareBean = new HashMap<>();


    interface Key {
        String SHARE_BEAN_STR = "share_bean_str";
    }


    public static void init(Context context) {
        if (context == null) return;
        if (shareBean == null) {
            String jsonString = SPUtils.getInstance("bugfix", Context.MODE_PRIVATE).getString(Key.SHARE_BEAN_STR);
            if (TextUtils.isEmpty(jsonString)) {
                return;
            }
            List<ShareBean> shareBeanList = GsonUtils.fromJson(jsonString, new TypeToken<List<ShareBean>>() {
            }.getType());
            if (!putShareBeans(shareBeanList)) {
                LogUtils.e("shareBean 加载失败");
            }
        }
    }


    public static void onDestroy() {
        SPUtils.getInstance("bugfix", Context.MODE_PRIVATE).put(Key.SHARE_BEAN_STR, GsonUtils.toJson(shareBean));
    }




    public static ShareBean getShareBean(String shareUriString) {
        Set<String> strings = shareBean.keySet();
        LogUtils.e(shareUriString);
        LogUtils.e(strings);
        if (shareBean == null) return null;
        return shareBean.get(shareUriString);
    }


    public static boolean putShareBeans(List<ShareBean> beans) {
        if (beans == null) return false;
        for (ShareBean bean : beans) {
            if (!putShareBean(bean)) {
                return false;
            }
        }
        return true;
    }


    public static boolean putShareBean(ShareBean bean) {
        if (shareBean == null || bean == null) return false;
        try {
            shareBean.put(bean.getShareUriString(), bean);
            return true;
        } catch (Exception e) {
            return false;
        }
    }


    public static Uri getRealUri(Uri imageUri) {
        LogUtils.e(imageUri.toString());
        WxShareBugFixUtils.ShareBean shareBean = WxShareBugFixUtils.getShareBean(imageUri.toString());
        LogUtils.e(shareBean);
        Uri realUri;
        if (shareBean != null && !TextUtils.isEmpty(shareBean.getUriString())) {
            String uriString = shareBean.getUriString();
            realUri = Uri.parse(uriString);
        } else {
            realUri = imageUri;
        }
        return realUri;
    }




    public static class ShareBean implements Parcelable {
        private String UriString; //Uri字符串
        private String ShareUriString; //通常用来分享的Uri字符串,也当作key使用
        private boolean isUriStringIsValid = true; //是否Uri是有效的




        public ShareBean() {
        }


        public ShareBean(String uriString) {
            UriString = uriString;
        }


        public ShareBean(String uriString, String shareUriString) {
            UriString = uriString;
            ShareUriString = shareUriString;
        }


        public ShareBean(String uriString, String shareUriString, boolean isUriStringIsValid) {
            UriString = uriString;
            ShareUriString = shareUriString;
            this.isUriStringIsValid = isUriStringIsValid;
        }


        public ShareBean(String uriString, boolean isUriStringIsValid) {
            UriString = uriString;
            this.isUriStringIsValid = isUriStringIsValid;
        }


        public String getUriString() {
            return UriString;
        }


        public void setUriString(String uriString) {
            UriString = uriString;
        }


        public boolean isUriStringIsValid() {
            return isUriStringIsValid;
        }


        public void setUriStringIsValid(boolean uriStringIsValid) {
            isUriStringIsValid = uriStringIsValid;
        }


        public String getShareUriString() {
            return ShareUriString;
        }


        public void setShareUriString(String shareUriString) {
            ShareUriString = shareUriString;
        }


        @Override
        public String toString() {
            return "ShareBean{" +
                    "UriString='" + UriString + '\'' +
                    ", ShareUriString='" + ShareUriString + '\'' +
                    ", isUriStringIsValid=" + isUriStringIsValid +
                    '}';
        }

    }
}




最后一次编辑于  2020-12-29
回答关注问题邀请回答
收藏

1 个回答

  • kevin
    kevin
    2020-12-28

    后面我使用  uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);获取到的数据就是上面这个路径,发现微信那边居然可以登录后直接分享了
    


    getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
    
    Uri uri;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        uri = FileProvider.getUriForFile(this, "com.***.*****.fileprovider", finalImageFile);
    } else {
        uri = Uri.fromFile(finalImageFile);
    }
    我使用这个uri获取的路径就是上面的那个地址,发现微信没登录时,是获取不到分享路径的,但是很奇怪的是微信登录成功之后,就可以访问了,这是为什么?
    
    2020-12-28
    有用
    回复
登录 后发表内容
问题标签