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);        }    }

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






0 0
原创粉丝点击