1. 程式人生 > >android專案整合極光分享

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、效果