1. 程式人生 > >ShareSDK自定義介面的分享及分享中注意問題整理

ShareSDK自定義介面的分享及分享中注意問題整理

分享功能在app開發中算是一個常見功能,使用友盟的一鍵分享使用起來非常方便。但是實際專案可能會根據需求使用自定義介面的分享。在此做一個記錄分享,也把遇到的問題整理出來。

前面的整合過程就不贅述了,根據官方文件一步步來就可以搞定。編寫思路就是將功能封裝在一個dialogfragment裡面。在需要的地方直接呼叫就可以了。直接是上程式碼,大部分都有註釋。效果如下圖,介面大家可以隨意編寫,主要是介紹分享方法。
這裡寫圖片描述

public class ShareFrag extends DialogFragment {

PlatformActionListener platformActionListener = new PlatformActionListener() {
    @Override
    public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
        ShareFrag.this.getDialog().dismiss();
        //大部分的回撥方法都處於網路執行緒,因此可以簡單預設為回撥方法都不在主執行緒.
        getActivity().runOnUiThread(new Runnable() {
            @Override
         public void run() {     
           Toast.makeText(getActivity(), "分享成功!",Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public void onError(Platform platform, int i, Throwable throwable) {
        Log.e("TAG", throwable.getMessage());
    }

    @Override
    public void onCancel(Platform platform, int i) {
    }
};

private View rootView;
private ShareWebBean webBean;
private String url;
 private View.OnClickListener SHARE_LISTENER = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.layout_share_wechat: {
                Wechat.ShareParams sp = new Wechat.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE);//非常重要:一定要設定分享屬性
                sp.setTitle(webBean.getCfg().getShareTitle()); //分享標題
                sp.setText(webBean.getCfg().getShareContent()+webBean.getCfg().getShareTitle());   //分享文字
                sp.setImageUrl(webBean.getCfg().getShareIcon());
                sp.setUrl(url);   //網友點進連結後,可以看到分享的詳情
                Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
                wechat.setPlatformActionListener(platformActionListener); // 設定分享事件回撥
                // 執行分享
                wechat.share(sp);
                break;
            }
            case R.id.layout_share_moments: {
                WechatMoments.ShareParams sp = new WechatMoments.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要設定分享屬性

                sp.setTitle(webBean.getCfg().getShareTitle());  //分享標題
                sp.setText(webBean.getCfg().getShareContent()+webBean.getCfg().getShareTitle());   //分享文字
                sp.setUrl(url);   //網友點進連結後,可以看到分享的詳情
                sp.setImageUrl(webBean.getCfg().getShareIcon());
//

                //3、非常重要:獲取平臺物件
                Platform wechatMoments = ShareSDK.getPlatform(WechatMoments.NAME);
                wechatMoments.setPlatformActionListener(platformActionListener); // 設定分享事件回撥
                // 執行分享
                wechatMoments.share(sp);
                break;
            }
            case R.id.layout_share_weibo: {
                SinaWeibo.ShareParams sp = new SinaWeibo.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要設定分享屬性
                sp.setText(webBean.getCfg().getShareContent() + url); //分享文字
                sp.setTitle(webBean.getCfg().getShareTitle());
//                    sp.setImagePath(img);//本地圖片rul
                //   sp.setImageUrl(imagePath);
                //3、非常重要:獲取平臺物件
                Platform sinaWeibo = ShareSDK.getPlatform(SinaWeibo.NAME);
                sinaWeibo.setPlatformActionListener(platformActionListener); // 設定分享事件回撥
                sinaWeibo.SSOSetting(false);//false是使用客戶端授權
                // 執行分享
                sinaWeibo.share(sp);
                break;
            }
            case R.id.layout_share_qq: {
                QQ.ShareParams sp = new QQ.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要設定分享屬性
                sp.setTitle(webBean.getCfg().getShareTitle());
                sp.setText(webBean.getCfg().getShareContent()+webBean.getCfg().getShareTitle());
                sp.setImageUrl(webBean.getCfg().getShareIcon());
                sp.setTitleUrl(url);  //網友點進連結後,可以看到分享的詳情
                //3、非常重要:獲取平臺物件
                Platform qq = ShareSDK.getPlatform(QQ.NAME);
                qq.setPlatformActionListener(platformActionListener); // 設定分享事件回撥
                // 執行分享
                qq.share(sp);
                break;
            }
            case R.id.layout_share_zone: {
                QZone.ShareParams sp = new QZone.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要設定分享屬性
                sp.setTitle(webBean.getCfg().getShareTitle());
                sp.setText(webBean.getCfg().getShareContent()+webBean.getCfg().getShareTitle());
                //              sp.setImagePath(urlWithHttp);
                sp.setImageUrl(webBean.getCfg().getShareIcon());
                sp.setTitleUrl(url);
                Platform qzone = ShareSDK.getPlatform(QZone.NAME);
                qzone.setPlatformActionListener(platformActionListener); // 設定分享事件回撥
                // 執行圖文分享
                qzone.share(sp);
                break;
            }
            case R.id.layout_share_collect: {
                WechatFavorite.ShareParams sp = new WechatFavorite.ShareParams();
                sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要設定分享屬性
                sp.setTitle(webBean.getCfg().getShareTitle());
                sp.setText(webBean.getCfg().getShareContent());
                //   sp.setImagePath(imagePath);
                sp.setImageUrl(webBean.getCfg().getShareIcon());
                sp.setUrl(url);
                Platform wechatFavorite = ShareSDK.getPlatform(WechatFavorite.NAME);
                wechatFavorite.setPlatformActionListener(platformActionListener);
                wechatFavorite.share(sp);
                break;
            }
        }
    }
};
public ShareFrag() {
    // Required empty public constructor

}
    @Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (rootView == null) {
        LayoutInflater inflater = LayoutInflater.from(activity);
        rootView = inflater.inflate(R.layout.fragment_share_dqg, null, false);
        RelativeLayout cancel = (RelativeLayout) rootView.findViewById(R.id.fragment_share_cancel);

        RelativeLayout layoutShareWechat = (RelativeLayout) rootView.findViewById(R.id.layout_share_wechat);
        RelativeLayout layoutShareQq = (RelativeLayout) rootView.findViewById(R.id.layout_share_qq);
        RelativeLayout layoutShareWeibo = (RelativeLayout) rootView.findViewById(R.id.layout_share_weibo);
        RelativeLayout layoutShareZone = (RelativeLayout) rootView.findViewById(R.id.layout_share_zone);
        RelativeLayout layoutShareMoments = (RelativeLayout)rootView.findViewById(R.id.layout_share_moments);
        RelativeLayout layoutShareCollect = (RelativeLayout)rootView.findViewById(R.id.layout_share_collect);

        layoutShareQq.setOnClickListener(SHARE_LISTENER);
        layoutShareWechat.setOnClickListener(SHARE_LISTENER);
        layoutShareWeibo.setOnClickListener(SHARE_LISTENER);
        layoutShareZone.setOnClickListener(SHARE_LISTENER);
        layoutShareMoments.setOnClickListener(SHARE_LISTENER);
        layoutShareCollect.setOnClickListener(SHARE_LISTENER);

        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }
    ShareSDK.initSDK(activity);
}

