安卓極光推送與分享-【Tag和Alias的設定】
STEP1:效果圖
本篇只做個人記錄、本篇只做個人記錄、本篇只做個人記錄(重要事情說三遍!!!)
這裡包名一定要對應上,官方也提供了一個Demo[然而並沒有什麼…] 點選確認後即可生成一個APPkey 程式碼裡要用到
STEP3:配置AndroidManifest.xml
1.許可權
<!-- Required -->
<uses-permission android:name="自己的包名.permission.JPUSH_MESSAGE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- Optional. Required for location feature -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 用於開啟 debug 版本的應用在6.0 系統上 層疊視窗許可權 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name ="android.permission.GET_TASKS"/>
2.新建一個類繼承Application
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// TODO: 2016/12/28 設定開啟日誌,釋出時請關閉日誌
//初始化極光推送
JPushInterface.setDebugMode(false);
JPushInterface.init(this);
//極光分享
JShareInterface.init(this);
}
}
3.註冊 Application
android:name=".app.MyApplication"
4.一些配置 Required SDK 核心功能 我看官網配置了一大堆 看自己需求加
<activity
android:name="cn.jiguang.share.android.ui.JiguangShellActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
<service
android:name="cn.jpush.android.service.PushService"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER"/>
<action android:name="cn.jpush.android.intent.REPORT"/>
<action android:name="cn.jpush.android.intent.PushService"/>
<action android:name="cn.jpush.android.intent.PUSH_TIME"/>
</intent-filter>
</service>
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/> <!-- Required 顯示通知欄 -->
<category android:name="自己的包名"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
<!-- User defined. 使用者自定義的廣播接收器 註冊廣播 -->
<receiver
android:name=".receiver.JpushRecviver"
android:enabled="true"
android:exported="false"
android:permission="1000">
<intent-filter>
<!-- Required 使用者註冊SDK的intent -->
<action android:name="cn.jpush.android.intent.REGISTRATION"/>
<!-- Required 使用者接收SDK訊息的intent -->
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/>
<!-- Required 使用者接收SDK通知欄資訊的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/>
<!-- Required 使用者開啟自定義通知欄的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
<!-- 接收網路變化 連線/斷開 since 1.6.3 -->
<action android:name="cn.jpush.android.intent.CONNECTION"/>
<action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION"/>
<action android:name="cn.jpush.android.intent.UNREGISTRATION"/>
<category android:name="自己的包名"/>
</intent-filter>
</receiver>
<meta-data
android:name="JPUSH_APPKEY"
android:value="剛剛申請appkey丟這裡"/>
5.上面接受通知的類 JpushRecviver.class
public class JpushRecviver extends BroadcastReceiver {
private static final String TAG = "JpushRecviver";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
/**
* 使用者註冊SDK的intent
*/
Log.e(TAG, "onReceive1: ");
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
/**
* 使用者接受SDK訊息的intent
*/
Log.e(TAG, "收到了自定義訊息訊息是2");
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
/**
* 使用者接收SDK通知欄資訊的intent
*/
Log.e(TAG, "收到了自定義訊息訊息是3");
//儲存伺服器推送下來的訊息的標題。
String extra1 = bundle.getString(JPushInterface.EXTRA_TITLE);
//訊息內容
String extra2 = bundle.getString(JPushInterface.EXTRA_MESSAGE);
//附加欄位。這是個 JSON 字串。
String extra3 = bundle.getString(JPushInterface.EXTRA_EXTRA);
//唯一標識訊息的 ID, 可用於上報統計等。
String extra4 = bundle.getString(JPushInterface.EXTRA_MSG_ID);
//通知的標題
String extra5 = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
//通知內容
String extra6 = bundle.getString(JPushInterface.EXTRA_ALERT);
//通知欄的Notification ID,可以用於清除Notification
//如果服務端內容(alert)欄位為空,則notification id 為0
String extra7 = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_ID);
//富媒體通知推送下載的HTML的檔案路徑,用於展現WebView
String extra8 = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH);
//富媒體通知推送下載的圖片資源的檔名,多個檔名用 “,” 分開。
// 與 “JPushInterface.EXTRA_RICHPUSH_HTML_PATH” 位於同一個路徑。
String extra9 = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES);
//JSON
String extra10 = bundle.getString(JPushInterface.EXTRA_EXTRA);
//這裡做自己的操作,關於EventBus後續會講的
//匹配對應的內容傳送通知
if (extra6.contains("Hello World")) {
Log.e(TAG, "onReceive包含: ");
EventBus.getDefault().post(new HomeRecviverEvent());
}
Log.e(TAG, "收到了自定義訊息訊息內容是2:" + extra1);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra2);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra3);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra4);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra5);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra6);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra7);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra8);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra9);
Log.e(TAG, "收到了自定義訊息訊息extra是2:" + extra10);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
/**
* 使用者開啟自定義通知欄的intent
*/
String extra6 = bundle.getString(JPushInterface.EXTRA_ALERT);
//如果包含 跳轉至對應的介面
if (extra6.contains("Hello World")) {
Log.e(TAG, "onReceive包含: ");
Log.e(TAG, "收到了自定義訊息訊息extra是4:");
Intent in = new Intent(context, NewFriendActivity.class);
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(in);
} else {
Log.e(TAG, "onReceive不包含: ");
}
} else {
Log.e(TAG, "Unhandled intent - " + intent.getAction());
Log.e(TAG, "收到了自定義訊息訊息extra是5:");
}
}
}
6.build.gradle 裡的配置
其中 JPUSH_PKGNAME: 推送的包名: JSHARE_PKGNAME 分享的包名 applicationId:指的就是你上面的包名 TENCENT_APPID:這個是騰訊的
相關的依賴:
compile 'cn.jiguang.sdk:jpush:3.0.3' // 此處以JPush 3.0.3 版本為例。
compile 'cn.jiguang.sdk:jcore:1.1.1' // 此處以JCore 1.1.1 版本為例。
compile 'cn.jiguang.sdk:jshare:1.1.0' // 此處以 JShare 1.1.0 版本為例。
compile 'cn.jiguang.sdk:jshare-qqmodel:1.1.0' // 此處以 jshare-qqmodel 1.1.0 版本為例
compile 'cn.jiguang.sdk:jshare-wechatmodel:1.1.0' // 此處以 jshare-wechatmodel 1.1.0 版本為例。
compile 'cn.jiguang.sdk:jshare-sinamodel:1.1.0 // 此處以 jshare-sinamodel 1.1.0 版本為例。
到這裡相關配置應該全部完成了
7.程式碼片段 其實到這裡已經可以推送了但是由於有單推和群推,還要設定標籤與Tag,不然這樣是所有人接受
1.設定標籤與別名 在Activity 初始化呼叫下面這個方法即可[確保初次進入設定如:登入成功後跳轉的Activity]
/**
* 設定標籤與別名
*/
private void setTagAndAlias() {
/**
*這裡設定了別名,在這裡獲取的使用者登入的資訊
*並且此時已經獲取了使用者的userId,然後就可以用使用者的userId來設定別名了
**/
//false狀態為未設定標籤與別名成功
//if (UserUtils.getTagAlias(getHoldingActivity()) == false) {
Set<String> tags = new HashSet<String>();
//這裡可以設定你要推送的人,一般是使用者uid 不為空在設定進去 可同時新增多個
if (!TextUtils.isEmpty(UserUtils.getUid(getHoldingActivity()))){
tags.add(UserUtils.getUid(getHoldingActivity()));//設定tag
}
//上下文、別名【Sting行】、標籤【Set型】、回撥
JPushInterface.setAliasAndTags(getHoldingActivity(), UserUtils.getUid(getHoldingActivity()), tags,
mAliasCallback);
// }
}
2.設定標籤與別名的回撥
/**
* /**
* TagAliasCallback類是JPush開發包jar中的類,用於
* 設定別名和標籤的回撥介面,成功與否都會回撥該方法
* 同時給定回撥的程式碼。如果code=0,說明別名設定成功。
* /**
* 6001 無效的設定,tag/alias 不應引數都為 null
* 6002 設定超時 建議重試
* 6003 alias 字串不合法 有效的別名、標籤組成:字母(區分大小寫)、數字、下劃線、漢字。
* 6004 alias超長。最多 40個位元組 中文 UTF-8 是 3 個位元組
* 6005 某一個 tag 字串不合法 有效的別名、標籤組成:字母(區分大小寫)、數字、下劃線、漢字。
* 6006 某一個 tag 超長。一個 tag 最多 40個位元組 中文 UTF-8 是 3 個位元組
* 6007 tags 數量超出限制。最多 100個 這是一臺裝置的限制。一個應用全域性的標籤數量無限制。
* 6008 tag/alias 超出總長度限制。總長度最多 1K 位元組
* 6011 10s內設定tag或alias大於3次 短時間內操作過於頻繁
**/
private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
@Override
public void gotResult(int code, String alias, Set<String> tags) {
String logs;
switch (code) {
case 0:
//這裡可以往 SharePreference 裡寫一個成功設定的狀態。成功設定一次後,以後不必再次設定了。
//UserUtils.saveTagAlias(getHoldingActivity(), true);
logs = "Set tag and alias success極光推送別名設定成功";
Log.e("TAG", logs);
break;
case 6002:
//極低的可能設定失敗 我設定過幾百回 出現3次失敗 不放心的話可以失敗後繼續呼叫上面那個方面 重連3次即可 記得return 不要進入死迴圈了...
logs = "Failed to set alias and tags due to timeout. Try again after 60s.極光推送別名設定失敗,60秒後重試";
Log.e("TAG", logs);
break;
default:
logs = "極光推送設定失敗,Failed with errorCode = " + code;
Log.e("TAG", logs);
break;
}
}
};
3.上面的效果圖是群推的也就是安裝了的都會收到 現在我們試試指定UID的 也就是上面設定那個使用者的uid 回到極光控制檯
完成後點選 立即傳送即可
上面得標籤和tag設定為 你剛剛在程式碼中的uid 也就是我的UserUtils.getUid(getHoldingActivity()) 1010117
這樣只有該使用者能接受到訊息
4.當用戶退出登入不想接受通知時肯定要取消設定的 只要穿null就行了 回撥是一樣的
/**
* 取消設定標籤與別名
*/
private void cancleTagAndAlias() {
//TODO 上下文、別名、標籤、回撥 退出後空陣列與空字串取消之前的設定
Set<String> tags = new HashSet<String>();
JPushInterface.setAliasAndTags(getHoldingActivity(), "", tags, mAliasCallback);
}
STEP8: 接下來是分享的程式碼段 分享配置在上面已經配置好了
先提供工具類 判斷是否安裝QQ 微信 微博的
/**
* com.tencent.mm微信
* com.sina.weibo新浪微博
* 判斷是否安裝了QQ "com.tencent.mobileqq"
* true 安裝了相應包名的app
*/
public static boolean hasApp(Context context, String packName) {
boolean is = false;
List<PackageInfo> packages = context.getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
String packageName = packageInfo.packageName;
if (packageName.equals(packName)) {
is = true;
}
}
return is;
}
舉例個QQ的 微信 微博 一樣的
/**
* 用於區別是QQ、微信、微博
* 1-2-3
*/
if (Tools.hasApp(PersonalHomePageActivity.this, "com.tencent.mobileqq")) {
typeCode = 1;
ShareQQWeiXinWeiBo();
} else {
showToast("未安裝QQ");
}
/**
* 分享到對應平臺
*/
private void ShareQQWeiXinWeiBo() {
ShareParams shareParams = new ShareParams();
//name 平臺名稱,值可選 Wechat.Name、WechatMoments.Name、WechatFavorite.Name、
// SinaWeibo.Name、SinaWeiboMessage.Name、QQ.Name、QZone.Name。
String otherName = null;
if (typeCode == 1) {
otherName = QQ.Name;
//QQ文字
shareParams.setShareType(Platform.SHARE_WEBPAGE);
//標題
shareParams.setTitle(name);
//文字
shareParams.setText(motto);
//點選的連線
shareParams.setUrl("http://www.baidu.com");
//網路地址縮圖
shareParams.setImageUrl(image);
Log.e(TAG, "ShareQQWeiXinWeiBo: " + name + "\n" + motto + "\n" + image);
} else if (typeCode == 2) {
otherName = Wechat.Name;
shareParams.setTitle(name);
shareParams.setText(motto);
shareParams.setShareType(Platform.SHARE_WEBPAGE);
//跳轉連結 必須以 http 或 https 開頭
shareParams.setUrl("http://www.baidu.com");
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
shareParams.setImageData(bitmap);
} else if (typeCode == 3) {
otherName = SinaWeibo.Name;
shareParams.setShareType(Platform.SHARE_WEBPAGE);
shareParams.setText(motto);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
shareParams.setImageData(bitmap);
shareParams.setUrl("http://www.baidu.com");
}
Log.e(TAG, "Share: " + typeCode);
Log.e(TAG, "Share: " + name);
JShareInterface.share(otherName, shareParams, new PlatActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
Log.e(TAG, "onComplete: ");
//這裡貌似不知吐絲 必須到主執行緒
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("分享成功");
}
});
}
@Override
public void onError(Platform platform, int i, int i1, Throwable throwable) {
Log.e(TAG, "onError: " + platform + "\n" + i + "\n" + i1 + "\n" + throwable.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("分享失敗");
}
});
}
@Override
public void onCancel(Platform platform, int i) {
Log.e(TAG, "onCancel: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("分享取消");
}
});
}
});
}
STEP9:微信回撥類 暫時沒用到
1.
/**
* 配置微信平臺回撥
*/
public class WXEntryActivity extends WeChatHandleActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
}
2.AndroidManifest.xml
Optional QQ 分享回撥
scheme為“tencent”字首再加上QQ開發者應用的appID;例如appID為123456,則scheme=“tencent123456”
<intent-filter>
<data android:scheme="tencent1106218557"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<!-- 新浪微博分享回撥 -->
<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=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleInstance"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|adjustUnspecified|stateHidden"/>```
STEP10:在assets 目錄下新建 JGShareSDK.xml 這個自己去各個網站申請即可 其中微博的有點麻煩填的東西多稽核又嚴格 app截圖還必要要體現微博的用處有點坑... 好了到此結束!
<?xml version="1.0" encoding="utf-8"?>
<DevInfor>
<!-- 如果不需要支援某平臺,可預設該平臺的配置-->
<SinaWeibo
AppKey="新浪的 AppId"
AppSecret="新浪的 AppSecretId"
RedirectUrl="微博開放平臺填寫的授權回撥頁"/>
<QQ
AppId="QQ的 AppId"
AppKey="QQ的 AppId"/>
<Wechat
AppId="微信的 AppId"
AppSecret="微信的 AppSectet"/>
</DevInfor>
本篇只做個人記錄