【友盟+】开发者社区

小白集成友盟推送Android 2.4.1(图文并茂)

老辛 发表于 2016-9-19 14:12:33 |

老辛
老辛 发表于 2015-7-16 15:29:46 | 显示全部楼层 |阅读模式
集成过程

客户端集成

如何快速集成友盟推送:

注册友盟帐号=》创建推送应用=》下载SDK=》集成开发=》测试应用=》发布应用

1、 在Android Studio中创建新项目(Eclipse相同)记下包名。

QQ截图20150717095340.png

2、注册友盟账号

友盟开发者账号的注册地址:http://www.umeng.com/users/sign_up

3、创建新应用

首先进入友盟消息推送的应用中心,创建一个应用,链接地址为:http://message.umeng.com/appList

进入后选择添加应用:



应用创建完成后,点击应用名称进入应用详情页面,进入“应用信息”页面,可以看到应用的AppKey和AppMasterSecret


3、下载Android SDK
友盟消息推送android SDK下载地址:
http://dev.umeng.com/push/android/sdk-download
111.png

4、集成开发
(1)打开配置文件,添加相应的权限
    <!-- 添加权限开始 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <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.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <!-- 添加权限结束 -->

2、 添加相应组件,记得把【应用包名】改为自己的包名。
<!-- 推送配置开始 -->
        <receiver
            android:name="com.umeng.message.NotificationProxyBroadcastReceiver"
            android:exported="false" >
        </receiver>
        <receiver
            android:name="com.umeng.message.SystemReceiver"
            android:process=":push" >
            <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>
        </receiver>
        <receiver
            android:name="com.umeng.message.MessageReceiver"
        android:exported="false"
            android:process=":push" >
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.RECEIVE" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.umeng.message.ElectionReceiver"
            android:process=":push" >
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.ELECTION_RESULT_V4" />
                <category android:name="umeng" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.umeng.message.RegistrationReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.umeng.message.example.intent.action.COMMAND" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.umeng.message.UmengMessageBootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.umeng.message.UmengService"
            android:label="PushService"
            android:exported="true"
            android:process=":push" >
            <intent-filter>
                <action android:name="com.umeng.message.example.intent.action.START" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.example.intent.action.COCKROACH" />
            </intent-filter>
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.PING_V4" />
                <category android:name="umeng" />
            </intent-filter>
        </service>

        <service android:name="com.umeng.message.UmengIntentService"
            android:process=":push" />
            
        <service
            android:name="com.umeng.message.UmengMessageIntentReceiverService"
            android:process=":push"
            android:exported="true" >
            <intent-filter>
                <action android:name="org.android.agoo.client.MessageReceiverService" />
            </intent-filter>
            <intent-filter>
                <action android:name="org.android.agoo.client.ElectionReceiverService" />
            </intent-filter>
        </service>
        
        <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.unregistercallback.action"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.message.handler.action"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.autoupdate.handler.action"/>
            </intent-filter>
        </service>
        <service android:name="com.umeng.message.UmengDownloadResourceService" />      
<!-- 推送配置结束 -->

3、 添加 AppKey 和 Umeng Message Secret
<!-- APPKEY值的配置 -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="你的APPKEY" >
        </meta-data>
        <meta-data
            android:name="UMENG_MESSAGE_SECRET"
            android:value="你的Umeng Message Secret " >
        </meta-data>
        <!-- AppKEY配置结束 -->

三、 方法的调用

1、 推送服务的开启和关闭
PushAgent mPushAgent = PushAgent.getInstance(context);
//推送服务的开启
mPushAgent.enable();
//推送服务的关闭
mPushAgent.disable();


2、 Token值得获取
String device_token=UmengRegistrar.getRegistrationId(context);

3、 设置免打扰模式
public void setNoDisturbMode(int startHour, int startMinute, int endHour, int endMinute)

4、 标签
//为用户设置标签
mPushAgent.getTagManager().add("movie", "sport");
//标签的添加
public Result add(String... tags)
//标签的删除
public Result delete(String... tags)
//删除所有标签
public void reset()
//获取服务器端的所有标签
public List<String> list()

