Android 友盟更新、推送、分享
来源:互联网 发布:皇室战争淘宝慢充原理 编辑:程序博客网 时间:2024/06/06 15:37
总体来说,友盟里面的东西还是不错的,这段时间,一直在用友盟,感触最深的就是 做分享的时候,有的Android机型是不可以的分享的,直接报错,我用的是友盟的4.3 有一部手机是Android5.0的 当分享sina时 报错 找了各种资料 最后改动了一个文件类,同事帮忙解决了 ( ^_^ ) 有一个华为手机 分享QQ空间 直接手机无响应,这是个别的手机,方正Android机型太多了 太多奇葩了 有的人可能会说用ShareSDK 我感觉不错用哪个第三方 ,遇到问题了都要解决的 我们做这个项目之前用过推送和更新版本,所以直接用了友盟分享,总之 还是不错的。
更新
1.在友盟官网上注册 http://www.umeng.com/ 一个应用 ,填写你的应用名、选择开发语言,这是可以得到一个appkey 唯一的!
2.在项目中填写刚才我们得到的appkey(android:value="")
<meta-data
android:name="UMENG_APPKEY"
android:value="@string/umeng_ak_test">
</meta-data>
3.导入友盟的jar包和资源文件
下载友盟最新的SDK 把lib文件夹下面的文件拷贝到项目中 res 也是一样的
4.配置友盟权限和方法
<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.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <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.CALL_PHONE" /> <!-- Permission for Unit Test --> <uses-permission android:name="android.permission.GET_TASKS" />
<!-- Update Activitys Start --> <activity android:name="com.umeng.update.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity> <!-- Update Activitys End --> <!-- Caution! Do not change this app key. It is only for demo usage. --> <meta-data android:name="UMENG_APPKEY" android:value="" > </meta-data> <meta-data android:name="UMENG_CHANNEL" android:value="Umeng" > </meta-data> <service android:name="com.umeng.update.net.DownloadingService" android:process=":DownloadingService" > </service>
5.自动更新和手动更新版本
自动更新:
友盟自动更新服务首先将用户终端上的应用版本信息(version code)与友盟服务器上开发者上传的应用版本信息进行比较。如果服务器的应用版本更高,则会提示用户有新的应用版本(提示如下图所示,开发者可自定义界面)。用户选择更新之后,友盟自动更新则开始下载新版本应用,然后安装此应用。
在启动的Mainactivity 中 调用自动更新的方法:
//友盟版本更新 UmengUpdateAgent.setDefault(); UmengUpdateAgent.setDeltaUpdate(false); /*UmengUpdateAgent.setUpdateOnlyWifi(false);//在所有网络环境中均检测更新//自己处理检测更新的结果可以按如下步骤,禁止弹出对话框或者通知栏,实现更新监听接口UmengUpdateAgent.setUpdateAutoPopup(false);//禁止弹出更新提示的对话框/通知栏*/ UmengUpdateAgent.update(this);
手动更新:
手动更新 前提是,我们先上传一个apk到友盟上 列如:versionCode =2 versionName=2 修改客户端的版本信息,列如:versionCode =1 versonName =1 这时会发生版本更新。
通过点击一个button按钮 ,具体代码如下:
先获取项目的版本号:
public static String getAppVersion(Context context) {try {PackageManager manager = context.getPackageManager();PackageInfo info = manager.getPackageInfo(context.getPackageName(),0);return info.versionName;} catch (Exception e) {e.printStackTrace();return "1.0.0";}}
再通过客户端和友盟上的apk做比较 看看是否更新版本 具体代码如下:
showProgressDialog(R.string.get_latest_version_info); UmengUpdateAgent.setDefault(); UmengUpdateAgent.setUpdateOnlyWifi(false);//在所有网络环境中均检测更新 //自己处理检测更新的结果可以按如下步骤,禁止弹出对话框或者通知栏,实现更新监听接口 UmengUpdateAgent.setUpdateAutoPopup(false);//禁止弹出更新提示的对话框/通知栏 UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() { @Override public void onUpdateReturned(int updateStatus, UpdateResponse updateInfo) { dismissProgressDialog(); switch (updateStatus) { case UpdateStatus.Yes: // has update if (!AboutActivity.this.isFinishing()) UmengUpdateAgent.showUpdateDialog(mContext, updateInfo); break; case UpdateStatus.No: // has no update if (!AboutActivity.this.isFinishing()) Toast.makeText(mContext, R.string.latest_version, Toast.LENGTH_SHORT).show(); break; case UpdateStatus.NoneWifi: // none wifi if (!AboutActivity.this.isFinishing()) Toast.makeText(mContext, R.string.update_no_wifi, Toast.LENGTH_SHORT).show(); break; case UpdateStatus.Timeout: // time out if (!AboutActivity.this.isFinishing()) Toast.makeText(mContext, R.string.update_time_out, Toast.LENGTH_SHORT).show(); break; } } }); //无论网络状况是否Wifi,无论用户是否忽略过该版本的更新,都发起更新检查 UmengUpdateAgent.forceUpdate(this);
以上就是介绍友盟其中一个 版本更新功能。
推送
1.找到消息推送 点击它 这是选择项目名 添加包名 这时得出一些信息 如下:
2.下载最新的SDK 添加libs和resource 文件拷贝到项目中
3.配置清单文件
<!-- 友盟配置 --> <receiver android:name="com.umeng.message.NotificationProxyBroadcastReceiver" android:exported="false" /> <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.gudeng.smallbusiness.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:exported="true" android:label="PushService" android:process=":push"> <intent-filter> <action android:name="com.gudeng.smallbusiness.intent.action.START" /> </intent-filter> <intent-filter> <action android:name="com.gudeng.smallbusiness.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:exported="true" android:process=":push"> <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> <!-- V1.3.0添加的service,负责下载通知的资源 --> <service android:name="com.umeng.message.UmengDownloadResourceService" />
上述出现这个 列如:com.gudeng.smallbusiness 改成自己的应用包名。
4.开启推送服务 在项目的application中 写友盟推送的方法,
友盟配置:
private boolean isDebugMode = true;//正式版要改关闭private String device_token;private PushAgent mPushAgent;private void initUmengPush() {mPushAgent = PushAgent.getInstance(this);mPushAgent.setDebugMode(isDebugMode);//注意 正式发布应用时,请务必将本开关关闭,避免影响用户正常使用APP。mPushAgent.enable();device_token = UmengRegistrar.getRegistrationId(this);//获取手机device token 唯一的Log.d(TAG, "device token: " + device_token);initPushMessage();//处理推送信息initPushNotification();//处理推送消息的点击事件}
消息的处理方式:
public void initPushMessage() {/** * 该Handler是在IntentService中被调用,故 1. * 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK 2. * IntentService里的onHandleIntent方法是并不处于主线程中,因此,如果需调用到主线程,需如下所示; * 或者可以直接启动Service * */UmengMessageHandler messageHandler = new UmengMessageHandler() {public void dealWithCustomMessage(final Context context,final UMessage msg) {/*new Handler(getMainLooper()).post(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub// 对自定义消息的处理方式,点击或者忽略boolean isClickOrDismissed = true;if (isClickOrDismissed) {// 自定义消息的点击统计UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);} else {// 自定义消息的忽略统计UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);}Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();}});*/}// 接收到推送消息@Overridepublic Notification getNotification(Context context, UMessage msg) {switch (msg.builder_id) {case 1:/* * NotificationCompat.Builder builder = new * NotificationCompat.Builder(context); RemoteViews * myNotificationView = new * RemoteViews(context.getPackageName(), * R.layout.notification_view); * myNotificationView.setTextViewText * (R.id.notification_title, msg.title); * myNotificationView.setTextViewText * (R.id.notification_text, msg.text); * myNotificationView.setImageViewBitmap * (R.id.notification_large_icon, getLargeIcon(context, * msg)); builder.setContent(myNotificationView); * builder.setContentTitle(msg.title) * .setContentText(msg.text) .setTicker(msg.ticker) * .setAutoCancel(true); Notification mNotification = * builder.build(); //由于Android * v4包的bug,在2.3及以下系统,Builder创建出来的Notification * ,并没有设置RemoteView,故需要添加此代码 mNotification.contentView = * myNotificationView; return mNotification; */return null;default:// 默认为0,若填写的builder_id并不存在,也使用默认。return super.getNotification(context, msg);}}};mPushAgent.setMessageHandler(messageHandler);}
处理推送消息的点击事件:
public void initPushNotification() {/** * 该Handler是在BroadcastReceiver中被调用,故 * 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK * */UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {/* * @Override public void dealWithCustomAction(Context arg0, UMessage * arg1) { // TODO Auto-generated method stub * super.dealWithCustomAction(arg0, arg1); } * * @Override public void handleMessage(Context context, UMessage * msg) { try { Intent intent=new Intent(); Log.i(TAG, "custom=" + * msg.ticker); // 自定义消息的内容 Log.i(TAG, "title=" + msg.title); // * 通知标题 Log.i(TAG, "text=" + msg.text); // 通知内容 Log.i(TAG, * "extra:"+msg.extra.get("openmenu").toString()); * intent.putExtra("open", msg.extra.get("openmenu").toString()); * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); * intent.setClass(context, MainActivity.class); * context.startActivity(intent); } catch (Exception e) { * e.printStackTrace(); * * * } } * * * * @Override public void launchApp(Context context, UMessage msg) { * // TODO Auto-generated method stub super.launchApp(context, msg); * * } */// 判断是否是广播还是单播(1==单播,2==广播)@Overridepublic void openActivity( Context context, UMessage msg) {// super.openActivity(context, msg);String spre = SPreferenceUtils.getInstance().getUserId("");Log.e(TAG, "----spre---" + spre);if (spre.isEmpty() || spre.equals("")) {/*AlertDialog.Builder alert = new AlertDialog.Builder(context);alert.setTitle("提示:").setMessage("您还没有登录或注册").setNegativeButton("", null).setPositiveButton("跳转",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {Intent intent = new Intent(context,LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}}).create().show();*/Intent intent = new Intent(getAppContext(),LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} else {try {Log.d(TAG, "custom=" + msg.ticker); // 自定义消息的内容Log.d(TAG, "title=" + msg.title); // 通知标题Log.d(TAG, "text=" + msg.text); // 通知内容Log.d(TAG, "icon=" + msg.largeIcon);Log.d(TAG, "extra:" + msg.getRaw().toString());Log.d(TAG, "open ======================"+ msg.extra.get("openmenu").toString());String name = msg.extra.get("openmenu");Intent intent=new Intent();intent.putExtra("openmenu", name);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setClass(context,MainActivity.class);startActivity(intent);} catch (Exception e) {e.printStackTrace();}}}};mPushAgent.setNotificationClickHandler(notificationClickHandler);}
上面的推送到判断方法 是我从公司项目中复制过来的。 以上四步 ,可以接收消息推送了,如接收不到或其他问题,查看文档和论坛。
分享
分享今天刚做完 友盟4.3的和现在最新的5.0.1有很大的区别 jar包改变了,里面要实现的方法也改了 不过 我感觉还是4.3 还是不错的。
1.导入必要的jar文件和资源文件
2.配置 分享
<!-- ###################注册SDK使用的Activity###################### --> <!--分享编辑页--> <activity android:name="com.umeng.socialize.view.ShareActivity" android:configChanges="orientation|keyboard" android:launchMode="singleTask" android:noHistory="true" android:theme="@style/Theme.UMDialog" android:windowSoftInputMode="stateVisible|adjustResize" > </activity> <!-- ############ QQ空间和QQ SSO授权的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" /> <!-- scheme,如果你使用的公用账号,则不需要修改;否则修改成你在QQ开放平台申请的 APP ID--> <data android:scheme="tencent1104980099" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:screenOrientation="portrait"> </activity> <!-- 微信分享 --> <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" />
上述 我只用了微信分享 分享微信好友、QQ好友分享 QQ空间分享、新浪微博分享。
3实现分享
// 首先在您的Activity中添加如下成员变量 final UMSocialService mController = UMServiceFactory .getUMSocialService("com.umeng.share"); private String title; private View viewShare; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected int getContentLayoutId() { return R.layout.activity_share; } @Override protected void initTitleBar() { TitleBar bar = (TitleBar) titleBar; bar.setLeftText(R.string.back); bar.setLeftClickEvent(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); bar.setTitle(R.string.more_share); bar.setBackgroundResource(R.color.title_green); } @Override protected void initView() { viewShare=findViewById(R.id.rl_bottom); viewShare.setOnClickListener(this); mController.setShareContent(this.getResources().getString(R.string.share_content)); // 设置分享图片, 参数2为图片的url地址 mController.setShareMedia(new UMImage(this, R.drawable.android_template)); //------------------------------------添加微信平台--------------------------------------//// String appId = "wxea1e424e7a8eb674";// String appSecret = "54398416ea66e386a2f5c37d532b78ed"; UMWXHandler wxHandler = new UMWXHandler(this,getResources().getString(R.string.wx_app_id),getResources().getString(R.string.wx_app_secret)); wxHandler.addToSocialSDK(); // 设置微信好友分享内容 WeiXinShareContent weixinContent = new WeiXinShareContent(); // 设置分享文字 weixinContent.setShareContent(this.getResources().getString(R.string.share_content)); // 设置title weixinContent.setTitle(this.getResources().getString(R.string.app_name)); // 设置分享内容跳转URL weixinContent.setTargetUrl(this.getResources().getString(R.string.download_url)); // 设置分享图片 weixinContent.setShareImage(new UMImage(getApplicationContext(), R.mipmap.android_template)); mController.setShareMedia(weixinContent); //------------------------------------添加微信平台--------------------------------------// //------------------------------------添加微信朋友圈--------------------------------------// UMWXHandler wxCircleHandler = new UMWXHandler(this,getResources().getString(R.string.wx_app_id),getResources().getString(R.string.wx_app_secret)); // 设置微信朋友圈分享内容 CircleShareContent circleMedia = new CircleShareContent(); circleMedia.setShareContent(this.getResources().getString(R.string.share_content)); // 设置朋友圈title circleMedia.setTitle(this.getResources().getString(R.string.app_name)); circleMedia.setShareImage(new UMImage(getApplicationContext(), R.mipmap.android_template)); circleMedia.setTargetUrl(this.getResources().getString(R.string.download_url)); mController.setShareMedia(circleMedia); wxCircleHandler.setToCircle(true); wxCircleHandler.addToSocialSDK(); //------------------------------------添加微信朋友圈--------------------------------------// //------------------------------------分享QQ好友--------------------------------------// UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(this, getResources().getString(R.string.qq_app_id), getResources().getString(R.string.qq_app_secret)); qqSsoHandler.addToSocialSDK(); QQShareContent qqShareContent = new QQShareContent(); // 设置分享title qqShareContent.setTitle(this.getResources().getString(R.string.app_name)); // 设置分享文字 qqShareContent.setShareContent(this.getResources().getString(R.string.share_content)); // 设置分享图片 qqShareContent.setShareImage(new UMImage(this, R.mipmap.android_template)); // 设置点击分享内容的跳转链接 qqShareContent.setTargetUrl(getResources().getString(R.string.download_url)); mController.setShareMedia(qqShareContent); //------------------------------------分享QQ好友--------------------------------------// //-------------------------SSO(免登录)分享到QQ空间------------------------// QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(this, getResources().getString(R.string.qq_app_id), getResources().getString(R.string.qq_app_secret)); qZoneSsoHandler.addToSocialSDK(); QZoneShareContent qzone = new QZoneShareContent(); // 设置分享文字 qzone.setShareContent(this.getResources().getString(R.string.share_content)); // 设置点击消息的跳转URL qzone.setTargetUrl(getResources().getString(R.string.download_url)); // 设置分享内容的标题 qzone.setTitle(this.getResources().getString(R.string.app_name)); // 设置分享图片 qzone.setShareImage(new UMImage(this, R.mipmap.android_template)); mController.setShareMedia(qzone); //-------------------------SSO(免登录)分享到QQ空间------------------------// // 设置新浪SSO handler mController.getConfig().setSsoHandler(new MySinaSsoHandler()); // 添加短信 SmsHandler smsHandler = new SmsHandler(); smsHandler.addToSocialSDK(); } @Override protected void initData() { } @Override public void onClick(View view) { if (view.getId() == R.id.left_btn) { finish(); } else if(view.getId() == R.id.rl_bottom){ mController.getConfig().removePlatform(SHARE_MEDIA.RENREN, SHARE_MEDIA.DOUBAN,SHARE_MEDIA.TENCENT); //默认分享方式 mController.openShare(this, false); } } /** * 配置SSO授权回调 * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); /**使用SSO授权必须添加如下代码 */ UMSsoHandler ssoHandler = mController.getConfig().getSsoHandler(requestCode) ; if(ssoHandler != null){ ssoHandler.authorizeCallBack(requestCode, resultCode, data); } }
上述 是我自己写的分享 有一个问题 多个用户怎么授权 相互切换分享 授权的好像挺长的 只要获取用户信息 应该可以实现 如大家有什么好的想法 一起交流交流。
- Android 友盟更新、推送、分享
- 友盟推送使用分享
- 【源码分享下载】每日更新之Android源码之百度云推送
- android 主动推送技术分享
- Android消息推送(技术分享)
- Android友盟推送
- Android 友盟统计 友盟推送 友盟分享快速集成
- Android学习之友盟5.0推送,分享踩坑总结
- Android友盟消息推送
- 集成友盟推送android
- Android集成友盟推送
- Android友盟推送接入
- 友盟数据统计、消息推送、社会化分享
- 友盟分享及推送心得---遇到的问题总结
- android 友盟分享
- android分享 ------ 友盟分享(续)
- Android集成友盟推送功能
- Android之集成友盟推送功能
- Hive学习4_Hive on Spark: Getting Started_Common Issues
- MySql—解压缩版本的安装与配制
- NGUI 导入,场景准备
- android 新特性material design 之recyclerview 详解
- USB枚举过程分析
- Android 友盟更新、推送、分享
- HDU-3887-Counting Offspring-dfs序+树状数组
- NotePad++ - 安装和配置C/C++开发插件
- jQuery选择器上
- material progressbar颜色设置
- 一只R语言de爬虫
- java调用外部webservice的实例
- 【整理】unity3d优化总结篇
- vc获取Access/ SqlServer 获取主键