編輯:關於Android編程
這幾天都沒有寫博客,今天集成友盟5.0推送,分享,得閒,總結一下友盟5.0推送分享踩得哪些坑!
之前寫的友盟踩坑心得是基於友盟4.3版本的,現在友盟5.0相較於4.3,有了較大的改動,嗚呼哀哉!學而時習之吧。
友盟5.0的好處:集成推送,分享可以通過導入module的形式,代碼簡化,維護性高,(一些資源文件就不用自己慢慢去拷貝了)。
至於缺點,就是剛剛改版,會有很多跟4.3不一樣的使用方法,所以需要前人去踩坑了!
友盟推送:
1:添加Module
Android studio導入Module自不必多說,把下載的SDK裡面的PushSDK當做Module導入自己的項目。
注意點:
如果是android6.0以上的api編譯,需要在PushSDK的build.gradle文件的android{}塊內添加useLibrary ‘org.apache.http.legacy’,並把compileSdkVersion的版本號改為23。
2:設置測試模式
PushAgent mPushAgent = PushAgent.getInstance(this);
mPushAgent.setDebugMode(true);
注意:在application的oncrete()方法中添加。
3:配置AppKey & Umeng Message Secret
注意:配置在清單文件中,確保和友盟後台注冊應用信息是一致的。
4:開啟推送服務
在應用主Activity中(一般就是MainActivity)添加
PushAgent mPushAgent = PushAgent.getInstance(this);
mPushAgent.enable();
if (mPushAgent.isEnabled() || UmengRegistrar.isRegistered(this)) {
device_token = mPushAgent.getRegistrationId();
Log.e("device_token", device_token);
}
獲取Device Token,
注意:device_token要在友盟後台添加測試Token才能進行推送測試,否則機器接受不到。
mPushAgent.disable(); 關閉推送服務
PushAgent.getInstance(context).onAppStart(); 開啟統計,在所有Activity中的Oncrete()中添加
5:消息的接收
UmengMessageHandler messageHandler = new UmengMessageHandler() {
/**
* 參考集成文檔的1.6.3
* http://dev.umeng.com/push/android/integration#1_6_3
* */
@Override
public void dealWithCustomMessage(final Context context, final UMessage msg) {
new Handler().post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 對自定義消息的處理方式,點擊或者忽略
boolean isClickOrDismissed = true;
if (isClickOrDismissed) {
//自定義消息的點擊統計
UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);
} else {
//自定義消息的忽略統計
UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);
}
}
});
}
};
mPushAgent.setMessageHandler(messageHandler);
mPushAgent.enable();
}
注意:在Application的Oncrete()方法中添加此方法
這樣就可以接收到消息了。
友盟分享:(只講述新浪,QQ,QQzone,微信,朋友圈)
1:集成友盟5.0分享sdk
vcq9PC9wPg0KPHA+MS694tG5U0RL0bnL9bD8o6y9q87EvP680NbQtcQmcnNxdW87bWFpbi9saWJzJnJzcXVvO7rNJnJzcXVvO21haW4vcmVzJnJzcXVvO87EvP680Li01sa1vcTjtcTP7sS/uaSzzLj5xL/CvM/Co6jI58q508MmcnNxdW87QURUIDE3JnJzcXVvO9LUz8LTw7un0OjSqsrWtq/M7bzTJnJzcXVvO2xpYnMmcnNxdW87z8K1xGphcs7EvP61vbmks8xQYXRo1tCjqTwvcD4NCjxwPjIuveLRuVNES9G5y/Ww/KOsvavOxLz+vNDW0LXEc29jaWFsX3Nka19saWJyYXJ5X3Byb2plY3TOxLz+vNC1vMjrRWNsaXBzZaOssqLU2sT6tcS5pLPM1tDM7bzTttS0y8/uxL+1xNL908O8tL/JoaM8L3A+DQo8cD7V4sDvzqrBy7e9seO6zc6su6SjrM7S0aHU8cHLtdq2/tbWt73KvaOsQW5kcm9pZCBzdHVkaW/Ssr/J0tS9q8bk1/fOqm1vZHVsZbW8yOuhozwvcD4NCjxwPjI6x+W1pc7EvP7F5NbDPC9wPg0KPHByZSBjbGFzcz0="brush:java;">
具體可以看友盟文檔,這裡只包括了新浪,QQ,QQZone,微信,朋友圈的
注意:微信,已經新浪微博的回調Activity路徑
注意:AuthActivity的android:scheme,格式為tencent+appID
權限:
3:初始化配置
void initUM() {
PlatformConfig.setWeixin("wx79afb257f799bb67", "e6ac6f3e1a9a0c318334e1e35b15df28");
//微信 appid appsecret
PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad");
//新浪微博 appkey appsecret
PlatformConfig.setQQZone("1105327228", "GYttMYCpxiGOfY5v");
// QQ和Qzone appid appkey
}
注意:集成到Application中,進行初始化
4:分享
public void shareContent() {
image = new UMImage(getActivity(),
BitmapFactory.decodeResource(getResources(), R.mipmap.icon));
new ShareAction(getActivity()).setDisplayList(SHARE_MEDIA.SINA, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE)
.setShareboardclickCallback(shareBoardlistener)
.open();
}
private UMShareListener umShareListener = new UMShareListener() {
@Override
public void onResult(SHARE_MEDIA platform) {
Toast.makeText(getActivity(), platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
// Toast.makeText(getActivity(), platform + " 分享失敗啦", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel(SHARE_MEDIA platform) {
// Toast.makeText(getActivity(), platform + " 分享取消了", Toast.LENGTH_SHORT).show();
}
};
private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() {
@Override
public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
switch (share_media) {
case SINA:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.SINA).setCallback(umShareListener)
.withTitle("分享app")
.withText(
"測試"
+ "url")
.withMedia(image)
.share();
break;
case QQ:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QQ).setCallback(umShareListener)
.withTitle("分享app")
.withText("hello umeng")
.withTitle("qqshare")
.withMedia(image)
.withTargetUrl("http://dev.umeng.com")
.share();
break;
case QZONE:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QZONE).setCallback(umShareListener)
.withTitle("分享app")
.withText("hello umeng")
.withMedia(image)
.withTargetUrl("https://open.weixin.qq.com/cgi-bin/appdetail?t=manage/detail&type=app&lang=zh_CN&token=d3211865a37fad17d540149aff67a8eee8473739&appid=wx79afb257f799bb67")
.share();
break;
case WEIXIN:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.WEIXIN).setCallback(umShareListener)
.withTitle("分享app")
.withMedia(image)
.withText("hello umeng")
.share();
break;
case WEIXIN_CIRCLE:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE).setCallback(umShareListener)
.withTitle("分享app")
.withMedia(image)
.share();
break;
}
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(getActivity()).onActivityResult(requestCode, resultCode, data);
}
這裡集成的很全面,具體還是介紹下吧
我這裡為了防止分享內容不一致,將其分開寫了
分享一致內容:
/**普通分享面板,分享相同一致內容**/
new ShareAction(this).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE)
.setShareboardclickCallback(shareBoardlistener)
.open();
這裡友盟對分享代碼做了極大的簡化,提高了我們的開發效率與集成速度
注意:
微信分享:微信只注意一個問題—–>簽名問題
為了防止每次都打線上的包來測試,我們可以將as的debug.keystore的MD5簽名獲取到,去掉冒號(:),大寫變小寫,在微信開發平台上將注冊的應用包名改為本機debug簽名,測試通了,在改為正式簽名。
QQ分享:初始化配置沒問題就問題不大,主要問題在QQ空間分享時,會出現
這是比較坑壁的,不多說,騰訊攔截了分享鏈接,用友盟測試鏈接也不會通過的,換上正式鏈接可能就不會出現這個問題
以QQ空間分享為例:
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QZONE).setCallback(umShareListener)
.withTitle("分享app")
.withText("hello umeng")
.withMedia(image)
.withTargetUrl("https://open.weixin.qq.com/cgi-bin/appdetail?t=manage/detail&type=app&lang=zh_CN&token=d3211865a37fad17d540149aff67a8eee8473739&appid=wx79afb257f799bb67")
.share();
這裡withTargetUrl不能少,去掉就會分享不成功。
新浪分享:
注意:新浪分享的title是不顯示的,URL鏈接只能加在分享文字後顯示,並且需要確保withText()不為空
當同時傳遞URL參數和圖片時,注意確保圖片不能超過32K,否則無法分享,不傳遞URL參數時圖片不受32K限制
new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.SINA).setCallback(umShareListener)
.withTitle("分享app")
.withText("測試" + "url")
.withMedia(image)
.share();
不要輕信demo啊,可以作為參考,但不一定完全正確。
至於第三方登錄,我也講講吧
第三方登錄:講白了,就是授權,獲取用戶信息兩部分
授權部分
private UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map 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 = UMShareAPI.get(this);
初始化UMShareAPI,然後進行用戶信息獲取:
mShareAPI.getPlatformInfo(UserinfoActivity.this, platform, umAuthListener);
對於新浪微博好友列表的獲取使用的接口是:
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);
}
算了,copy一點,關於信息字段,可以打斷點看看返回內容,也可以參考我在友盟4.3版本所寫的。
本文實例為大家分享了Android圓形菜單的使用方法,供大家參考,具體內容如下MainActivity.java代碼:package siso.handlerdemo;i
指紋識別這個名詞聽起來並不陌生,但是實際開發過程中用得並不多。Google從Android6.0(api23)開始才提供標准指紋識別支持,並對外提供指紋識別相關的接口。本
概述 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接。願與志同道合的朋友一起成長在上一個博文 Anroid沉浸式狀態欄中提到了,畫了一個圖,這
NavigationBar可以手動隱藏,隨著華為榮耀手機有了這個特點後,目前有很多android手機都有該特性。如下截圖所示: 上圖的底部虛擬導航按鈕的左、右邊