5、 用户ID的设置
//设置用户ID
mPushAgent.addAlias("zhangsan@sina.com", ALIAS_TYPE.SINA_WEIBO);
//移除用户ID
mPushAgent.removeAlias("zhangsan@sina.com", ALIAS_TYPE.SINA_WEIBO);

主要功能
1、 推送通知



2、 推送的开启和关闭
开启推送
QQ截图20150717110323.png

关闭推送

关闭推送

关闭推送

3、 添加TAG和添加Alias
添加TAG

添加TAG

添加TAG


添加Alias

添加Alias

添加Alias


4、 自定义消息



自定义消息

自定义消息


5、 打开指定的Activity




6、 打开指定网页



7、 按指定标签推送



8、 稳定性测试


功能特色
1、 支持打开应用、打开指定网页、打开指定页面和自定义行为


2、 可以修改提醒方式;

3、 支持标签、单播、用户ID(Alias);



4、 支持定时发送,和修改过期时间;


5、 支持修改发送速度、自定义声音、自定义通知栏图标;

6、 支持多包名推送(注只有1.4.0之后的版本才支持多包名推送)

开通过程非常简单,只需要点击“申请开通”即可,需要注意的是,开通多包名功能之后,默认包名(例如上图中的“test.test,”包名)将不能修改。

开通完成之后,就可以添加各个渠道的“新增包名”啦,下次发送消息时,使用这些包名的渠道包就都能收到消息了。



DEMO展示:
[Java] 纯文本查看 复制代码
public class MainActivity extends Activity {        protected static final String TAG = MainActivity.class.getSimpleName();
        
        private EditText edTag, edAlias, edAliasType;
        private TextView tvStatus, infoTextView;
        private ImageView btnEnable;
        private Button btnaAddTag, btnListTag, btnAddAlias; 
        private ProgressDialog dialog;
        private Spinner spAliasType;
        
        private PushAgent mPushAgent;
        
        private int screenWidth;
        private boolean edAliasTypeFocus;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
                DisplayMetrics dm = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(dm);
                screenWidth = dm.widthPixels;
                
                setContentView(R.layout.activity_main);
                
                printKeyValue();
                
                mPushAgent = PushAgent.getInstance(this);
                
                //应用程序启动统计
                //参考集成文档的1.5.1.2
                //http://dev.umeng.com/push/android/integration#1_5_1
                mPushAgent.onAppStart();
                
                //开启推送并设置注册的回调处理
             mPushAgent.enable(mRegisterCallback);
                
                tvStatus = (TextView) findViewById(R.id.tvStatus);
                btnEnable = (ImageView) findViewById(R.id.btnEnable);
                btnaAddTag = (Button) findViewById(R.id.btnAddTags);
                btnAddAlias = (Button) findViewById(R.id.btnAddAlias);
                btnListTag = (Button) findViewById(R.id.btnListTags);
                infoTextView = (TextView)findViewById(R.id.info);
                edTag = (EditText) findViewById(R.id.edTag);
                edAlias = (EditText) findViewById(R.id.edAlias);
                edAliasType = (EditText) findViewById(R.id.edAliasType);
                spAliasType = (Spinner) findViewById(R.id.spAliasType);
                
