Android中用友盟實現QQ的第三方登錄


//首先應該去友盟的官網注冊你的賬號,創建一個應用,獲得它的APPkey,也可以用它的API上的appkey,下載SDK,下面根據API文檔一步步實現就行了。

//下面是友盟的APi文檔

1.  產品概述

關於分享和授權的sdk接口,我們在v5.0做出了巨大的改變,精簡了接口調用的代碼。並將分享授權,與評論等功能做出了隔離,使結構更加清晰。所以本版本的功能也只有分享與授權並無其他功能,請開發者注意。

注意:本文示例代碼只有分享與授權功能,並對接口進行了調整,如需要原功能的開發者,請繼續使用v4.3.0版本。

2.  獲取友盟Appkey

如果你之前已經在友盟注冊了應用,並獲取到了Appkey,可以繼續使用它.

如果你尚未在友盟注冊開發者賬號,需要先注冊,注冊之后登錄你的賬號,點擊添加新應用,填寫完應用基本信息后,將進入"下載SDK並添加代碼"頁面,此頁面即可得到Appkey。

3.  下載並安裝SDK

  • 下載SDK最新版
  • 添加代碼和資源引用,我們提供了添加資源文件和jar文件的兩種方式,可以根據需求選擇

解壓SDK壓縮包,將文件夾中的'main/libs'和'main/res'文件夾復制到你的項目工程根目錄下(如使用'ADT 17'以下用戶需要手動添加'libs'下的jar文件到工程Path中)

解壓SDK壓縮包,將文件夾中的social_sdk_library_project文件夾導入Eclipse,並在您的工程中添加對此項目的引用即可。

  • AndroidManifest配置

其中增加一個activity

<activity android:name="com.umeng.socialize.editorpage.ShareActivity" android:theme="@style/Theme.UMDefault" android:excludeFromRecents="true"/> 

設置友盟appid

<meta-data android:name="UMENG_APPKEY" android:value="4eaee02c527015373b000003" > </meta-data> 

增加權限

為了適配新的android 6.0 permission系統,你需要加入requestPermission()方法來獲取權限, 詳細方法請參照:https://developer.android.com/training/permissions/requesting.html

請先升級最新版android-support-v4.jar包如果你想適配低版本的系統。 把以下代碼加入到你的build.gradle文件中,如果你用的是android studio

    dependencies {
    ...
    compile "com.android.support:support-v4:23.3.0" } 
    //可以將一下代碼加到你的MainActivity中,或者在任意一個需要調用分享功能的activity當中 String[] mPermissionList = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS}; ActivityCompat.requestPermissions(MainActivity.this,mPermissionList, 100); 
<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.INTERNET" /> <uses-permission android:name="android.permission.READ_LOGS" /> <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.SET_DEBUG_APP" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 
  • 針對不平台所需要添加的數據

按照自己需要的平台添加對應的配置

微信平台

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

新浪微博

<activity android:name=".WBShareActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" > <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="adjustResize" android:exported="false" > </activity> <service android:name="com.sina.weibo.sdk.net.DownloadService" android:exported="false"> </service> 

人人網

<activity android:name="com.renn.rennsdk.oauth.OAuthActivity" android:configChanges="orientation|navigation|keyboardHidden" /> 

QQ、Qzone

<activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" > <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="tencent100424468" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 

支付寶

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

谷歌地圖

<uses-library android:name="com.google.android.maps" android:required="false" /> <uses-library android:name="android.test.runner" /> 

facebook

<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider+appid" android:exported="true" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" /> 

4.  初始化配置

4.1  各個平台的配置,建議放在全局Application或者程序入口


PlatformConfig.setWeixin("wx967daebe835fbeac", "5bb696d9ccd75a38c8a0bfe0675559b3"); //微信 appid appsecret PlatformConfig.setSinaWeibo("3921700954","04b48b094faeb16683c32669824ebdad"); //新浪微博 appkey appsecret PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); // QQ和Qzone appid appkey PlatformConfig.setAlipay("2015111700822536"); //支付寶 appid PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf"); //易信 appkey PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO"); //Twitter appid appkey PlatformConfig.setPinterest("1439206"); //Pinterest appid PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e"); //來往 appid appkey 
  • 說明:有些平台的分享時通過調起本地客戶端的形式完成的,因此,並不需要appid,但是諸如需要使用第三方公司api的平台,新浪,騰訊等,是需要去申請appkey的。其實新浪微博可以把appid等配置在代碼中,也可在友盟后台中設置,豆瓣和人人網只能在友盟后台設置。其它需要配置appid的平台,如qq,微信,易信,twitter等都需要在代碼中設置。還有一部分平台需要在mainfest中配置,前面已經提到過。

