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" />
- 在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即為網路圖片連結。
- 分享回撥
有時候我們要做活動,分享成功後贈送優惠券,這時候我們可以設定相關回調
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就行
至此,完整的分享過程已經全部結束,可以歡快的進行相關平臺的分享了
分享問題與解決
分享完成後選擇留在微信,分享回撥失效
此問題暫時無解……真的- -官方論壇也說沒有解決辦法……
所以取巧的解決辦法是,在使用者呼叫分享的時候就呼叫介面發放優惠券,缺點是可能會造成假分享在安卓6.0以上的系統分享介面打不開
本來以為是部分手機問題,借了很多手機發現都有這個問題,於是想到了動態許可權問題,可是不知道是什麼許可權,直到在文件裡發現了這段話
微信並無實際的分享網路圖片和分享bitmap的功能,如果設定了網路圖片,此圖片會先下載會本地,之後再當作本地圖片分享,因此延遲較大。bitmap則好一些,但是由於bitmap並不知道圖片的格式,因此都會被當作png編碼,再提交微信客戶端。此外,SHARE_EMOJI支援gif檔案,但是如果使用imageData,則預設只是提交一個png圖片,因為bitmap是靜態圖片。
sharesdk會將網路圖片或者圖片都下載到本地,所以我們這邊必須申請儲存許可權。
在申請完儲存許可權後分享,成功!問題解決