总体来说,友盟里面的东西还是不错的,这段时间,一直在用友盟,感触最深的就是 做分享的时候,有的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() {
@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);
}
}
上述 是我自己写的分享 有一个问题 多个用户怎么授权 相互切换分享 授权的好像挺长的 只要获取用户信息 应该可以实现 如大家有什么好的想法 一起交流交流。