                edAliasType.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {  

                    @Override
                    public void onFocusChange(View v, boolean hasFocus) {
                            if(hasFocus) {
                                    edAliasTypeFocus = true;
                            } else {
                                    edAliasTypeFocus = false;
                            }
                    }

                });
                
                edAliasType.addTextChangedListener(new TextWatcher() {

                        @Override
                        public void beforeTextChanged(CharSequence s, int start, int count,
                                        int after) {
                                // TODO Auto-generated method stub
                                
                        }

                        @Override
                        public void onTextChanged(CharSequence s, int start, int before,
                                        int count) {
                                // TODO Auto-generated method stub
                                if(edAliasTypeFocus) {
                                        spAliasType.setSelection(0);
                                }
                        }

                        @Override
                        public void afterTextChanged(Editable s) {
                                // TODO Auto-generated method stub
                                
                        }
                        
                });
                
                String[] aliasType = new String[]{"Alias Type:",ALIAS_TYPE.SINA_WEIBO,ALIAS_TYPE.BAIDU,
                        ALIAS_TYPE.KAIXIN,ALIAS_TYPE.QQ,ALIAS_TYPE.RENREN,ALIAS_TYPE.TENCENT_WEIBO,
                        ALIAS_TYPE.WEIXIN};
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, aliasType);
                spAliasType.setAdapter(adapter);
                spAliasType.setBackgroundColor(Color.LTGRAY);
                spAliasType.setOnItemSelectedListener(new OnItemSelectedListener() {

                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1,
                                        int arg2, long arg3) {
                                // TODO Auto-generated method stub
                                TextView tv = (TextView)arg1;
                                if(tv != null) {
                                        int rate = (int)(5.0f*(float) screenWidth/320.0f);
                                        int textSize = rate < 15 ? 15 : rate;
                                        tv.setTextSize((float)textSize);
                                }
                                
                                if(arg2 != 0) {
                                        String type = (String)spAliasType.getItemAtPosition(arg2);
                                        edAliasType.setText(type);
                                } else if(!edAliasTypeFocus) {
                                        edAliasType.setText("");
                                }
                        }

                        @Override
                        public void onNothingSelected(AdapterView<?> arg0) {
                                // TODO Auto-generated method stub
                                
                        }
                        
                });
                
                tvStatus.setOnClickListener(clickListener);
                btnEnable.setOnClickListener(clickListener);
                btnaAddTag.setOnClickListener(clickListener);
                btnListTag.setOnClickListener(clickListener);
                btnAddAlias.setOnClickListener(clickListener);

                updateStatus();
                
                //此处是完全自定义处理设置
                //参考集成文档1.6.5#3
                //http://dev.umeng.com/push/android/integration#1_6_5
