总体来说,友盟里面的东西还是不错的,这段时间,一直在用友盟,感触最深的就是 做分享的时候,有的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.找到消息推送 点击它 这是选择项目名 添加包名 这时得出一些信息  如下:

android qq友盟分享 安卓友盟_分享

  

 

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() {

					@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);
						}
						Toast.makeText(context, msg.custom, Toast.LENGTH_LONG)
								.show();
					}
				});*/
			}

			// 接收到推送消息
			@Override
			public 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==广播)
			@Override
			public 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() {

										@Override
										public 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);
        }
    }



上述 是我自己写的分享 有一个问题 多个用户怎么授权 相互切换分享   授权的好像挺长的  只要获取用户信息  应该可以实现 如大家有什么好的想法 一起交流交流。