android專案整合極光分享
說明:android一鍵分享微信和QQ等可以使用極光分享和友盟分享,由於極光主打遠端推送所以選擇了極光分享
一、整合準備
1、下載官網的Android版分享SDK 地址:https://www.jiguang.cn/share解壓檢視原始碼
2、在各個開放平臺註冊賬號,建立專案App申請自己的AppID和AppSecret(demo中的微信key無法複製使用必須自己申請才能使用)
3、以微信為例:
微信開放平臺地址: https://open.weixin.qq.com/
1)註冊
2)建立移動應用
3)填寫基本資訊
說明:應用官網不知道怎麼填的可以留言
4)填寫平臺資訊
勾選android應用
說明:應用簽名是去androidstudio生成的MD5去掉分號:
a)使用開發工具建立正式的簽名證書
b)使用命令keytool -list -v -keystore 數字證書名稱.jks(簽名的祕鑰)
c)複製出來MD5刪除分號即可
5)等待3~7個工作日即可稽核通過
二、極光SDK整合
1、在App的build.gradle中配置
android { ...... defaultConfig { applicationId "com.xxx.xxx" //極光控制檯建立應用時填寫的應用包名. ...... ndk { //選擇要新增的對應cpu型別的.so庫。 abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a' // 還可以新增 'x86', 'x86_64', 'mips', 'mips64' } manifestPlaceholders = [ JSHARE_PKGNAME : applicationId, JPUSH_APPKEY : "你的appkey", //極光控制檯建立應用得到的AppKey. JPUSH_CHANNEL : "developer-default", //暫時填寫預設值即可. TENCENT_APPID: "QQ開發者應用的appID",//騰訊開放平臺註冊應用得到的appId FACEBOOK_APPID: "facebook開發者應用的appID",//facebook註冊應用得到的appId ] ...... } ...... } dependencies { ...... compile 'cn.jiguang.sdk:jshare:1.6.0' // 此處以JShare 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-qqmodel:1.6.0' // 此處以jshare-qqmodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-wechatmodel:1.6.0' // 此處以jshare-wechatmodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-sinamodel:1.6.0' // 此處以jshare-sinamodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-facebookmodel:1.6.0' // 此處以jshare-facebookmodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-twittermodel:1.6.0' // 此處以jshare-twittermodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jshare-jchatpromodel:1.6.0' // 此處以jshare-twittermodel 1.6.0 版本為例,具體版本請參考壓縮包libs的jar包版本。 compile 'cn.jiguang.sdk:jcore:1.2.3' // 此處以JCore 1.2.3版本為例,具體版本請參考壓縮包libs的jar包版本。 ...... }
注 : 如果在新增以上 abiFilter 配置之後android Studio出現以下提示:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
則在 Project 根目錄的gradle.properties檔案中新增:
android.useDeprecatedNdk=true
2、配置AndroidManifest.xml
根據 SDK 壓縮包裡的 AndroidManifest.xml 樣例檔案,來配置應用程式專案的 AndroidManifest.xml 。
- 複製備註為 "Required" 的部分
- 將標註為“您應用的包名”的部分,替換為當前應用程式的包
- 將標註為“您應用的Appkey”的部分,替換為在Portal上註冊該應用的的Key,例如: 9fed5bcb7b9b87413678c407
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="130"
android:versionName="1.3.0"
package="您應用的包名">
<!-- Required -->
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional. Required for location feature -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SelectPlatActivity"/>
<activity android:name=".ShareTypeActivity"/>
<!-- Required SDK核心功能-->
<activity
android:name="cn.jiguang.share.android.ui.JiguangShellActivity"
android:exported="true"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize">
<!-- Optional QQ分享回撥-->
<!-- scheme為“tencent”字首再加上QQ開發者應用的appID;例如appID為123456,則scheme=“tencent123456” -->
<intent-filter>
<data android:scheme="tencent+appID" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Optional 新浪微博分享回撥 -->
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Optional 新浪微博私信回撥-->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="jsharesdk" android:host="sinaweibo"/>
</intent-filter>
</activity>
<!-- Optional 微信分享回撥,wxapi必須在包名路徑下,否則回撥不成功-->
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true" />
<!-- Required. For publish channel feature -->
<!-- JPUSH_CHANNEL 是為了方便開發者統計APK分發渠道。-->
<!-- 例如: -->
<!-- 發到 Google Play 的APK可以設定為 google-play; -->
<!-- 發到其他市場的 APK 可以設定為 xxx-market。 -->
<!-- 目前這個渠道統計功能的報表還未開放。-->
<meta-data
android:name="JPUSH_CHANNEL"
android:value="developer-default" />
<!-- Required. AppKey copied from Portal -->
<meta-data
android:name="JPUSH_APPKEY"
android:value="您應用的Appkey" />
</application>
</manifest>
3、配置第三方平臺資訊
1.5.0版本開始支援兩種方式配置第三方平臺資訊:1、配置JGShareSDK.xml;2、在程式碼中設定。開發者應選擇其中一種方式,1.5.0之前版本只支援配置JGShareSDK.xml的方式。(建議選擇第一種)
無論是使用自動整合還是手動整合方式,都需要配置JGShareSDK.xml。 主要步驟為:
- 複製或者新建JGShareSDK.xml到工程目錄的asset目錄下。
- 把JGShareSDK.xml中相關的AppKey、AppSecret替換成自己在第三方平臺建立的應用得到的資訊。
- 根據需要配置各個平臺,不需要的平臺可以刪除。
<?xml version="1.0" encoding="utf-8"?>
<DevInfor>
<!-- 如果不需要支援某平臺,可預設該平臺的配置-->
<SinaWeibo
AppKey="新浪微博的AppKey"
AppSecret="新浪微博ppSecret"
RedirectUrl="微博開放平臺填寫的授權回撥頁"/>
<QQ
AppId="QQ 的 AppId"
AppKey="QQ 的 AppKey"/>
<Wechat
AppId="微信的 AppId"
AppSecret=" 微信的 AppSectet"/>
<Facebook
AppId="facebook 的 appId"
AppName="facebook 後臺填寫的名稱"
/>
<Twitter
ConsumerKey="twitter 的 ConsumerKey"
ConsumerSecret="twitter 的 ConsumerSecret"
/>
<!-- 趣聊平臺appkey的申請, 請檢視入門指南的第三方平臺申請文件 -->
<JChatPro
auth="申請後的 appkey"
/>
</DevInfor>
4、配置微信平臺回撥
- 在你的包名相應目錄下新建一個wxapi目錄,並在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自WeChatHandleActivity(例如應用程式的包名為cn.jiguang.share.demo,則新新增的類如下圖所示)
/**
* 微信客戶端回撥activity示例
*/
public class WXEntryActivity extends WeChatHandleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
}
- 並在manifest檔案裡面加上exported屬性,設定為true,例如:
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true" />
5、配置專案簽名
androidstudio圖形介面簽名配置
6、配置混淆
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep public class com.sina.** {
*;
}
7、SDK的API各個引數說明
連結地址:https://docs.jiguang.cn/jshare/client/Android/android_api/
8、在Application中進行初始化
/**
* 極光分享
*/
JShareInterface.setDebugMode(true);
PlatformConfig platformConfig = new PlatformConfig()
.setWechat("申請的AppID", "申請的APPSecret")
.setQQ("1106011004", "YIbPvONmBQBZUGaN");
// .setSinaWeibo("374535501", "baccd12c166f1df96736b51ffbf600a2", "https://www.jiguang.cn");
// .setFacebook("1847959632183996", "JShareDemo")
// .setTwitter("eRJyErWUhRZVqBzADAbUnNWx5", "Oo7DJMiBwBHGFWglFrML1ULZCUDlH990RlJlQDdfepm3lToiMC");
JShareInterface.init(this, platformConfig);
Activity中的程式碼
private ShareBoard mShareBoard;
//顯示底部圖示
private int mAction = Platform.ACTION_SHARE;
private ShareBoard mShareBoard;
private ProgressDialog progressDialog;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String toastMsg = (String) msg.obj;
Toast.makeText(MainActivity.this, toastMsg, Toast.LENGTH_SHORT).show();
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
};
/**
* 展示底部欄
*/
private void showBroadView() {
if (mShareBoard == null) {
mShareBoard = new ShareBoard(this);
List<String> platforms = JShareInterface.getPlatformList();
platforms.remove(2);
if (platforms != null) {
for (Object temp : platforms) {
SnsPlatform snsPlatform = createSnsPlatform(String.valueOf(temp));
//把資料新增到顯示板
mShareBoard.addPlatform(snsPlatform);
}
}
/**
* 顯示板設定點選事件
*/
mShareBoard.setShareboardclickCallback(mShareBoardlistener);
}
//展示
mShareBoard.show();
}
/**
* 點選事件監聽
*/
private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() {
@Override
public void onclick(SnsPlatform snsPlatform, String platform) {
switch (mAction) {
case Platform.ACTION_SHARE:
// progressDialog.show();
//這裡以分享連結為例
ShareParams shareParams = new ShareParams();
shareParams.setShareType(Platform.SHARE_WEBPAGE);//
shareParams.setTitle(ShareTypeActivity.share_title);//
shareParams.setText(ShareTypeActivity.share_text);//
shareParams.setShareType(Platform.SHARE_WEBPAGE);//
shareParams.setUrl(ShareTypeActivity.share_url);//
shareParams.setImagePath(MyApplication.ImagePath);//
JShareInterface.share(platform, shareParams, mShareListener);
break;
default:
break;
}
}
};
/**
* 分享監聽, 失敗,成功,取消
*/
private PlatActionListener mShareListener = new PlatActionListener() {
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> data) {
if (handler != null) {
Message message = handler.obtainMessage();
message.obj = "分享成功";
handler.sendMessage(message);
}
}
@Override
public void onError(Platform platform, int action, int errorCode, Throwable error) {
String TAG = "MainActivity";
Logger.e(TAG, "error:" + errorCode + ",msg:" + error);
if (handler != null) {
Message message = handler.obtainMessage();
message.obj = "分享失敗:" + error.getMessage() + "---" + errorCode;
handler.sendMessage(message);
}
}
@Override
public void onCancel(Platform platform, int action) {
if (handler != null) {
Message message = handler.obtainMessage();
message.obj = "分享取消";
handler.sendMessage(message);
}
}
};
/**
* 獲取圖示和文字
*
* @param platformName
* @return
*/
public static SnsPlatform createSnsPlatform(String platformName) {
String mShowWord = platformName;
String mIcon = "";
String mGrayIcon = "";
//微信
if (Wechat.Name.equals(platformName)) {
mIcon = "jiguang_socialize_wechat";
mGrayIcon = "jiguang_socialize_wechat";
mShowWord = "jiguang_socialize_text_weixin_key";
//微信朋友圈
} else if (WechatMoments.Name.equals(platformName)) {
mIcon = "jiguang_socialize_wxcircle";
mGrayIcon = "jiguang_socialize_wxcircle";
mShowWord = "jiguang_socialize_text_weixin_circle_key";
//微信收藏
} else if (WechatFavorite.Name.equals(platformName)) {
mIcon = "jiguang_socialize_wxfavorite";
mGrayIcon = "jiguang_socialize_wxfavorite";
mShowWord = "jiguang_socialize_text_weixin_favorite_key";
//QQ分享
} else if (QQ.Name.equals(platformName)) {
mIcon = "jiguang_socialize_qq";
mGrayIcon = "jiguang_socialize_qq";
mShowWord = "jiguang_socialize_text_qq_key";
//QQ空間分享
} else if (QZone.Name.equals(platformName)) {
mIcon = "jiguang_socialize_qzone";
mGrayIcon = "jiguang_socialize_qzone";
mShowWord = "jiguang_socialize_text_qq_zone_key";
}
return ShareBoard.createSnsPlatform(mShowWord, platformName, mIcon, mGrayIcon, 0);
}
以及ListItemView類
public class ListItemView extends RelativeLayout {
private static final String TAG="ListItemView";
public ListItemView(Context context) {
super(context);
}
public ListItemView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void init(String title){
TextView textView = new TextView(getContext());
textView.setText(title);
textView.setTextSize(18);
textView.setGravity(Gravity.CENTER);
RelativeLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
layoutParams.setMargins(10,10,0,10);
addView(textView,layoutParams);
TextView right = new TextView(getContext());
right.setText(">");
RelativeLayout.LayoutParams rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
rightParams.setMargins(0,0,10,0);
addView(right,rightParams);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),100);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
9、效果