1. 程式人生 > >Android中友盟第三方登入與分享自動整合的那些坑

Android中友盟第三方登入與分享自動整合的那些坑

自動整合的方式現在只支援微信,QQ,新浪三個平臺,如果需要使用其它平臺請選擇手動整合。

1:新增依賴
   

//友盟統計
compile 'com.umeng.sdk:common:1.5.1'
compile 'com.umeng.sdk:analytics:7.5.0'
//友盟社會化分享
compile 'com.umeng.sdk:share-core:6.9.1'
compile 'com.umeng.sdk:share-qq:6.9.1.1'
compile 'com.umeng.sdk:share-wechat:6.9.1'
compile 'com.umeng.sdk:share-sina:6.9.1'
//分享面板
compile 'com.umeng.sdk:shareboard-widget:6.9.1'


2:新增許可權
   

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />


3:在呼叫介面新增動態申請許可權:
    

if(Build.VERSION.SDK_INT>=23){
    String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS};
    ActivityCompat.requestPermissions(this,mPermissionList,123);
}


4:新增平臺相關配置
       (1)QQ相關配置:

在app級別 build.gradle中的 defaultConfig下新增manifestPlaceholders = [qqappid: "你的qq appid"]

//不配置會出現下面的錯誤

(2)微信相關配置:

在包名目錄下建立wxapi資料夾,新建一個名為WXEntryActivity的activity繼承WXCallbackActivity。裡面不用做操作。並在AndroidManifest中新增

<activity
    android:name=".wxapi.WXEntryActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:exported="true"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

5:在myapplication新增各平臺的第三方key以及在onCreate中初始化。

(第三方賬號申請地址http://dev.umeng.com/social/android/operation)

@Override
public void onCreate() {
    super.onCreate();
    UMConfigure.init(this,"你的應用在友盟上的APPKEY","umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
}
{
    //友盟相關平臺配置。注意友盟官方新文件中沒有這項配置,但是如果不配置會弔不起來相關平臺的授權介面
    PlatformConfig.setWeixin("你的微信APPID", "你的微信AppSecret");//微信APPID和AppSecret
    PlatformConfig.setQQZone("你的QQAPPID", "你的QQAppSecret");//QQAPPID和AppSecret
    PlatformConfig.setSinaWeibo("你的微博APPID", "你的微博APPSecret","微博的後臺配置回撥地址");//微博
}

6:在使用第三方登入介面中的程式碼:

mShareAPI = UMShareAPI.get(this);
mShareAPI.getPlatformInfo(this, SHARE_MEDIA.QQ, umAuthListener);//QQ登入
mShareAPI.deleteOauth(this, SHARE_MEDIA.QQ, umAuthListener);//撤銷QQ授權
umAuthListener = new UMAuthListener() {
            @Override
            public void onStart(SHARE_MEDIA platform) {}
            @Override
            public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
//                KLog.e("openid: " + data.get("uid"));
//                KLog.e("暱稱: " + data.get("name"));
//                KLog.e("頭像: " + data.get("iconurl"));
//                KLog.e("性別: " + data.get("gender"));
            }

            @Override
            public void onError(SHARE_MEDIA platform, int action, Throwable t) {

            }

            @Override
            public void onCancel(SHARE_MEDIA platform, int action) {
      }
        };
//在使用介面中要新增onActivityResult方法,否則授權回撥不成功,獲取不到第三方資訊(如果在fragment中使用第三方登入,則在依附的activity中重寫此方法)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}

7:在使用分享介面中的程式碼

        UMImage image = new UMImage(this, R.mipmap.logo);//分享圖示
                final UMWeb web = new UMWeb("你要分享的地址"); //切記切記 這裡分享的連結必須是http開頭
                web.setTitle("你要分享內容的標題");//標題
                web.setThumb(image);  //縮圖
                web.setDescription("你要分享內容的描述");//描述

               
new ShareAction(activity)
        .setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE)
        .setShareboardclickCallback(new ShareBoardlistener() {
            @Override
            public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
                if (share_media == SHARE_MEDIA.QQ) {
                    KLog.e("點選QQ");
                    new ShareAction(activity).setPlatform(SHARE_MEDIA.QQ)
                            .withMedia(web)
                            .setCallback(umShareListener)
                            .share();
                } else if (share_media == SHARE_MEDIA.WEIXIN) {
                    KLog.e("點選微信");
                    new ShareAction(activity).setPlatform(SHARE_MEDIA.WEIXIN)
                            .withMedia(web)
                            .setCallback(umShareListener)
                            .share();
                } else if (share_media == SHARE_MEDIA.QZONE) {
                    new ShareAction(activity).setPlatform(SHARE_MEDIA.QZONE)
                            .withMedia(web)
                            .setCallback(umShareListener)
                            .share();
                } else if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE) {
                    new ShareAction(activity).setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE)
                            .withMedia(web)
                            .setCallback(umShareListener)
                            .share();
                }
            }
        }).open();
 umShareListener = new UMShareListener() {
            @Override
            public void onStart(SHARE_MEDIA platform) {
                //分享開始的回撥
            }

            @Override
            public void onResult(SHARE_MEDIA platform) {
//            Toast.makeText(ShareActivity.this, platform + " 分享成功啦", Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onError(SHARE_MEDIA platform, Throwable t) {
//            Toast.makeText(ShareActivity.this,platform + " 分享失敗啦", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancel(SHARE_MEDIA platform) {
//            Toast.makeText(ShareActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show();
            }
        };
//在使用介面中要新增onActivityResult方法,否則授權回撥不成功,獲取不到第三方資訊(如果在fragment中使用第三方登入,則在依附的activity中重寫此方法)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}