个推(消息推送)
Demo
快速入门说明;
步骤:
- 用自己的开发者账号登陆个推,进入控制界面;
- 在左侧菜单中选择 " 应用管理 ==> 应用管理 ==> 登记新应用"
在 "应用名称" 和 "应用标识" 中填入相应内容;
名称随便取,标识是app的package name; - 登记完新应用后,单击 " 应用管理 ==> 应用管理 ==> 应用详情 " 中看到各应用对应的详情信息;
- 下载SDK,解压,在文件夹中的 " 客户端/需要导入的资源 " 中,将armeabi文件夹及GetuiExt-x.x.x.jar、GetuiSdk-x.x.x.x.jar拷贝到项目中的libs目录(若无该目录,自建一个);
- 在项目的AndroidManifest中增加如下权限和服务声明:
权限:
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
- <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permissionandroid:name="android.permission.VIBRATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permissionandroid:name="getui.permission.GetuiService"/>
- <uses-permissionandroid:name="android.permission.GET_TASKS"/>
- <!--自定义权限-->
- <permission
- android:name="getui.permission.GetuiService"
- android:protectionLevel="normal">
- </permission>
在<Application>标签内添加服务声明,并修改相应app信息(参见推控制台中的 " 应用管理 ==> 应用管理 ==> 应用详情 " ):
- <!--个推SDK配置开始-->
- <!--配置第三方应用参数属性-->
- <meta-data
- android:name="PUSH_APPID"
- android:value="YOUR_APPID"/><!--替换为第三方应用的APPID-->
- <meta-data
- android:name="PUSH_APPKEY"
- android:value="YOUR_APPKEY"/><!--替换为第三方应用的APPKEY-->
- <meta-data
- android:name="PUSH_APPSECRET"
- android:value="YOUR_APPSECRET"/><!--替换为第三方应用的APPSECRET-->
- <meta-data
- android:name="PUSH_GROUPID"
- android:value=""/>
- <!--配置SDK核心服务-->
- <service
- android:name="com.igexin.sdk.PushService"
- android:exported="true"
- android:label="NotificationCenter"
- android:process=":pushservice">
- </service>
- <receiver
- android:name="com.igexin.sdk.PushReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"/>
- <actionandroid:name="android.intent.action.USER_PRESENT"/>
- <actionandroid:name="com.igexin.sdk.action.refreshls"/>
- </intent-filter>
- </receiver>
- <receiver
- android:name="com.igexin.sdk.PushReceiver"
- android:exported="false">
- <intent-filter>
- <actionandroid:name="com.igexin.sdk.action.pushmanager"/>
- </intent-filter>
- </receiver>
- <activity
- android:name="com.igexin.sdk.PushActivity"
- android:excludeFromRecents="true"
- android:exported="false"
- android:process=":pushservice"
- android:taskAffinity="com.igexin.sdk.PushActivityTask"
- android:theme="@android:style/Theme.Translucent.NoTitleBar">
- </activity>
- <!--配置弹框activity-->
- <activity
- android:name="com.igexin.getuiext.activity.GetuiExtActivity"
- android:configChanges="orientation|keyboard|keyboardHidden"
- android:excludeFromRecents="true"
- android:process=":pushservice"
- android:taskAffinity="android.task.myServicetask"
- android:theme="@android:style/Theme.Translucent.NoTitleBar"
- android:exported="false"/>
- <receiver
- android:name="com.igexin.getuiext.service.PayloadReceiver"
- android:exported="false">
- <intent-filter>
- <!--这个com.igexin.sdk.action.7fjUl2Z3LH6xYy7NQK4ni4固定,不能修改-->
- <actionandroid:name="com.igexin.sdk.action.7fjUl2Z3LH6xYy7NQK4ni4"/>
- <!--替换为android:name="com.igexin.sdk.action.第三方的appId"-->
- <actionandroid:name="com.igexin.sdk.action.YOUR_APPID"/>
- </intent-filter>
- </receiver>
- <service
- android:name="com.igexin.getuiext.service.GetuiExtService"
- android:process=":pushservice"/>
- <!--个推download模块配置-->
- <service
- android:name="com.igexin.download.DownloadService"
- android:process=":pushservice"/>
- <receiver
- android:name="com.igexin.download.DownloadReceiver">
- <intent-filter>
- <actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"/>
- </intent-filter>
- </receiver>
- <provider
- android:name="com.igexin.download.DownloadProvider"
- android:process=":pushservice"
- android:authorities="downloads.com.getui.demo"/><!--替换为downloads.第三方包名-->
- <!--===========================================================================-->
- 初始化SDK
- importcom.igexin.sdk.PushManager;
- PushManager.getInstance().initialize(this.getApplicationContext());
- 配置到此完成,之后在个推控制台中 " 推送通知 ==> 新消息 " 中 "选择应用" 并 填写 " 通知标题 " 和 " 通知内容 " 等信息,单击下方的 " 发送通知 " 即可;
友盟(统计/反馈等)
开发文档:
作用: 应用统计及用户反馈等
应用统计
- 注册开发者账号,登录即可进入主页面:
- 单击左侧 " 下载SDK " 按需下载 , 并 " 添加新应用 " :
- 解压SDK,将libs目录下的文件合并到本地项目libs目录中;
- 添加权限:
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
- 在Application标签内设置key值(Appkey可在统计后台的 统计分析->设置->应用信息 页面查看):
- <meta-dataandroid:value="YOUR_APP_KEY"android:name="UMENG_APPKEY"></meta-data>
- <meta-dataandroid:value="ChannelID"android:name="UMENG_CHANNEL"/>
- 在每个Activity中集成如下代码,以便获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据:
- publicvoidonResume(){
- super.onResume();
- MobclickAgent.onResume(this);
- }
- publicvoidonPause(){
- super.onPause();
- MobclickAgent.onPause(this);
- }
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口来自定义这个间隔(参数单位为毫秒):
- MobclickAgent.setSessionContinueMillis(longinterval)
- 设置发送策略:
在程序入口Activity中集成代码:
- MobclickAgent.updateOnlineConfig(mContext);
- 配置结束,启动App,即可登陆umeng后台查看数据;
用户反馈
- 类似上面的操作,导入用户反馈的jar包,并将res目中layout/drawable/anim下的文件集成到本地项目中;
- 在项目manifest内声明相关Activity:
- <!--友盟"反馈意见"-->
- <activity
- android:name="com.umeng.fb.ConversationActivity"
- android:theme="@android:style/Theme.NoTitleBar"/>
- <activity
- android:name="com.umeng.fb.ContactActivity"
- android:theme="@android:style/Theme.NoTitleBar"/>
- <!--友盟统计-->
- <meta-data
- android:name="UMENG_APPKEY"
- android:value="yourappKey">
- </meta-data>
- <meta-data
- android:name="UMENG_CHANNEL"
- android:value="chanelid"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 若开发者回复用户反馈后,需要提醒用户,则在程序入口Activity的onCreate()方法中设置:
- //友盟反馈意见
- FeedbackAgentagent=newFeedbackAgent(this);
- agent.sync();
- 按需设置页面跳转:
- startActivity(mContent,ConversationActivity.class));
- 完成用户反馈功能集合,若有需要可执行修改layout等文件;
百度地图
官网;
开发文档;
基础地图
- 准备动作都一样:注册开发者账号,登记应用,获取appID等信息;
登录后,单击右上角的"API控制台==> 创建应用 " ,按需填入信息即可获得 " 访问应用(ak) ",就是后面需要用到的密匙key了;
注意; 安全码由 " 数字签名 + 分号 + 包名 " 组成,其中数字签名在 Eclipse ==> window ==> preferences ==> Android ==> Build ==> SHA1 fingerprint; - 下载所需的sdk;
- 合并libs目录:
将armeabi目录下的libBaiduMapSDK_vx_x_x.so拷贝到本地项目同名文件夹内;
将BaiduLBS_Android.jar拷贝到本地项目libs目录内; - 配置Manifest:
在application标签内添加密匙key:
- <meta-data
- android:name="com.baidu.lbsapi.API_KEY"
- android:value="yourkey"/>
- <!--基础地图-->
- <uses-permissionandroid:name="android.permission.GET_ACCOUNTS"/>
- <uses-permissionandroid:name="android.permission.USE_CREDENTIALS"/>
- <uses-permissionandroid:name="android.permission.MANAGE_ACCOUNTS"/>
- <uses-permissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
- <uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>
- <uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/>
- <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>
- <!--基础地图与定位功能共有的权限-->
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- 在Activity的布局xml文件件中添加地图控件:
- <com.baidu.mapapi.map.MapView
- android:id="@+id/bmapView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clickable="true"/>
- 在程序中初始化百度地图SDK并管理其生命周期:
- publicclassMainActivityextendsActivity{
- MapViewmMapView=null;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //在使用SDK各组件之前初始化context信息,传入ApplicationContext
- //注意该方法要再setContentView方法之前实现
- SDKInitializer.initialize(getApplicationContext());
- setContentView(R.layout.activity_main);
- //获取地图控件引用
- mMapView=(MapView)findViewById(R.id.bmapView);
- }
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
- mMapView.onDestroy();
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- //在activity执行onResume时执行mMapView.onResume(),实现地图生命周期管理
- mMapView.onResume();
- }
- @Override
- protectedvoidonPause(){
- super.onPause();
- //在activity执行onPause时执行mMapView.onPause(),实现地图生命周期管理
- mMapView.onPause();
- }
- }
定位功能
- 下载SDK,解压后将libs下的BaiduLBS_Android.jar 、locSDK_3.1.jar及armeabi下的libBaiduMapSDK_v3_1_0.so、liblocSDK4d.so拷贝到项目中;
- 配置Manifest:
设置密匙key:
- <meta-data
- android:name="com.baidu.lbsapi.API_KEY"
- android:value="yourkey"/>
- <!--定位权限-->
- <!--这个权限用于进行网络定位-->
- <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <!--这个权限用于访问GPS定位-->
- <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
- <!--SD卡读取权限,用户写入离线定位数据-->
- <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!--允许应用读取低级别的系统日志文件-->
- <uses-permissionandroid:name="android.permission.READ_LOGS"/>
- <!--基础地图与定位功能共有的权限-->
- <!--写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!--用于读取手机当前的状态-->
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
- <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
- <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
- <!--访问网络,网络定位需要上网-->
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <!--定位-->
- <service
- android:name="com.baidu.location.f"
- android:enabled="true"
- android:process=":remote"/>
- 同地图基础功能中第5/6条 : 添加地图控件及生命周期管理;
- 在onCreate()方法中初始化定位功能并运行:
- super.onCreate(savedInstanceState);
- SDKInitializer.initialize(getApplicationContext());
- setContentView(R.layout.activity_main);
- //地图初始化
- mMapView=(MapView)findViewById(R.id.bmapView);
- mBaiduMap=mMapView.getMap();
- //定位
- mCurrentMode=LocationMode.NORMAL;
- mBaiduMap.setMyLocationConfigeration(newMyLocationConfiguration(
- mCurrentMode,true,mCurrentMarker));
- //地图初始化显示精度
- MapStatusmMapStatus=newMapStatus.Builder().zoom(14).build();
- MapStatusUpdatemMapStatusUpdate=MapStatusUpdateFactory
- .newMapStatus(mMapStatus);
- mBaiduMap.setMapStatus(mMapStatusUpdate);
- //开启定位图层
- mBaiduMap.setMyLocationEnabled(true);
- //定位初始化
- mLocClient=newLocationClient(this);
- mLocClient.registerLocationListener(myListener);//myListener为自定义监听函数,见下一步
- LocationClientOptionoption=newLocationClientOption();
- option.setOpenGps(true);//打开gps
- option.setCoorType("bd09ll");//设置坐标类型
- option.setScanSpan(1000);
- mLocClient.setLocOption(option);
- //別忘了运行
- mLocClient.start();
- //百度地图初始化精度
- intBAIDU_MAP_5KM=12;
- intBAIDU_MAP_2KM=13;
- intBAIDU_MAP_1KM=14;
- intBAIDU_MAP_500M=15;
- intBAIDU_MAP_200M=16;
- intBAIDU_MAP_100M=17;
- intBAIDU_MAP_50M=18;
- 设置定位SDK监听函数:
- publicclassMyLocationListennerimplementsBDLocationListener{
- @Override
- publicvoidonReceiveLocation(BDLocationlocation){
- //mapview销毁后不在处理新接收的位置
- if(location==null||mMapView==null)
- return;
- floatradius=location.getRadius();
- MyLocationDatalocData=newMyLocationData.Builder()
- .accuracy(radius)
- //此处设置开发者获取到的方向信息,顺时针0-360
- .direction(100).latitude(location.getLatitude())
- .longitude(location.getLongitude()).build();
- mBaiduMap.setMyLocationData(locData);
- if(isFirstLoc){
- isFirstLoc=false;
- LatLngll=newLatLng(location.getLatitude(),
- location.getLongitude());
- MapStatusUpdateu=MapStatusUpdateFactory.newLatLng(ll);
- mBaiduMap.animateMapStatus(u);
- }
- <spanstyle="white-space:pre"></span>//添加悬浮物
- initOverlay(location);
- }
- publicvoidonReceivePoi(BDLocationpoiLocation){
- }
- }
- 添加悬浮物函数:
- //设置悬浮物
- privatebooleanisShowInfoWindow;
- privateInfoWindowmInfoWindow;
- publicvoidinitOverlay(BDLocationlocation){
- //定义Maker坐标点
- LatLngpoint=newLatLng(location.getLatitude()+0.01,
- location.getLongitude()+0.01);
- //构建Marker图标
- BitmapDescriptorbitmap=BitmapDescriptorFactory
- .fromResource(R.drawable.icon_tab_near_pressed);
- //构建MarkerOption,用于在地图上添加Marker
- OverlayOptionsoption=newMarkerOptions().position(point)
- .icon(bitmap);
- markerA=(Marker)mBaiduMap.addOverlay(option);
- //Marker点击事件
- mBaiduMap.setOnMarkerClickListener(newOnMarkerClickListener(){
- @Override
- publicbooleanonMarkerClick(Markerarg0){
- if(isShowInfoWindow){
- mBaiduMap.hideInfoWindow();
- isShowInfoWindow=false;
- }else{
- ViewoverlayButton=getLayoutInflater().inflate(
- R.layout.overlay,null);
- finalLatLngll=markerA.getPosition();
- /*
- *getProjection()获取地图投影坐标转换器,当地图初始化完成之前返回null,在
- *OnMapLoadedCallback.onMapLoaded()之后才能正常;
- *Projection接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换
- */
- /**
- *publicPointtoScreenLocation(LatLnglocation)
- *将地理坐标转换成屏幕坐标参数:location-地理坐标如果传入null则返回null返回:
- *屏幕坐标
- */
- Pointp=mBaiduMap.getProjection().toScreenLocation(ll);
- p.y-=40;
- LatLngllInfo=mBaiduMap.getProjection()
- .fromScreenLocation(p);
- OnInfoWindowClickListenerlistener=newOnInfoWindowClickListener(){
- @Override
- publicvoidonInfoWindowClick(){
- Toast.makeText(MainActivity.this,"悬浮物点击事件",
- Toast.LENGTH_SHORT).show();
- }
- };
- //InfoWindow在地图中显示一个信息窗口,可以设置一个View作为该窗口的内容,也可以设置一个
- //BitmapDescriptor作为该窗口的内容。
- mInfoWindow=newInfoWindow(overlayButton,llInfo,
- listener);
- mBaiduMap.showInfoWindow(mInfoWindow);
- isShowInfoWindow=true;
- }
- returnfalse;
- }
- });
- }
- 效果如下:
Demo源文件下载地址;
- 如果只是单纯想得到经纬度,则不必添加组件,前两步还是一样:
- //定位
- LocationClientmLocClient;
- publicMyLocationListennermyListener=newMyLocationListenner();
- privateLocationModemCurrentMode;
- BitmapDescriptormCurrentMarker;
- booleanisFirstLoc=true;//是否首次定位
- privateStringtvCityLatLng;
- privatevoidinitLocation(){
- //定位初始化
- mCurrentMode=LocationMode.NORMAL;
- mLocClient=newLocationClient(this);
- mLocClient.registerLocationListener(myListener);
- LocationClientOptionoption=newLocationClientOption();
- option.setOpenGps(true);//打开gps
- option.setCoorType("bd09ll");//设置坐标类型
- option.setScanSpan(1000);
- mLocClient.setLocOption(option);
- mLocClient.start();
- }
- 设置监听:
- publicclassMyLocationListennerimplementsBDLocationListener{
- @Override
- publicvoidonReceiveLocation(BDLocationlocation){
- if(location==null){
- return;
- }
- if(isFirstLoc){
- isFirstLoc=false;
- LatLngll=newLatLng(location.getLatitude(),
- location.getLongitude());
- <spanstyle="white-space:pre"></span>//这里我写成http网址形式,是之前用于发短信的,可以直接通过连接打开谷歌地图进行定位
- tvCityLatLng="http://ditu.google.cn/?q="
- +location.getLatitude()+","
- +location.getLongitude();
- System.out.println("首次定位坐标:"+tvCityLatLng);
- }
- }
- publicvoidonReceivePoi(BDLocationpoiLocation){
- }
- }
- 生命周期管理:
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- //退出时销毁定位
- mLocClient.stop();
- }
引用:http://blog.csdn.net/zxz_tsgx/article/details/38503917
推荐阅读:Eclipse软件问题-方案积累