5.  第三方登錄

目前友盟社會化組件支持的第三方登錄平台為:新浪微博、騰訊微博、QQ、QQ空間、微信、人人網、豆瓣、Facebook、Twitter。

第三方登錄功能主要通過授權和獲取用戶信息這兩個接口實現

5.1  授權

首先獲取UMShareAPI

mShareAPI = UMShareAPI.get(this);

選取需要授權的平台,並進行授權,其中umAuthLisrener是回調監聽器,需要開發者根據需求重新定義


SHARE_MEDIA platform = SHARE_MEDIA.SINA; 
mShareAPI.doOauthVerify(this, platform, umAuthListener) private UMAuthListener umAuthListener = new UMAuthListener() { @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText( getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show(); } @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show(); } @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show(); } }; 

對於刪除授權使用的接口是

mShareAPI.deleteOauth(AuthActivity.this, platform, umdelAuthListener);

不難看出與授權的參數是一樣的。

注意要重寫

onActivityResult()

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mShareAPI.onActivityResult(requestCode, resultCode, data); } 

5.1.1  獲取客戶端安裝信息

使用如下接口

mShareAPI.isInstall(this, SHARE_MEDIA.WEIXIN)

5.2  獲取用戶信息

已授權的平台,可以獲取用戶信息(新浪微博可以獲取用戶好友列表) 實現的方法與授權和解除授權類似:

mShareAPI = UMShareAPI.get(this);

初始化UMShareAPI,然后進行用戶信息獲取:

mShareAPI.getPlatformInfo(UserinfoActivity.this, platform, umAuthListener);

注意必須在調用授權接口mShareAPI.doOauthVerify(this, platform, umAuthListener) 之后才可以獲取用戶信息,建議在doOauthVerify方法完成的onComplete方法中調用獲取用戶信息方法,返回的所有信息都在Map data)集合中獲取

對於新浪微博好友列表的獲取使用的接口是:

mShareAPI.getFriend(UserinfoActivity.this, SHARE_MEDIA.SINA, umGetfriendListener);

注意要重寫

onActivityResult()

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mShareAPI.onActivityResult(requestCode, resultCode, data); } 




//下面是我做的,可以看一下,看到不足之處,請指出,一起共同學習。(提示我是用Android studio做的,底版的Eclipse好像不行,新版的可以,已試過)
//---------------------------------------------------------------------------
新創建一個項目
//-----------下面的是我的 main.XML------中-------一個Imageview用於顯示頭像,一個textview用於顯示QQ名,一個button登錄按鈕----------------
<ImageView android:layout_width="80dp"
android:layout_height="80dp"
android:scaleType="fitXY"
android:id="@+id/iv_image"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:id="@+id/tv_name"
android:layout_marginTop="10dp" />
<Button android:layout_width="70dp"
android:layout_height="40dp"
android:text="登錄"
android:id="@+id/bt_denglu"
android:layout_marginTop="10dp"
android:gravity="center"/>


//---------------------------下面是打開我下載的Sdk,把main下的 libs和res 全部復制到對應的libs下和res下面,2:把platforms下的qq_qzone下的libs和res同樣復制添加到對應的下面
注意:libs下有一個Android—support-v4,這個不用復制了,studio自帶了,我復制添加進去之后運行,結果報錯了)-----------------------------------------------------------------
//下面是報錯
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_66\bin\java.exe'' finished with non-zero exit value 2


v4包重復


//------------下面就是在項目中新建一個類Myaplication 繼承aplication實現onCreate的方法,把下面那行代碼復制進去------------------------------

public class Myaplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//QQ
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");

}
}

//----------------下面就是在清單文件中,加入權限--------------------------------
<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.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<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.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
application標簽下寫入android:name=".Myaplication",這是剛創建那個類
 
        
<application
android:name=".Myaplication"
 
<!--友盟的activity--放入application標簽中>
<activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@style/Theme.UMDefault"
android:excludeFromRecents="true"/>

