1. 程式人生 > >Android呼叫sharesdk過程及問題

Android呼叫sharesdk過程及問題

具體配置方法詳見官網,我這邊使用的離線配置,即沒有使用gradle進行配置,這裡偷偷懶,不詳細記錄

詳細步驟

步驟為粗略步驟,詳細步驟參照此處
1. 在官網根據自己要分享的平臺下載相關的jar包
2. 將下載的jar包放在自己目錄的lib資料夾下並在專案中引用
3. 使用它提供的指導檔案生成相關檔案,並根據readme將各個檔案放在各自對應的路徑下
4. 在manifests檔案下申請相關許可權

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name
="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  1. 在application標籤中新增以下內容
<activity
     android:name="com.mob.tools.MobUIShell"
     android:theme="@android:style/Theme.Translucent.NoTitleBar"
     android:configChanges="keyboardHidden|orientation|screenSize"
     android:windowSoftInputMode="stateHidden|adjustResize" >

    <!-- 呼叫新浪原生SDK,需要註冊的回撥activity -->
    <intent-filter>
        <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

    <!--整合line客戶端登入授權,需要添如下格式的過濾器-->
    <intent-filter> 
    <data android:scheme="line.1477692153" />
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

<!-- ShareSDK<strong>3.1.0版本之前</strong>才需要在MobUIShell下面註冊此意圖,3.1.0版本之後(包含3.1.0)不需要註冊此intent-->
 <intent-filter>
 <data android:scheme="tencent100371282" /> 
<action android:name="android.intent.action.VIEW" /> 
<category android:name="android.intent.category.BROWSABLE" />
 <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity>
<!-- 填寫您從Mob開發者後臺中得到的Appkey和AppSecret -->
<meta-data android:name="Mob-AppKey" android:value="您的AppKey"/>
<meta-data android:name="Mob-AppSecret" android:value="您的AppSecret"/>

其中Mob-AppKey與Mob-AppSecret是自己申請時後臺分配的,根據後臺資料如實替換即可
6. 在assets資料夾的ShareSDK.xml檔案下,填寫每個平臺需要的引數,例如

 <Wechat
        Id="4"
        SortId="4"
        AppId="xxx"
        AppSecret="xxx"
    userName="xxx"
    path="pages/index/index.html?id=1"
        BypassApproval="true"
        Enable="true" />

每個欄位的意思詳見上面連結的官網教程
7. 啟動分享
在需要彈出分享頁面進行分享的頁面,新增以下方法

private void showShare() {
     OnekeyShare oks = new OnekeyShare();
     //關閉sso授權
     oks.disableSSOWhenAuthorize(); 

    // 分享時Notification的圖示和文字  2.5.9以後的版本不     呼叫此方法
     //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
     // title標題,印象筆記、郵箱、資訊、微信、人人網和QQ空間使用
     oks.setTitle(getString(R.string.share));
     // titleUrl是標題的網路連結,僅在人人網和QQ空間使用
     oks.setTitleUrl("http://sharesdk.cn");
     // text是分享文字,所有平臺都需要這個欄位
     oks.setText("我是分享文字");
     // imagePath是圖片的本地路徑,Linked-In以外的平臺都支援此引數
     oks.setImagePath("/sdcard/test.jpg");//確保SDcard下面存在此張圖片
     // url僅在微信(包括好友和朋友圈)中使用
     oks.setUrl("http://sharesdk.cn");
     // comment是我對這條分享的評論,僅在人人網和QQ空間使用
     oks.setComment("我是測試評論文字");
     // site是分享此內容的網站名稱,僅在QQ空間使用
     oks.setSite(getString(R.string.app_name));
     // siteUrl是分享此內容的網站地址,僅在QQ空間使用
     oks.setSiteUrl("http://sharesdk.cn");

    // 啟動分享GUI
    oks.show(this);
}

分享朋友圈時,可以分享網路圖片或本機圖片,本機圖片需要設定 oks.setImagePath(“/sdcard/test.jpg”),網路圖片需要設定 oks.setImageUrl(url);//url即為網路圖片連結。

  1. 分享回撥
    有時候我們要做活動,分享成功後贈送優惠券,這時候我們可以設定相關回調
oks.setCallback(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {

            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {

            }

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

            }
        });

可以看到,這裡面定義了三個方法
+ onComplete,分享成功的回撥,可以在這裡呼叫介面,贈送優惠券等
+ onError,分享發生錯誤的回撥
+ onCancel,分享取消的回撥
我們一般關注第一個onComplete就行

至此,完整的分享過程已經全部結束,可以歡快的進行相關平臺的分享了

分享問題與解決

  1. 分享完成後選擇留在微信,分享回撥失效
    此問題暫時無解……真的- -官方論壇也說沒有解決辦法……
    所以取巧的解決辦法是,在使用者呼叫分享的時候就呼叫介面發放優惠券,缺點是可能會造成假分享

  2. 在安卓6.0以上的系統分享介面打不開

本來以為是部分手機問題,借了很多手機發現都有這個問題,於是想到了動態許可權問題,可是不知道是什麼許可權,直到在文件裡發現了這段話

微信並無實際的分享網路圖片和分享bitmap的功能,如果設定了網路圖片,此圖片會先下載會本地,之後再當作本地圖片分享,因此延遲較大。bitmap則好一些,但是由於bitmap並不知道圖片的格式,因此都會被當作png編碼,再提交微信客戶端。此外,SHARE_EMOJI支援gif檔案,但是如果使用imageData,則預設只是提交一個png圖片,因為bitmap是靜態圖片。

sharesdk會將網路圖片或者圖片都下載到本地,所以我們這邊必須申請儲存許可權。
在申請完儲存許可權後分享,成功!問題解決