//                mPushAgent.setPushIntentServiceClass(MyPushIntentService.class);
        }
        
        @Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
        }

        private void printKeyValue() {
                //获取自定义参数
                Bundle bun = getIntent().getExtras();
                if (bun != null)
                {
                        Set<String> keySet = bun.keySet();
                        for (String key : keySet) {
                                String value = bun.getString(key);
                                Log.i(TAG, key + ":" + value);
                        }
                }
                
        }

        private void switchPush(){                
                String info = String.format("enabled:%s  isRegistered:%s",
                                mPushAgent.isEnabled(), mPushAgent.isRegistered());
                Log.i(TAG, "switch Push:" + info);

                btnEnable.setClickable(false);
                if (mPushAgent.isEnabled() || UmengRegistrar.isRegistered(MainActivity.this)) {
                        //开启推送并设置注册的回调处理
                        mPushAgent.disable(mUnregisterCallback);
                } else {
                        //关闭推送并设置注销的回调处理
                        mPushAgent.enable(mRegisterCallback);
                }
        }
        
        private void updateStatus() {
                String pkgName = getApplicationContext().getPackageName();
                String info = String.format("enabled:%s  isRegistered:%s  DeviceToken:%s " + 
                                "SdkVersion:%s AppVersionCode:%s AppVersionName:%s",
                                mPushAgent.isEnabled(), mPushAgent.isRegistered(),
                                mPushAgent.getRegistrationId(), MsgConstant.SDK_VERSION,
                                UmengMessageDeviceConfig.getAppVersionCode(this), UmengMessageDeviceConfig.getAppVersionName(this));
                tvStatus.setText("应用包名:"+pkgName+"\n"+info);
                
                btnEnable.setImageResource(mPushAgent.isEnabled()?R.drawable.open_button:R.drawable.close_button);
                btnEnable.setClickable(true);
                copyToClipBoard();
                
                Log.i(TAG, "updateStatus:" + String.format("enabled:%s  isRegistered:%s",
                                mPushAgent.isEnabled(), mPushAgent.isRegistered()));
                Log.i(TAG, "=============================");
        }

        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @SuppressLint("NewApi")
        @SuppressWarnings("deprecation")
        private void copyToClipBoard()
        {
                if (Build.VERSION.SDK_INT<11) 
                        return;
                String deviceToken = mPushAgent.getRegistrationId();
                if (!TextUtils.isEmpty(deviceToken))
                {
                        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                        clipboard.setText(deviceToken);
                        toast("DeviceToken已经复制到剪贴板了");                
                }
        }
        
        // sample code to add tags for the device / user
        private void addTag() {
                String tag = edTag.getText().toString();
                if (TextUtils.isEmpty(tag))
                {
                        toast("请先输入Tag");
                        return;
                }
                if (!mPushAgent.isRegistered())
                {
                        toast("抱歉,还未注册");
                        return;
                }

                showLoading();
                new AddTagTask(tag).execute();
                hideInputKeyboard();
        }

        // sample code to add tags for the device / user
        private void listTags() {
                if (!mPushAgent.isRegistered())
                {
                        toast("抱歉,还未注册");
                        return;
                }
                showLoading();
                new ListTagTask().execute();
        }

        // sample code to add alias for the device / user
        private void addAlias() {
                String alias = edAlias.getText().toString();
                String aliasType = edAliasType.getText().toString();
                if (TextUtils.isEmpty(alias))
                {
                        toast("请先输入Alias");
                        return;
                }
                if (TextUtils.isEmpty(aliasType))
                {
                        toast("请先输入Alias Type");
                        return;
                }
                if (!mPushAgent.isRegistered())
                {
                        toast("抱歉,还未注册");
                        return;
                }
                showLoading();
                new AddAliasTask(alias,aliasType).execute();
                hideInputKeyboard();
        }

        public void showLoading(){
                if (dialog == null){
                        dialog = new ProgressDialog(this);
                        dialog.setMessage("Loading");
                }
                dialog.show();
        }
        
        public void updateInfo(String info){
                if (dialog != null && dialog.isShowing())
                        dialog.dismiss();
                infoTextView.setText(info);
        }
        
        public OnClickListener clickListener  = new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                        // TODO Auto-generated method stub
                        if (v == btnaAddTag){
                                addTag();
                        }else if (v == btnAddAlias){
                                addAlias();
                        }else if (v == btnListTag){
                                listTags();
                        }else if (v == btnEnable){
                                switchPush();
                        }else if (v == tvStatus) {
                                updateStatus();
                        }
                }
        };
        
        public Handler handler = new Handler();
        
        //此处是注册的回调处理
        //参考集成文档的1.7.10
        //http://dev.umeng.com/push/android/integration#1_7_10
        public IUmengRegisterCallback mRegisterCallback = new IUmengRegisterCallback() {
                
                @Override
                public void onRegistered(String registrationId) {
                        // TODO Auto-generated method stub
                        handler.post(new Runnable() {
                                
                                @Override
                                public void run() {
                                        // TODO Auto-generated method stub
                                        updateStatus();
                                }
                        });
                }
        };
        
        //此处是注销的回调处理
        //参考集成文档的1.7.10
        //http://dev.umeng.com/push/android/integration#1_7_10
        public IUmengUnregisterCallback mUnregisterCallback = new IUmengUnregisterCallback() {
                
                @Override
                public void onUnregistered(String registrationId) {
                        // TODO Auto-generated method stub
                        handler.post(new Runnable() {
                                
                                @Override
                                public void run() {
                                        // TODO Auto-generated method stub
                                        updateStatus();
                                }
                        });
                }
        };
        
        private Toast mToast;
        public void toast(String str){
                if (mToast == null)
                        mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
                mToast.setText(str);
                mToast.show();
        }
        
        
        class AddTagTask extends AsyncTask<Void, Void, String>{

                String tagString;
                String[] tags;
                public AddTagTask(String tag) {
                        // TODO Auto-generated constructor stub
                        tagString = tag;
                        tags = tagString.split(",");
                }
                
                @Override
                protected String doInBackground(Void... params) {
                        // TODO Auto-generated method stub
                        try {
                                TagManager.Result result = mPushAgent.getTagManager().add(tags);
                                Log.d(TAG, result.toString());
                                return result.toString();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        return "Fail";
                }
                
                @Override
                protected void onPostExecute(String result) {
                        edTag.setText("");
                        updateInfo("Add Tag:\n" + result);
                }
        }
        
        class AddAliasTask extends AsyncTask<Void, Void, Boolean>{
                
                String alias;
                String aliasType;
                
                public AddAliasTask(String aliasString,String aliasTypeString) {
                        // TODO Auto-generated constructor stub
                        this.alias = aliasString;
                        this.aliasType = aliasTypeString;
                }
                
                protected Boolean doInBackground(Void... params) {
                        try {
                                return mPushAgent.addAlias(alias, aliasType);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        return false;
                }

                @Override
                protected void onPostExecute(Boolean result) {
                        if (Boolean.TRUE.equals(result)) 
                                Log.i(TAG, "alias was set successfully.");
                        
                        edAlias.setText("");
                        updateInfo("Add Alias:" + (result?"Success":"Fail"));
                }

        }
        
        class ListTagTask extends AsyncTask<Void , Void, List<String>>{
                @Override
                protected List<String> doInBackground(Void... params) {
                        List<String> tags = new ArrayList<String>();
                        try {
                                tags = mPushAgent.getTagManager().list();
                                Log.d(TAG, String.format("list tags: %s", TextUtils.join(",", tags)));
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        return tags;
                }

                @Override
                protected void onPostExecute(List<String> result) {
                        if (result != null) {
                                StringBuilder info = new StringBuilder();
                                info.append("Tags:\n");
                                for (int i=0; i<result.size(); i++){
                                        String tag = result.get(i);
                                        info.append(tag+"\n");
                                }
                                info.append("\n");
                                updateInfo(info.toString());
                        } else {
                                updateInfo("");
                        }
                }
        }
        
        public void hideInputKeyboard()
        {
                ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(getCurrentFocus()
                .getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);
        }
}


测试日志:



开发文档
关于友盟推送的Android SDK简单集成指南,
请点击查看
在使用友盟推送中遇到问题的请点击参考友盟消息推送问题索引
注:本文章改编自DevStore 官网。












上一篇:android demo 自定义消息处理代码示例
下一篇:推送消息失败




老辛
老辛 发表于 2015-10-21 16:32:34 | 显示全部楼层
uuuuu 发表于 2015-9-14 10:08
请问如何手动忽略某个推送的消息???? 2.4.1版本

手动忽略消息具体是指什么呢?用户可以在手机上手动滑动忽略某条通知,
或者点击清除来忽略所有通知

yz1015060206
yz1015060206 发表于 2016-1-20 15:54:20 | 显示全部楼层
我推送操作中的应用更新操作会出现“您的自动更新SDK版本过低,需2.6.0及以上才能使用此服务,请更新到最新版SDK”这样的问题,是不是现在的推送还没发更新应用。我那边更新的sdk是从官网下的

毛毛虫的追求
毛毛虫的追求 发表于 2016-3-9 16:54:21 | 显示全部楼层
这种文档是给友盟自己人看的别人谁能看懂??看懂的人回复下 我看看有几个装B的


Y147
Y147 发表于 2016-8-2 14:43:58 | 显示全部楼层

zhaoheng
zhaoheng 发表于 2016-8-3 09:31:11 | 显示全部楼层
Y147 发表于 2016-8-2 14:43
楼主辛苦,但。。作为小白,还是看不懂,如何集成,如何集成进已有APP里

http://dev.umeng.com/push/android/integration你看下我们官方网站的集成文档吧,里面写的很清楚

南朝小木瓜
南朝小木瓜 发表于 2016-9-19 14:12:33 | 显示全部楼层
按照官方文档的在application里重写了dealWithNotificationMessage方法,但是在里面想打印收到的通知内容却没执行到,明明设备的log显示出发送过来的消息了..该咋整
您需要登录后才可以发帖 登录 | 立即注册

本版积分规则

发表主题

精彩推荐

当前最新版本的umeng_android_social_sdk_6.4.5_custom\social_sdk_exampl
Android 2.3.3 根本就打不开。见附图所示。
贵州快3对子大神群328444-Seems so easy
贵州快3对子大神群328444-Seems so easy 时序深冬,气温骤降, 鹅毛漫卷,万里苍苍。天地瞬间浑为一体,原
【报错必看】微信您的应用签名不正确,请去微信后台确认
微信如果提示这个错误,请查看debug日志: 箭头所指的为你当前应用的签名及包名,然后打开你的微信后台

关注我们

新浪微博
微信

欢迎关注友盟官方微博微信!

在线客服
返回顶部 返回列表