@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    Window window = dialog.getWindow();
    dialog.setCanceledOnTouchOutside(true);
    DisplayMetrics dm = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
    window.setLayout(dm.widthPixels, ViewGroup.LayoutParams.WRAP_CONTENT);
    window.setGravity(Gravity.BOTTOM);
    window.setWindowAnimations(R.style.BottomDialogStyle);
    //設定背景透明,不設定dialog可能會出現黑邊
    window.setBackgroundDrawable(ContextCompat.getDrawable(getActivity(), R.color.transparent));
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
    return rootView;
}

@Override
public void onDestroy() {
    super.onDestroy();
    ((ViewGroup) (rootView.getParent())).removeView(rootView);
}

//設定資料,這個方法引數根據實際需要修改
public void setData(ShareWebBean shareWebBean,String uid) {
    this.webBean = shareWebBean;
//        myApplication = (qiantuhaoApplication) getActivity().getApplication();
    url = shareWebBean.getCfg().getShareUrl() + "?tjr=" + uid;
}
}

使用時候呼叫

    FragmentManager fm = getSupportFragmentManager();
    ShareFrag shareFrag = new ShareFrag();
    shareFrag.show(fm, null);
    shareFrag.setData(webBean,myApplication.getUid());//設定分享內容,這個方法可以根據各自需求傳入不同資料進行處理。

問題整理:

微博:

  1. 分享網路圖片要去微博開發者賬號申請高階寫入介面否則直接分享網路圖片會報錯。
  2. 分享直接呼叫微部落格戶端開始幾次可能會出現失敗,這個問題並不是我們問題,諮詢友盟客服他們反映這個問題是微博那邊問題這個bug存在了好幾個版本。
  3. 分享網路圖片時不能用https的連結,否則會爆出無法解析的錯誤,這個問題當時查了很久。。。其他分享圖片最好也不要用https的連結。

qq空間:

  1. QQ空間要想使用qq客戶端分享需要在ShareSDK.xml配置檔案中將ShareByAppClient="true" 怎樣直接呼叫QQ空間客戶端進行分享官方文件裡面好像沒有說明。有知道的希望可以告知一下共同學習。

微信相關:

  1. 微信分享比較特殊的地方就是需要在開發者平臺配置app的簽名。在手機上下載好app,然後使用簽名檢視工具(微博等開發者平臺上都有)就能知道app簽名。
  2. 微信的相關分享需要安裝微信客戶端才行,測試時候要打出正式包執行在真機上。一般微信出現的問題都與簽名有關係需要特別注意。
  3. 如果不想打正式包測試,可以在ShareSDK.xml配置檔案中 BypassApproval="true"BypassApproval是繞過稽核的標記,設定為true後AppId將被忽略,故不經過稽核的應用也可以執行分享,但是僅限於分享文字和圖片,不能分享其他型別,預設值為false。此外,微信收藏不支援此欄位。
  4. 在華為等一些android系統版本比較高的手機上,有可能出現調不起微信客戶端的情況,諮詢了客服以後。瞭解到微信本身是不支援網路圖片分享的,我們在程式碼裡設定的圖片連結微信在呼叫的時候會去載入本地快取的檔案。在手機許可權較高的情況下微信讀取不到快取的圖片,就會發生調起失敗的情況。解決辦法就是直接寫一個圖片下載工具類。將網路圖片下載到本地,直接載入本地圖片。此方式可以解決大部分因為圖片產生的分享失敗的問題。

可能出問題的地方:

  1. 各個平臺分享需要的欄位有細微差別,有的缺少一個欄位就會分享不成功或者無法調起分享介面。可以按照上面分享屬性進行配置,而且分享的欄位不要為空。
  2. sp.setImagePath(img);設定本地圖片後再設定網路圖片會以本地為準,網路圖片會不生效。
  3. 分享回撥資訊可能不在主執行緒,不要在分享回撥中進行處理UI的操作。

以後還有問題會繼續補充。。。