分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 +
'}';
}
}
}
后面我使用 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获取的路径就是上面的那个地址,发现微信没登录时,是获取不到分享路径的,但是很奇怪的是微信登录成功之后,就可以访问了,这是为什么?