<meta-data
android:name="UMENG_APPKEY"
android:value="57d7fd70e0f55af86200130c" >
</meta-data>

<!-- QQ的activity-->
 
        
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<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="tencent100424468" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />



//---------整體就是下面這樣--------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bw.com.disanfangdenglu">

<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.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<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.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

<application
android:name=".Myaplication"
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-->
<activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@style/Theme.UMDefault"
android:excludeFromRecents="true"/>

<meta-data
android:name="UMENG_APPKEY"
android:value="57d7fd70e0f55af86200130c" >
</meta-data>
<!-- QQ的activity-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<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="tencent100424468" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />

</application>

</manifest>
//--------------打開 values下的string--------------------------------

<resources>
<string name="app_name">DiSanFangDengLu</string>
<!--加入下面這個-->
<string name="mShareAPI">DiSanFangDengLu</string>
</resources>
//----------把studio換成project下,在build.gradle中加入下面內容---------只有studio中才加這個,eclipse不用------------------
allprojects {
repositories {
jcenter()
}
}



//-----------下面就是mainActivity了--------可以獲得用戶QQ名、和頭像-------------------------
package com.bw.com.disanfangdenglu;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.bean.SHARE_MEDIA;

import java.util.Map;
import java.util.Set;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ImageView iv_image;
private TextView tv_name;
private Button bt_denglu;
private String name;
private String image_url;
UMShareAPI mShareAPI;
private SharedPreferences sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創建SharedPreferences保存QQ名、頭像
sp = getSharedPreferences("kk", Context.MODE_PRIVATE);
//找到控件
iv_image = (ImageView) findViewById(R.id.iv_image);
tv_name = (TextView) findViewById(R.id.tv_name);
bt_denglu = (Button) findViewById(R.id.bt_denglu);
//設置登錄的點擊監聽事件
bt_denglu.setOnClickListener(this);
}

//實現登錄的點擊監聽事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_denglu:
//友盟分享api
mShareAPI = UMShareAPI.get(this);
//分享媒體 把后面改成qq,用什么改成什么
SHARE_MEDIA platform = SHARE_MEDIA.QQ;
//友盟API進行核實,調用umAuthListener友盟授權監聽
mShareAPI.doOauthVerify(this, platform, umAuthListener);
break;

default:
break;
}
}
/*private UMAuthListener umAuthListener = new UMAuthListener() {
@Override//完整的
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
Toast.makeText( getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();
}

@Override//誤差
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();
}

@Override//取消
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();
}
};*/


@Override//結果 必須添加的
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mShareAPI.onActivityResult(requestCode, resultCode, data);
}

private UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
// Toast.makeText(MainActivity.this, "Authorize succeed", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
//友盟API獲得平台信息
mShareAPI.getPlatformInfo(MainActivity.this, platform,
new UMAuthListener() {

@Override
public void onError(SHARE_MEDIA arg0, int arg1, Throwable arg2) {

}

@Override
public void onComplete(SHARE_MEDIA arg0, int arg1, Map<String, String> data) {
Set<String> set = data.keySet();
SharedPreferences.Editor edit = sp.edit();
for (String string : set) {

// 設置頭像
if (string.equals("profile_image_url")) {
image_url = data.get(string);
Log.i("-------image",image_url);
}
// 設置昵稱
if (string.equals("screen_name")) {
name = data.get(string);
}
}
edit.putString("image",image_url);
edit.putString("name",name);
edit.commit();
tv_name.setText(name);
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MainActivity.this));
DisplayImageOptions options=new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build();
ImageLoader.getInstance().displayImage(image_url,iv_image , options);

}

@Override
public void onCancel(SHARE_MEDIA arg0, int arg1) {

}
});
}

@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
//Toast.makeText(MainActivity.this, "Authorize fail", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
}

@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(MainActivity.this, "登錄取消", Toast.LENGTH_SHORT).show();
}
};

}

//--------以上就是所有了,趕快試試吧-----------------------

//-----------這一點是我多復制進去了一個v4包,刪除不了,就在Android在的build.gradle(app)中把v4給刪了,然后 clean一下就好了------------------------------- dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile files('libs/umeng_social_sdk.jar')
compile files('libs/SocialSDK_QQZone_3.jar')
compile files('libs/open_sdk_r5756.jar')
compile files('libs/mta-sdk-1.6.2.jar')
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM