友盟分享和推送看這一篇就夠了
阿新 • • 發佈:2019-02-20
前段時間寫了一篇關於友盟推送的文章,從閱讀量來看,大家在這方面踩了很多坑,所以我覺得有必要來個全面的總結,給大家更好的過坑意見;
先從分享開始說吧
第一步整合SDK:官方文件說的很詳細了,整合大家就看文件吧,我就總結一下要注意的地方:
微信,qq,簡訊等友盟的api都有了,不過為了方便自己呼叫,可以自定義一個介面:
然後自定義一個分享的工具類/** * Created by Administrator on 2018/1/5 0005. * 分享回撥 */ public interface ShareHandler { void shareSuccess(); void shareFailed(String msg); void shareCancel(); }
public class ShareUtils { private Activity mContext; public ShareUtils(Activity context) { mContext = context; } private ShareHandler mShareHandler; /**為方便引數的傳遞,把需要的引數封裝為一個shareBean * @param shareBean 分享引數類 */ public void beginShare(ShareBean shareBean, ShareHandler shareHandler) { mShareHandler = shareHandler; UMWeb shareUrl = new UMWeb(shareBean.getUrl()); shareUrl.setTitle(shareBean.getTitle()); shareUrl.setDescription(shareBean.getDesc()); shareUrl.setThumb(new UMImage(mContext, R.mipmap.ic_launcher)); new ShareAction(mContext) .withText(shareBean.getTitle()) .withMedia(shareUrl) .setPlatform(shareBean.getType()) .setCallback(shareListener) .share(); } public UMShareListener shareListener = new UMShareListener() { /** * @descrption 分享開始的回撥 * @param platform 平臺型別 */ @Override public void onStart(SHARE_MEDIA platform) { // ToastUtils.showShortToast("share start"); } /** * @descrption 分享成功的回撥 * @param platform 平臺型別 */ @Override public void onResult(SHARE_MEDIA platform) { // ToastUtils.showShortToast("share success"); if (mShareHandler != null) mShareHandler.shareSuccess(); } /** * @descrption 分享失敗的回撥 * @param platform 平臺型別 * @param t 錯誤原因 */ @Override public void onError(SHARE_MEDIA platform, Throwable t) { // ToastUtils.showShortToast("share failed" + t.getMessage()); if (mShareHandler != null) mShareHandler.shareFailed(t.getMessage()); } /** * @descrption 分享取消的回撥 * @param platform 平臺型別 */ @Override public void onCancel(SHARE_MEDIA platform) { // ToastUtils.showShortToast("share calcel"); if (mShareHandler != null) mShareHandler.shareCancel(); } }; }
shareBean也就幾個引數
//分享 kotlin格式 不會kotlin的吧引數copy到自己的實體類即可
data class ShareBean(
val type: SHARE_MEDIA, //QQ
val url: String, //分享的Url
val title: String, //標題
val thumb: String, //圖片地址
val desc: String //描述文字
)
工具類寫好了然後就是呼叫
private void share(SHARE_MEDIA platform) { ShareUtils shareUtils = new ShareUtils(InvitingFriendActivity.this); //這裡的引數除了都可以從伺服器獲取,然後賦值就行 ShareBean shareBean = new ShareBean(platform, shareUrl, shareTitle, shareIcon, ""); shareUtils.beginShare(shareBean, new ShareHandler() { @Override public void shareSuccess() { // ToastUtils.showShortToast("分享成功"); } @Override public void shareFailed(String msg) { // ToastUtils.showShortToast("分享失敗:" + msg); } @Override public void shareCancel() { // ToastUtils.showShortToast("分享取消"); } }); } /**因為qq和qq空間6.0以後有許可權管理校驗,這一步是校驗,可以直接呼叫這個方法發起分享 * @param paltform pingtai */ public void checkPermissionToshare(final SHARE_MEDIA paltform) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //判斷該應用是否有寫SD卡許可權,如果沒有再去申請 if (ContextCompat.checkSelfPermission(InvitingFriendActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { RxPermissions rxPermissions = new RxPermissions(this); rxPermissions .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if (aBoolean) { share(paltform); } else { ToastUtils.showShortToast("分享取消"); } } }); } else { share(paltform); } } }
呼叫示例
checkPermissionToshare(SHARE_MEDIA.QQ);
下面是通過gradle配置,不打包release版本apk測試微信和微信朋友圈分享的推薦方法
當我們在做微信微博sdk分享的時候除錯非常麻煩,因為要使用對應的簽名版本才能呼叫sdk成功。
當我們使用AndroidStudio的Gradle之後會很簡單的解決這個問題。
1.我們把簽名檔案放到工程根目錄下(這樣做是為了保持路徑的統一)
2.在Gradle中引入如下程式碼:
//配置keystore簽名
signingConfigs {
release {
storeFile file('F:/keystone/vc_secret_key/Keystore.jks')//把正式版簽名檔案儲存到本地磁碟,這裡寫入全路徑
storePassword "xxxxxxxx"
keyAlias "timehut team"
keyPassword "xxxxxxxx"
}
}
buildTypes {
debug {
signingConfig signingConfigs.release
}
release {
signingConfig signingConfigs.release
}
}
只需要在debug的配置下使用release的配置就可以執行達到打包release版本的效果
為了出現問題解決不了,可以在application中啟用友盟的日誌提示,這樣有什麼問題會給你一個解決方案的連結
Config.DEBUG = true;//列印友盟分享日誌
然後是第三方登入授權獲取使用者資訊
private class InnerUMAuthListener implements UMAuthListener {
/**
* 授權開始的回撥
*
* @param platform 平臺名稱
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* 授權成功的回撥
*
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
if (data != null) {
String city = data.get("city");
String country = data.get("country");
String iconurl = data.get("iconurl");
String language = data.get("language");
String name = data.get("name");
String openid = data.get("openid");
String province = data.get("province");
String gender = data.get("gender");
String unionid = data.get("unionid");
//拿到資訊去請求登入介面。。。
mPresenter.bindWeixin(city, country, iconurl, language, name, openid, province, gender.equals("男") ? 1 : 2, unionid);
}
}
/**
* 授權失敗的回撥
*
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
showToast("微信登陸失敗!" + t.getMessage());
}
/**
* 授權取消的回撥
*
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
}
}
授權呼叫
mShareAPI.getPlatformInfo(this, SHARE_MEDIA.WEIXIN, new InnerUMAuthListener());
刪除授權呼叫
mShareAPI.deleteOauth(this, SHARE_MEDIA.WEIXIN, new InnerUMAuthListener());
《***************************分享就是這麼多,相對分享推送的需要講的東西比較多*****************************》
裡面提供了推送的一個工具類,現在給它完善一下,然後再講講推送要注意的地方
/**
* 完善後的友盟推送類
*/
public class UmengHelper {
private static final String TAG = "UmengHelper";
public static final String UPDATE_STATUS_ACTION = "com.umeng.message.example.action.UPDATE_STATUS";
private static UmengHelper mUmengHelper;
private NotificationManager mNotificationManager;
private static String USER_ALIAS_KEY = "WEIC_ALIAS";
private static String USER_ALIAS_VALUE = "userId_";
public static String LOGING_TAG = "log_on";
public static String BID_TAG = "bid";
public static UmengHelper getInstance() {
if (mUmengHelper == null) {
mUmengHelper = new UmengHelper();
}
return mUmengHelper;
}
public void init() {
mNotificationManager = (NotificationManager) ContextUtils.getContext().getSystemService(Context.NOTIFICATION_SERVICE);
PushAgent mPushAgent = PushAgent.getInstance(ContextUtils.getContext());
//註冊推送服務,每次呼叫register方法都會回撥該介面
UMConfigure.setLogEnabled(true);
mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
//註冊成功會返回device token
Log.d(TAG, "onSuccess: deviceToken----" + deviceToken);
ContextUtils.getContext().sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
}
@Override
public void onFailure(String s, String s1) {
Log.d(TAG, "onFailure: ---" + s + " s1--" + s1);
ContextUtils.getContext().sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
}
});
UMConfigure.init(ContextUtils.getContext(), "", "", UMConfigure.DEVICE_TYPE_PHONE, "");
setMessageHandler();
setNotificationClickHandler();
}
public static void startPushAgent() {
PushAgent.getInstance(ContextUtils.getContext()).onAppStart();
}
/**
* 設定使用者別名
*/
public static void setUserAlias(long user_id) {
//設定使用者id和device_token的一對多的對映關係:
PushAgent.getInstance(ContextUtils.getContext()).addAlias(USER_ALIAS_VALUE + user_id, USER_ALIAS_KEY, new UTrack.ICallBack() {
@Override
public void onMessage(boolean isSuccess, String message) {
Log.d(TAG, "設定別名" + isSuccess + " 別名--" + message);
}
});
}
public static void delUserAlias() {
long userid = BaseApplication.getInstance().getUser() == null ? 0 : BaseApplication.getInstance().getUser().getUser_id();
PushAgent.getInstance(ContextUtils.getContext()).deleteAlias(USER_ALIAS_VALUE + userid, USER_ALIAS_KEY, new UTrack.ICallBack() {
@Override
public void onMessage(boolean b, String s) {
LogUtils.e("刪除別名..." + b + "刪除結果..." + s);
}
});
}
/**
* 設定使用者標籤 通常是使用者登入了或者有其他操作才呼叫此方法設定標籤
*/
public static void setUserTag(String... var2) {
PushAgent.getInstance(ContextUtils.getContext()).getTagManager().addTags(new TagManager.TCallBack() {
@Override
public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
//isSuccess表示操作是否成功
Log.e(TAG, "新增標籤" + isSuccess);
}
}, var2);
}
public static void delUserTag() {
PushAgent.getInstance(ContextUtils.getContext()).getTagManager().deleteTags(new TagManager.TCallBack() {
@Override
public void onMessage(boolean b, ITagManager.Result result) {
Log.e(TAG, "刪除標籤" + b);
}
}, LOGING_TAG, BID_TAG);
}
public void setMessageHandler() {
UmengMessageHandler messageHandler = new UmengMessageHandler() {
@Override
public void dealWithCustomMessage(final Context context, final UMessage msg) {
Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.text);
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// 對自定義訊息的處理方式,點選或者忽略
boolean isClickOrDismissed = true;
if (isClickOrDismissed) {
//自定義訊息的點選統計
UTrack.getInstance(ContextUtils.getContext()).trackMsgClick(msg);
} else {
//自定義訊息的忽略統計
UTrack.getInstance(ContextUtils.getContext()).trackMsgDismissed(msg);
}
}
});
}
@Override
public void dealWithNotificationMessage(Context context, UMessage uMessage) {
super.dealWithNotificationMessage(context, uMessage);
}
@Override
public Notification getNotification(Context context, UMessage msg) {
Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.text);
if (msg.extra != null) {
String url = msg.extra.get("weic");
// TODO: 2018/1/29 根據自定義引數跳轉activity
}
sendTenNotifications(msg, context);//有時候官方demo的通知不好用,自己寫一個,switch裡面給它返回一個就行
switch (msg.builder_id) {
case 1:
Notification.Builder builder = new Notification.Builder(context);
return builder.build();
default:
//預設為0,若填寫的builder_id並不存在,也使用預設。
return super.getNotification(context, msg);
}
}
};
PushAgent.getInstance(ContextUtils.getContext()).setMessageHandler(messageHandler);
}
/**
* 傳送通知 預設的通知欄樣式
*/
private void sendTenNotifications(UMessage msg, Context context) {
Intent intent = new Intent();
intent.setClassName(context, "需要開啟的activity全路徑");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
NotificationCompat.Builder builder = new NotificationCompat.Builder(ContextUtils.getContext())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(msg.title)
.setContentText(msg.text)
.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
mNotificationManager.notify(1, builder.build());
}
/**
* 自定義行為的回撥處理,參考文件:高階功能-通知的展示及提醒-自定義通知開啟動作
* UmengNotificationClickHandler是在BroadcastReceiver中被呼叫,故
* 如果需啟動Activity,需新增Intent.FLAG_ACTIVITY_NEW_TASK
*/
public void setNotificationClickHandler() {
/**
* 該Handler是在BroadcastReceiver中被呼叫,故
* 如果需啟動Activity,需新增Intent.FLAG_ACTIVITY_NEW_TASK
* */
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
@Override
public void dealWithCustomAction(Context context, UMessage msg) {
Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.custom);
startActivity(context);
}
@Override
public void launchApp(Context context, UMessage msg) {
Log.e(TAG, "launchApp msg=" + msg.toString() + ", msg.custom=" + msg.custom);
if (msg.extra != null) {
String url = msg.extra.get("weic");
// TODO: 2018/1/29 根據自定義引數跳轉activity
}
super.launchApp(context, msg);
}
@Override
public void openUrl(Context context, UMessage msg) {
Log.e(TAG, "openUrl msg=" + msg.toString() + ", msg.custom=" + msg.custom);
super.openUrl(context, msg);
}
@Override
public void openActivity(Context context, UMessage msg) {
Log.e(TAG, "openActivity msg=" + msg.toString() + ", msg.custom=" + msg.custom);
}
};
PushAgent.getInstance(ContextUtils.getContext()).setNotificationClickHandler(notificationClickHandler);
}
private void startActivity(Context context) {
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);//如友盟官方的註釋所說,如果點選訊息要做頁面跳轉需要新增這個標誌
i.setComponent(new ComponentName("專案包名", "需要開啟的activity的全路徑"));
context.startActivity(i);
}
private void getAppInfo() {
String pkgName = ContextUtils.getContext().getPackageName();
String info = String.format("DeviceToken:%s\n" + "SdkVersion:%s\nAppVersionCode:%s\nAppVersionName:%s",
PushAgent.getInstance(ContextUtils.getContext()).getRegistrationId(), MsgConstant.SDK_VERSION,
UmengMessageDeviceConfig.getAppVersionCode(ContextUtils.getContext()), UmengMessageDeviceConfig.getAppVersionName(ContextUtils.getContext()));
Log.d(TAG, "應用包名:" + pkgName + "\n" + info);
}
}
然後還有個小米,華為,魅族的離線通道
/**
* Created by Administrator on 2017/11/23 0023.
* 小米彈窗功能
* 小米對後臺程序做了諸多限制。若使用一鍵清理,應用的channel程序被清除,將接收不到推送。
* 為了增加推送的送達率,可選擇接入小米託管彈窗功能。通知將由小米系統託管彈出,
* 點選通知欄將跳轉到指定的Activity。該Activity需繼承自UmengNotifyClickActivity,
* 同時實現父類的onMessage方法,對該方法的intent引數進一步解析即可,該方法非同步呼叫,不阻塞主執行緒
*/
public class MipushDialogActivity extends UmengNotifyClickActivity {
private static String TAG = MipushDialogActivity.class.getName();
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.notification_view);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e(TAG, "onNewIntent: " + intent);
}
@Override
public void onMessage(Intent intent) {
super.onMessage(intent); //此方法必須呼叫,否則無法統計開啟數
String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
Log.e(TAG, "onMessage: " + body);
Message message = Message.obtain();
message.obj = body;
handler.sendMessage(message);
}
}
下面這個實體類是在onMessage中獲取到的body
/**
* Created by Administrator on 2018/1/29.
* 離線通知實體類
*/
data class PushInfo(
val display_type: String, //notification 推送訊息型別
val extra: Extra,
val msg_id: String, //uuapugn151720757171510 推送訊息的id
val body: Body,
val random_min: Int //0
)
//自定義引數 可根據此引數做頁面跳轉
data class Extra(
val url: String //"mainActivity" key為url-->value為mainActivity
)
data class Body(
val after_open: String, //go_app 點選推送訊息開啟應用後的行為描述 go_qpp(啟動應用) go_custom(自定義行為) go_activity(開啟指定頁面) go_url(開啟指定連結)
val play_lights: String, //false 是否亮燈(手機訊息呼吸燈)
val ticker: String, //惺惺惜惺惺
val play_vibrate: String, //false
val custom: String, //自定義行為的value
val activity: String,//activity的全路徑
val url: String, //連結地址
val text: String, //阿德法阿薩德 內容
val title: String, //惺惺惜惺惺 標題
val play_sound: Boolean //true 是否播放聲音
)
manifest配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx">
<permission
android:name="${applicationId}.permission.MIPUSH_RECEIVE"
android:protectionLevel="signatureOrSystem" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="${applicationId}.permission.MIPUSH_RECEIVE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<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" />
<!-- 相容flyme5.0以下版本,魅族內部整合pushSDK必填,不然無法收到訊息 -->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE" />
<permission
android:name="${applicationId}.push.permission.MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.push.permission.MESSAGE" />
<!-- 相容flyme3.0配置許可權 -->
<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<!--LinkedME SDK 需要開啟的許可權--> <!--LinkedME SDK 需要開啟的許可權-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<application>
<service
android:name="com.taobao.accs.ChannelService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.SERVICE" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.ELECTION" />
</intent-filter>
</service>
<service
android:name="com.taobao.accs.data.MsgDistributeService"
android:exported="true">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver
android:name="com.taobao.accs.EventReceiver"
android:process=":channel">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.taobao.accs.ServiceReceiver"
android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.START_FROM_AGOO" />
</intent-filter>
</receiver>
<service
android:name="com.taobao.accs.internal.AccsJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":channel" />
<service
android:name="com.taobao.accs.ChannelService$KernelService"
android:process=":channel" />
<service
android:name="org.android.agoo.accs.AgooService"
android:exported="true">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.UmengIntentService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.agoo.android.intent.action.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.XiaomiIntentService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.agoo.android.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver
android:name="com.taobao.agoo.AgooCommondReceiver"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="${applicationId}.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service
android:name="com.umeng.message.UmengMessageIntentReceiverService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.android.agoo.client.MessageReceiverService" />
</intent-filter>
</service>
<receiver
android:name="com.umeng.message.NotificationProxyBroadcastReceiver"
android:exported="false" />
<service
android:name="com.umeng.message.UmengMessageCallbackHandlerService"
android:exported="false">
<intent-filter>
<action android:name="com.umeng.messge.registercallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.enablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.disablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.handler.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.sendmessage.action" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.UmengDownloadResourceService"
android:exported="false" />
<provider
android:name="com.umeng.message.provider.MessageProvider"
android:authorities="${applicationId}.umeng.message"
android:exported="false">
<grant-uri-permission android:pathPattern=".*" />
</provider>
<!-- mipush -->
<service
android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="true" />
<service
android:name="com.xiaomi.mipush.sdk.MessageHandleService"
android:enabled="true" />
<receiver
android:name="org.android.agoo.xiaomi.MiPushBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver>
<!-- huawei push -->
<receiver android:name="org.android.agoo.huawei.HuaWeiReceiver">
<intent-filter>
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<action android:name="com.huawei.intent.action.PUSH" />
<action android:name="com.huawei.intent.action.PUSH_STATE" />
</intent-filter>
</receiver>
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
<meta-data
android:name="UMENG_APPKEY"
android:value="${UMENG_APPKEY}" />
<meta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="${UMENG_MESSAGE_SECRET}" />
<!-- 小米華為推送配置 -->
<activity
android:name="com.jinzaofintech.investlib.MipushDialogActivity"
android:exported="true"
android:launchMode="singleTask">
<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="myscheme" />
</intent-filter>
</activity>
<receiver
android:name="com.meizu.cloud.pushsdk.SystemReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.meizu.cloud.pushservice.action.PUSH_SERVICE_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- meizu push -->
<service
android:name="com.meizu.cloud.pushsdk.NotificationService"
android:exported="true" />
</application>
</manifest>
推送的專案結構圖如下
推送程式碼相關的總共就這些東西了。jar包so檔案從sdk中copy就行了
下面講坑
基本百分之九十以上的問題這幾個連結都能解決了,還有一些解決不了,我恰好知道的下面給說一下 主要是幾個方面吧- 奔潰有可能引起的因素,少了某個資原始檔,有可能是圖片,string檔案裡面的文字,比如第三方登入授權要獲取使用者資訊的時候需要這兩個資源
<string name="umeng_socialize_female">女</string> <string name="umeng_socialize_male">男</string>
有時候是佈局寫錯了,比如log能看到推送訊息,但是訊息通知欄不顯示notification,如果用了自定義notification的話建議檢查一下佈局,然後需要設定大小圖片 myNotificationView.setImageViewBitmap(R.id.notification_large_icon, getLargeIcon(context, msg)); myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));要記得給上匹配名字的圖片
包名是否和友盟後臺的一致,ID這些
沒辦法的辦法就是去找友盟客服了,基本通過這些方法都能解決掉你的問題了,還不行你就在下方留言,大家一起商討